在国内网络为 Ollama 部署本地大模型
适用场景
- 用户要"根据我的电脑配置推荐并安装一个本地大模型"
ollama pull速度只有几百 KB/s,要等几小时- 需要在 Windows + 消费级硬件(无独显 / 核显 / 16GB 内存)上落地中文模型
第 1 步:硬件体检(决定选型,不能跳过)
必须采集这 5 项,缺一不可:
# CPU / 内存 / 显卡
Get-CimInstance Win32_Processor | Select-Object Name,NumberOfCores,NumberOfLogicalProcessors
Get-CimInstance Win32_OperatingSystem | Select-Object @{n='总内存GB';e={[math]::Round($_.TotalVisibleMemorySize/1MB,2)}}
Get-CimInstance Win32_VideoController | Select-Object Name,@{n='显存GB';e={[math]::Round($_.AdapterRAM/1GB,2)}}
Get-CimInstance Win32_LogicalDisk -Filter "DriveType=3" | Select-Object DeviceID,@{n='可用GB';e={[math]::Round($_.FreeSpace/1GB,1)}}
关键:内存要用「真实可用」而非「总容量」
FreePhysicalMemory 只是 free,不含待机缓存;Ollama 实际能用的是 Available:
(Get-Counter '\Memory\Available MBytes').CounterSamples[0].CookedValue # 单位 MB
(Get-CimInstance Win32_OperatingSystem).FreePhysicalMemory # free,偏小
判断规则(无独显、纯 CPU 推理)
| 真实可用内存 | 推荐参数量 | 说明 |
|---|---|---|
| < 5 GB | 3B~4B(Q4) | 装完还得关浏览器才跑得动 |
| 5~9 GB | 4B~9B(Q4) | 稳妥区间 |
| > 10 GB | 9B~14B(Q4) |
> 教训:16GB 机器"按档位推荐 9B"是教科书答案,但实测当前可用只剩 4.5GB,硬上 9B 会立刻爆内存换页。以"当前真实可用内存"为准,不以总容量为准。
第 2 步:确认最新模型代际(别用旧清单)
模型代际更新极快,必须先联网核实当前最新一代,不要凭记忆报型号。用 ollama.com/library/<模型> 或直接查 registry:
# 校验 tag 是否真实存在 + 拿精确体积(manifest.list → 具体平台 manifest → 累加 layers)
curl -s --noproxy '*' -H "Accept: application/vnd.docker.distribution.manifest.list.v2+json" \
"https://registry.ollama.ai/v2/library/qwen3.5/manifests/4b"
ollama show <模型> 输出里的 Capabilities 会列出 tools / thinking / vision,context length 是原生上限(实际用 num_ctx 控制)。
第 3 步:高速下载 —— 核心技巧
先测速,用数据说话
# 官方 registry(Cloudflare)—— 国内通常 0.1~0.5 MB/s
curl -sL -o /dev/null -m 15 --noproxy '*' -r 0-20000000 \
-w "速度:%{speed_download} B/s\n" "https://registry.ollama.ai/v2/library/qwen3.5/blobs/<digest>"
# 魔搭 —— 通常 3~5.5 MB/s
curl -sL -o /dev/null -m 15 --noproxy '*' -r 0-20000000 \
-w "速度:%{speed_download} B/s\n" \
"https://modelscope.cn/models/unsloth/Qwen3.5-4B-GGUF/resolve/master/Qwen3.5-4B-Q4_K_M.gguf"
务必带 -L(魔搭会 302 跳到 CDN,不加 -L 只拿到跳转响应,测出"745 B/s"这种假数据)。
务必带 --noproxy '*' 做对照,用户可能挂着本地代理,代理对 CDN 未必更快。
已确认无效的路(别浪费时间)
- ❌
OLLAMA_REGISTRY/OLLAMA_REGISTRY_MIRROR环境变量 —— 非官方,实测不生效 - ❌
~/.ollama/config.json写{"registry":{"mirrors":{...}}}—— 非官方 - ❌
ollama pull modelscope.cn/...—— Ollama 不支持,二进制里根本没有modelscope字符串 - ❌ 改 hosts 指向镜像站 —— HTTPS 证书校验会失败
- ⚠️
HF_ENDPOINT—— Ollama 不读(二进制里搜不到),hf.co 拉取走不了 hf-mirror
> 验证某特性是否真存在,最快的办法是直接搜二进制字符串:
> grep -a -o -E "OLLAMA_[A-Z_]{3,}" ollama.exe | sort -u
有效路径:魔搭 GGUF → 导入 Ollama
- 找 GGUF。魔搭上
unsloth/<模型名>-GGUF是可靠选择(Qwen 系列官方常不发 GGUF)。查文件清单:
curl -s --noproxy '*' "https://modelscope.cn/api/v1/models/unsloth/Qwen3.5-4B-GGUF/repo/files?Revision=master&Root="
返回 JSON 里有每个文件的 Name / Size / Sha256(后面校验用)。
-
量化选型(纯 CPU):
Q4_K_M是标准答案;略追求质量可用UD-Q4_K_XL。 -
下载必须用「自动重连续传循环」。魔搭 CDN 会周期性
curl: (56) Recv failure: Connection was reset,单次 curl 哪怕带--retry也会中途失败。用脚本循环(见scripts/fetch_gguf_modelscope.py):
for ((i=0;i<80;i++)); do
SZ=$(stat -c%s "$F" 2>/dev/null || echo 0)
[ "$SZ" -ge "$TARGET" ] && break
curl -sL -C - --noproxy '*' --max-time 280 -o "$F" "$URL"
done
每次续传都在推进,几轮即可拉完。
- 校验 sha256(魔搭 API 给的
Sha256是权威值):
sha256sum "$F"; head -c 4 "$F" | xxd # 应为 GGUF 魔数 4747 5546
第 4 步:Modelfile 导入
写 Modelfile(FROM 用正斜杠绝对路径):
FROM C:/Users/<user>/.../Qwen3.5-4B-Q4_K_M.gguf
PARAMETER temperature 0.7
PARAMETER top_p 0.8
PARAMETER top_k 20
PARAMETER repeat_penalty 1.05
# 16GB 内存纯 CPU:8K 是稳妥上限
PARAMETER num_ctx 8192
ollama create qwen3.5:4b -f Modelfile
看到 success 即完成;GGUF 会被复制进 ~/.ollama/models/blobs。
注意:用 GGUF 文本权重导入会失去 vision 能力(官方 ollama 模型额外带一个 ~640MB 的 projector 层)。若必须多模态,只能走官方 ollama pull(慢)。
第 5 步:验证(必须实测推理,不能只看 list)
ollama list # 名称/大小
ollama show qwen3.5:4b # 架构/参数量/量化/能力
ollama ps # 是否加载、占用内存、是否 100% CPU
# 用 API 测真实速度(关键:首轮含加载,耗时不可信)
curl -s --noproxy '*' -X POST http://127.0.0.1:11434/api/generate \
-H "Content-Type: application/json" \
-d '{"model":"qwen3.5:4b","prompt":"你好","stream":false,"think":false,
"options":{"num_ctx":8192,"num_predict":256}}'
从返回里算:eval_count / (eval_duration/1e9) = tokens/s。
经验值(i5-11320H,4核8线程,纯 CPU,4B Q4_K_M):约 7.6 tokens/s,可用。
思考模式:Qwen3.5 默认走 thinking,会先输出一大段推理,token 消耗 2~3 倍且更慢。日常用加 "think": false 或在对话里用 /no_think。
常见坑(都踩过)
- Git Bash 会把
/VERYSILENT这类参数当路径转换 → 调用 Windows 程序时用 PowerShell,或加MSYS_NO_PATHCONV=1。 seq在部分 Git Bash 里权限被拒 → 用for ((i=0;i<n;i++))。- 后台长任务可能被中断 → 下载一律用续传循环,别指望一口气跑完。
- 临时文件写到
/tmp时 Python 报 No such file → Windows 版 Python 不认/tmp,一律用绝对 Windows 路径。 - 测速必须带
-L,否则测的是 302 跳转本身。 - 清理一律走回收站(
send2trash,路径需os.path.normpath规范化为反斜杠)。