为什么是「权重先行」而不是「引擎分工」

本地跑开源模型,多数人卡在第一步:模型文件从哪来、放在哪、下次换机器还能不能用。把权重当成固定资产先落地,推理引擎只是消费者,你就得到一条不依赖网络的 Token 供给线。

核心思路:

  1. 用 Ollama 拉取模型,但不要只依赖它默认的隐藏目录,而是显式设置 OLLAMA_MODELS 指向一个你掌控的路径。
  2. 用 ollama show --modelfile 与 ollama create 把已下载的权重导出成标准 GGUF / safetensors 引用。
  3. 用 vLLM 直接加载本地量化权重(AWQ / GPTQ / FP8),绕开在线下载。
  4. 把整个目录打成可迁移的「权重仓」,换机器、换网络环境都能直接起服务。

操作步骤

第一步:固定 Ollama 的模型仓库位置

```bash

export OLLAMA_MODELS=/data/ai-weights/ollama

mkdir -p "$OLLAMA_MODELS"

ollama pull qwen2.5:7b-instruct

ollama pull llama3.1:8b-instruct-q4_K_M

```

把 OLLAMA_MODELS 写进 shell profile 或 systemd unit 的 Environment=,否则重启后路径回落到默认目录,之前下的权重等于白下。

第二步:把权重导出成可复用文件

```bash

ollama show --modelfile qwen2.5:7b-instruct > qwen.modelfile

ollama create my-qwen -f qwen.modelfile

```

ollama show --modelfile 会打印出 FROM 指向的 blob 路径,这就是实际权重文件。把它复制到独立目录:

```bash

mkdir -p /data/ai-weights/blobs

cp "$OLLAMA_MODELS/blobs/sha256-*" /data/ai-weights/blobs/

```

做完这一步,即使删掉 Ollama 的索引,权重本体仍在,可被其他工具引用。

第三步:vLLM 加载本地量化权重

vLLM 支持直接指向本地目录,前提是目录里含 config.json、tokenizer* 与权重分片。Hugging Face 的 snapshot_download 可先把仓库拉到本地(只需一次联网):

```bash

huggingface-cli download Qwen/Qwen2.5-7B-Instruct-AWQ \

--local-dir /data/ai-weights/vllm/qwen2.5-7b-awq

```

启动服务:

```bash

python -m vllm.entrypoints.openai.api_server \

--model /data/ai-weights/vllm/qwen2.5-7b-awq \

--served-model-name qwen-local \

--quantization awq \

--gpu-memory-utilization 0.85 \

--max-model-len 8192 \

--port 8000

```

关键点:--model 给本地绝对路径,vLLM 就不会再访问网络。

第四步:显存核算(决定你能跑多大)

经验公式(7B 级模型):

  • FP16:约 14 GB 权重 + KV Cache
  • AWQ / GPTQ 4bit:约 4–5 GB 权重 + KV Cache
  • FP8:约 7–8 GB 权重 + KV Cache

--gpu-memory-utilization 0.85 是给 KV Cache 留余量,24 GB 卡跑 7B-AWQ 通常能开 8K 上下文;16 GB 卡建议 --max-model-len 4096。

第五步:接进现有工作流

vLLM 的 OpenAI 兼容端点意味着任何支持自定义 base_url 的客户端都能直连:

```bash

curl http://localhost:8000/v1/chat/completions \

-H "Content-Type: application/json" \

-d '{"model":"qwen-local","messages":[{"role":"user","content":"hello"}]}'

```

Ollama 侧则用 http://localhost:11434/v1 作为兼容入口。两者请求格式一致,客户端只需改 base_url 和 model 名。

注意事项

  • 量化格式必须匹配:vLLM 的 --quantization 必须与权重实际格式一致(awq / gptq / fp8),写错会直接报错或静默降级。
  • tokenizer 要同源:本地目录里的 tokenizer 必须与权重同仓库版本,混用会导致输出乱码。
  • 磁盘预算:一份 7B FP16 约 14 GB,量化版约 4–5 GB,多留几个模型很容易吃掉 100 GB 以上,建议单独挂盘。
  • Ollama 默认目录会被覆盖:不显式设置 OLLAMA_MODELS,升级或重装后权重可能被清空。
  • vLLM 版本与 CUDA 匹配:vLLM 对 CUDA 与 PyTorch 版本较敏感,升级前先在隔离环境验证。
  • 不是所有模型都有现成量化权重:冷门模型需自行量化,工具链(AutoAWQ、llm-compressor)有学习成本。

适用场景

  • 网络受限或按流量计费的环境(内网、边缘设备、离线实验室)。
  • 需要长期稳定、成本可预测的批量推理(数据清洗、批量摘要、Embedding 生成)。
  • 多台机器共享同一份权重仓,避免重复下载。
  • 对数据不出本地有硬性要求的合规场景。

限制

本地部署换来的「零边际成本」是有前提的:你得有 GPU、有电、有运维。模型能力上限取决于你下载的开源权重,与闭源旗舰模型仍有差距。上下文长度受显存约束,长文档任务需分片处理。