1. 4GB 显存跑 72B 模型到底卡在哪通义千问2.5 72B 是当前开源模型里参数规模靠前的一档80 层 Transformer、720 亿参数FP16 权重文件加起来接近 145GB。你手上那块 4GB 显存的老显卡连模型的一个零头都装不下——按纯显存装载算大概需要 36 到 37 块同规格显卡才能把权重全塞进去。所以「4GB 本地跑通 72B」这件事本质不是把模型塞进显存而是换一种加载思路让权重留在内存或磁盘显存只负责当前正在计算的那一层。这就是分层推理layer-wise inference的核心。模型有 80 层推理时按顺序一层一层加载进显存算完立刻释放再加载下一层。任意时刻显存里只有一层的权重4GB 完全够用。代价是速度——每层都要从内存搬运到显存PCIe 带宽成了瓶颈单次对话可能要几十秒到几分钟。所以它适合异步批处理、离线数据清洗、夜间跑任务不适合做实时聊天机器人。这篇要交付的东西很具体一套能在 4GB 显存设备上把 Qwen2.5-72B-Instruct 跑起来的量化加载参数、显存占用监控命令以及用 TaoToken 统一 Key 接入本地推理服务的 config.toml 骨架和连通性验证动作。目标是在 4GB 显存下完成一次完整对话请求拿到模型返回的文本。适合谁手上有老显卡、想验证大模型本地可行性、又不想立刻买新硬件的开发者。2. 前置准备TaoToken 统一 Key 与本地推理服务的关系这里要先理清一个容易混淆的点。分层推理解决的是「模型怎么加载进 4GB 显存」TaoToken 解决的是「推理服务怎么被统一调用」。两者是配合关系不是替代关系。本地跑起来的 Qwen2.5-72B 是一个推理后端它对外暴露一个 HTTP 接口通常是 OpenAI 兼容格式。TaoToken 提供统一的 API Key 和接入地址让你用同一套配置去调用不同来源的模型服务——包括你本地起的这个后端。这样你在写业务代码时不用为「本地模型」和「云端模型」维护两套调用逻辑切换只改 config.toml 里的 base_url 和 model 字段。TaoToken 官网入口在 https://taotoken.net/?utm_sourcetaotoken_aicg_blog_endutm_mediumcsdnutm_campaignrewriteutm_content API 接入地址是 https://taotoken.net/api 。你需要先去控制台创建一个 API Key这个 Key 后面会写进 config.toml。创建 Key 的入口在 https://taotoken.net/console?utm_sourcetaotoken_aicg_blog_endutm_contentconsoleutm_campaignrewrite 文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 。注意TaoToken 是统一接入层不是模型本身。本地推理服务负责算TaoToken 负责把请求路由过去。两者缺一不可。如果你只是想先验证模型能不能通不想折腾本地部署可以直接用模型对话页面测一下https://taotoken.net/models?utm_sourcetaotoken_aicg_blog_endutm_contentmodelsutm_campaignrewrite 。但本篇的重点是本地 4GB 跑通所以下面进入实操。3. 可复制配置量化加载参数与 config.toml 骨架3.1 环境与依赖先确认你的环境。Python 3.10 以上PyTorch 装 CUDA 版本哪怕显卡老也要装对应 CUDA 的 torch。分层推理依赖 airllm 这类库它会把模型按层拆分逐层加载。pip install torch --index-url https://download.pytorch.org/whl/cu121 pip install airllm transformers accelerate如果你的显存只有 4GB建议用 4bit 量化加载进一步压低单层显存占用。量化配置写在加载参数里from airllm import AutoModel MAX_LENGTH 128 model AutoModel.from_pretrained( Qwen/Qwen2.5-72B-Instruct, compression4bit, # 4bit 量化单层显存占用降到 1GB 以内 profiling_modeFalse, # 关闭 profiling减少额外显存开销 layer_shards_saving_path./qwen72b_shards, # 分层缓存目录避免重复拆分 )关键参数说明compression4bit是 4GB 显存能跑起来的前提FP16 单层就要 1.8GB 左右加上激活值和 KV cache 容易爆layer_shards_saving_path指定一个磁盘目录第一次加载会把 80 层拆成独立文件缓存下来后续启动直接读缓存省掉重复拆分的时间。3.2 显存占用监控命令跑之前先开一个终端盯显存确认每层加载时峰值不超过 4GBwatch -n 0.5 nvidia-smi --query-gpumemory.used,memory.total,utilization.gpu --formatcsv这条命令每 0.5 秒刷新一次输出已用显存、总显存、GPU 利用率。正常分层推理时你会看到显存占用在 1GB 到 3.5GB 之间波动每加载一层冲高一次算完回落。如果持续顶到 4GB 不降说明量化没生效或 KV cache 太大需要把 MAX_LENGTH 再调小。3.3 config.toml 骨架本地推理服务起来后用 TaoToken 统一 Key 接入。下面这份 config.toml 可以直接复制改掉 api_key 和本地服务端口即可[llm] provider taotoken api_key sk-你的TaoToken密钥 base_url https://taotoken.net/api model Qwen/Qwen2.5-72B-Instruct max_tokens 256 temperature 0.7 timeout 600 # 分层推理慢超时给足 10 分钟 [local_backend] enabled true host 127.0.0.1 port 8000 endpoint /v1/chat/completions [monitor] log_gpu true log_interval 5timeout这个字段别省。4GB 分层推理单次请求动辄几分钟默认 30 秒超时必然失败。base_url指向 TaoToken 的 API 地址model字段填你本地加载的模型标识TaoToken 会按这个标识路由。4. 验证请求从本地服务到完整对话返回4.1 启动本地推理服务把上面的加载代码包一层 FastAPI暴露 OpenAI 兼容接口from fastapi import FastAPI from pydantic import BaseModel from airllm import AutoModel app FastAPI() model AutoModel.from_pretrained( Qwen/Qwen2.5-72B-Instruct, compression4bit, layer_shards_saving_path./qwen72b_shards, ) class ChatRequest(BaseModel): messages: list max_tokens: int 256 app.post(/v1/chat/completions) def chat(req: ChatRequest): prompt req.messages[-1][content] tokens model.tokenizer( [prompt], return_tensorspt, return_attention_maskFalse, truncationTrue, max_length128, paddingFalse, ) out model.generate( tokens[input_ids].cuda(), max_new_tokensreq.max_tokens, use_cacheTrue, return_dict_in_generateTrue, ) text model.tokenizer.decode(out.sequences[0]) return {choices: [{message: {role: assistant, content: text}}]}启动命令uvicorn server:app --host 127.0.0.1 --port 80004.2 连通性验证先用 curl 直接打本地服务确认模型能出字curl -X POST http://127.0.0.1:8000/v1/chat/completions \ -H Content-Type: application/json \ -d {messages:[{role:user,content:用一句话说明什么是分层推理}],max_tokens:64}预期结果是返回一段 JSONchoices 里带模型生成的文本。第一次请求会触发分层加载耗时较长耐心等。如果返回空或报错看下一节的排查。本地通了之后再用 TaoToken 的 Key 走一遍统一入口验证 config.toml 配置正确curl -X POST https://taotoken.net/api/v1/chat/completions \ -H Authorization: Bearer sk-你的TaoToken密钥 \ -H Content-Type: application/json \ -d {model:Qwen/Qwen2.5-72B-Instruct,messages:[{role:user,content:你好}],max_tokens:32}这一步返回正常说明 TaoToken 统一 Key 已经能正确路由到你的本地推理后端。整个链路打通请求 → TaoToken → 本地 4GB 分层推理 → 返回文本。5. 本篇常见错排查显存 OOM报 CUDA out of memory。最常见。先确认 compression4bit 真的生效打印 model 的量化配置看一眼。再把 MAX_LENGTH 从 128 降到 64KV cache 占用和序列长度成正比。如果还爆检查是不是有其他进程占着显存nvidia-smi 看一遍。请求超时curl 卡住不动。分层推理慢是正常的但卡死通常是 timeout 设太短。config.toml 里 timeout 给到 600 秒。另外确认本地服务没有在第一次加载时反复拆分模型——layer_shards_saving_path 目录如果每次启动都重建说明缓存没命中检查目录权限。TaoToken 返回 401 或 403。API Key 写错或没带 Bearer 前缀。检查 config.toml 里 api_key 字段以及 curl 的 Authorization 头格式。Key 在控制台重新生成一次对比。返回文本乱码或截断。tokenizer 的 max_length 和 generate 的 max_new_tokens 不匹配。输入截断到 128输出最多 256两者独立。如果输出到一半停了看是不是 max_new_tokens 太小。本地服务通了TaoToken 路由失败。检查 base_url 是否写成 https://taotoken.net/api model 字段是否和本地加载的模型标识一致。TaoToken 按 model 字段路由写错就找不到后端。6. 后续怎么用统一 Key 的长期价值4GB 跑通 72B 这件事验证价值大于生产价值。它证明分层推理这条路在极低显存下可行但速度决定了它只能做异步任务。真正日常用起来更实际的做法是把本地小模型和 TaoToken 上的云端模型混用简单任务走本地复杂任务走统一 Key 调云端config.toml 里改一个 model 字段就切换。如果你后面要长期做编码类任务或者搭 Agent建议看一下 Coding Planhttps://taotoken.net/coding-plan?utm_sourcetaotoken_aicg_blog_endutm_contentcoding-planutm_campaignrewrite 。它针对长时间、多轮次的编码场景做了额度优化比按次调用划算。API Key 管理在 https://taotoken.net/api-keys?utm_sourcetaotoken_aicg_blog_endutm_contentapi-keysutm_campaignrewrite 接入文档在 https://taotoken.net/doc?utm_sourcetaotoken_aicg_blog_endutm_contentdocutm_campaignrewrite 遇到接入问题先翻文档大部分报错都有对应说明。最后留一个实测经验分层推理的第一次请求一定要留足时间别在第一次就判定失败。模型拆层缓存建好之后后续请求会快不少。4GB 的卡跑 72B慢是必然的但能跑通本身就是一种确认——确认你的硬件没被时代甩下确认统一接入层能让老设备继续发挥作用。
