4.2 从原始权重到 INT4 量化文件的一步步入门实操 读者读完这节,能带走的结论 拿到官方原始权重后,照着「转换 → 量化 → 验证 → 运行」四步走,你就能在自己的机器上得到一个能对话的 INT4 模型。其中第三步「验证」最容易被省略,但它恰恰是你敢不敢放心用这个模型的底线。 4.1 把地基打好了:显存账本算清、GGUF + llama.cpp 路线选定、工具链装齐。这一节我们真刀真枪走完流程。所有命令都是真实可参考的结构,但工具版本迭代快,具体参数以你本机对应工具的 为准——我不替你编造任何一次运行输出。 一、拿到原始权重:safetensors 与分词器 起点是官方发布的原始权重,通常以 safetensors 分片形式提供(多个 文件 + 配置文件 + 分词器文件)。
拿到官方原始权重后,照着「转换 → 量化 → 验证 → 运行」四步走,你就能在自己的机器上得到一个能对话的 INT4 模型。其中第三步「验证」最容易被省略,但它恰恰是你敢不敢放心用这个模型的底线。
4.1 把地基打好了:显存账本算清、GGUF + llama.cpp 路线选定、工具链装齐。这一节我们真刀真枪走完流程。所有命令都是真实可参考的结构,但工具版本迭代快,具体参数以你本机对应工具的 --help 为准——我不替你编造任何一次运行输出。
起点是官方发布的原始权重,通常以 safetensors 分片形式提供(多个 .safetensors 文件 + 配置文件 + 分词器文件)。获取渠道以官方发布说明为准,请走正规来源,不要从不明镜像拉权重——权重文件一旦被篡改,本地推理的安全性和正确性都没法保证。
拿到后先别急,确认目录里有:
.safetensors 分片这些齐了,转换脚本才能把「权重 + 分词器 + 模板」一起打包进 GGUF。
转换脚本把你拿到的 safetensors 变成未量化的 F16 GGUF。为什么要先转 F16 再量化?因为量化工具吃的是 GGUF 格式,转换是「统一入口」——无论上游是哪种发布格式,先归一成 F16 GGUF,后续量化工序就统一了。
参考命令结构(参数名以本机版本为准):
python convert.py <原始权重目录> --outfile model_f16.gguf
转换完会得到一个体积约等于「原始权重一半左右」的 F16 GGUF(因为 F16 比训练用的 FP32 小一半)。这是量化的原料。
现在请出主角 llama-quantize。它会把 F16 GGUF 压成 INT4 档位。档位怎么选?回顾第 3 章的「甜点区」结论:Q4_K_M 通常是质量与体积的最佳折中——它对敏感层用更高精度、对普通层用更低精度(混合精度),在肉眼可辨质量损失很小的前提下把体积压到最低。
参考命令结构(参数名以本机版本为准):
./llama-quantize model_f16.gguf model_q4_k_m.gguf q4_k_m
量化完成后,.gguf 文件体积通常降到 F16 版本的约四分之一,这正是 INT4 的威力。如果你显存特别紧,可以往后退到 Q3_K / Q2_K;如果显存宽松且想保质量,可以前进到 Q5_K / Q6_K——但第一次,请先用 Q4_K_M 这个甜点档跑通整条链路。
这一步最容易被跳过,但我不建议你跳。 量完不验证,你永远在赌「压完没坏」。最低成本的验证是困惑度(PPL,第 3 章讲过):PPL 越低,模型对测试文本的「意外程度」越低,说明语言能力保留得越好。把量化前后的 PPL 放一起比,涨幅在可接受范围(通常个位数百分比)就放心用。
参考命令结构(参数名以本机版本为准):
./llama-perplexity -m model_q4_k_m.gguf -f test.txt
解读:记下 F16 基线和 Q4_K_M 的 PPL 数值,算涨幅。如果涨幅很小(比如 2%~5%),说明 INT4 没伤到语言核心能力,可以放心;如果暴涨(比如翻倍),说明量化档位太激进了,退到 Q5_K_M 重来。这一步花几分钟,却能避免你后来对着一堆胡言乱语怀疑人生。
验证通过,就可以跑了。两种常见形态:
参考命令结构(参数名以本机版本为准):
# 命令行直接对话 ./llama-cli -m model_q4_k_m.gguf -p "你好,介绍一下你自己" # 或起本地服务器 ./llama-server -m model_q4_k_m.gguf --host 127.0.0.1 --port 8080
跑起来后,问它几个问题,感受一下速度和答案质量。如果明显比预期慢,回到第 3 章的「速度双指标」(首字延迟 / 吞吐)去定位——多半是层没充分 offload 到 GPU,或上下文开太大。
| 现象 | 可能原因 | 排查方向 |
|---|---|---|
| 量化时提示文件不存在 | 转换没成功 / 路径错 | 先确认 F16 GGUF 已产出且路径正确 |
| 推理慢如龟 | 没用上 GPU 后端 | 检查编译选项与 offload 层数 |
| 一问就胡言乱语 | 量化档位太激进 | 退到 Q5_K_M,重测 PPL |
| 显存爆了 | 上下文太大 / 模型超显存 | 降上下文,或换更小模型 / 更激进档位 |
| 对话语气不对 | 对话模板没带对 | 确认分词器与模板随权重一起进了 GGUF |
走完这四步,你已经亲手把一份官方原始权重变成了能在本机对话的 INT4 模型。回看整条链路:转换统一入口 → 量化压体积(Q4_K_M 甜点)→ 困惑度兜底验证 → 运行交付。这套流程换个模型、换张卡依然成立,是你可以反复使用的「部署肌肉记忆」。
下一步,第 5 章会带你跳出单次部署,回看整本书的方法论,做总结与展望——但在这之前,我强烈建议你把 4.1、4.2 真的在机器上走一遍。量化这东西,看十遍不如自己压一个、看一眼它吐出的字。
Q:可以跳过 F16 中间文件,直接量化吗?
A:不建议。先转 F16 是统一入口,能规避上游格式差异带来的坑;而且 F16 还充当了你做 PPL 基线对比的「干净参照」。
Q:Q4_K_M 和 Q4_0 有什么区别?
A:Q4_0 是简单均匀 INT4;Q4_K_M 是混合精度(对敏感层保留更多精度),通常质量更好、体积相近。第一次部署优先 Q4_K_M。
Q:量化一次要多久?
A:取决于模型规模和磁盘速度,小模型几分钟、大模型可能更久。这是一次性成本,量化完后可反复使用成品,不必每次重压。