☰
将Qwen1.8B量化成GGUF:llama.cpp配置与验证全流程
2026/9/27 22:35:20 网站建设 项目流程

1. 为什么要把 Qwen1.8B 转成 GGUF

Qwen1.8B 是通义千问系列里体积最小的对话模型之一,参数量只有 18 亿,中文能力在 3B 以下这个档位里相当能打。但直接拿 HuggingFace 的原始权重跑推理,对显存和内存的要求并不低,普通笔记本或者没有独显的机器很难受。GGUF 是 llama.cpp 主推的一种模型文件格式,它把权重、词表、超参数打包进单个文件,配合 llama.cpp 的 C/C++ 推理后端,可以在 CPU 上跑得比较流畅,也能按需做 4-bit、5-bit、8-bit 量化,把模型压到几百 MB 到 1GB 出头。

这篇要解决的就是一条完整链路:拿到 Qwen1.8B 的 HuggingFace 权重,用 llama.cpp 的转换脚本转成 FP16 的 GGUF,再量化成 q4_0 之类的低比特版本,最后用 llama.cpp 加载验证推理确实能出结果。适合手里有一台 Linux 机器、想本地跑中文小模型、又不想折腾 CUDA 环境的人。整个过程不需要显卡,CPU 就能完成转换和推理。

我试过在 16GB 内存的机器上跑完整流程,从 clone 仓库到量化出 q4_0 文件大概十几分钟,主要时间花在编译和转换上。下面把每一步拆开讲,命令都可以直接复制。

2. 环境准备与 llama.cpp 编译

2.1 依赖与 Python 版本

llama.cpp 的转换脚本是 Python 写的,官方 requirements.txt 里列了 torch、numpy、sentencepiece 这些。Python 建议 3.10,太新的版本有时候 torch 轮子还没跟上,太老的又可能缺类型标注。先建个虚拟环境,避免污染系统 Python:

python3.10 -m venv venv source venv/bin/activate pip install --upgrade pip

然后 clone 仓库并安装依赖。注意 llama.cpp 更新很快,转换脚本的接口偶尔会变,建议用当天最新的 main 分支:

git clone https://github.com/ggerganov/llama.cpp cd llama.cpp pip install -r requirements.txt

requirements.txt 里如果某个包装不上,直接按报错单独 pip install 对应版本即可,不用死磕。编译部分用 cmake,生成 quantize 等可执行文件:

mkdir build cd build cmake .. cmake --build . --config Release cd ..

编译完成后,build/bin 目录下会出现 quantize、main 等可执行文件。如果 cmake 报找不到编译器,先装 build-essential(Ubuntu/Debian)或者 gcc-c++(CentOS)。这一步不需要 CUDA,纯 CPU 编译即可。

2.2 下载 Qwen1.8B 权重

权重从 HuggingFace 拉,用 git-lfs 或者 huggingface-cli 都行。这里用 git-lfs 举例:

git lfs install git clone https://huggingface.co/Qwen/Qwen-1_8B-Chat

下载完确认目录里有 config.json、tokenizer.json、pytorch_model.bin 这些文件。Qwen-1_8B-Chat 是对话版本,带 chat 模板,转 GGUF 后 llama.cpp 能识别它的对话格式。

3. 转 FP16 GGUF 与量化命令

3.1 用 convert-hf-to-gguf.py 转 FP16

关键点:Qwen 必须用 convert-hf-to-gguf.py,不能用老的 convert.py。老脚本对 Qwen 的词表和结构支持不全,转出来加载会报错。命令如下:

python convert-hf-to-gguf.py ../Qwen-1_8B-Chat

脚本会在权重目录下生成 ggml-model-f16.gguf。这个文件是 FP16 精度,体积大约是原始 pytorch_model.bin 的一半多一点。如果只需要 FP16 版本,到这一步就结束了,可以直接用 llama.cpp 加载。

转换过程中如果报 KeyError 或者 shape mismatch,大概率是 llama.cpp 版本和 Qwen 权重版本对不上。先 git pull 更新 llama.cpp,再重新跑转换脚本。

3.2 量化成 q4_0

FP16 的 GGUF 还是偏大,Qwen1.8B 的 FP16 大概 3.5GB 左右。用 build/bin/quantize 做 4-bit 量化:

./build/bin/quantize ../Qwen-1_8B-Chat/ggml-model-f16.gguf ../Qwen-1_8B-Chat/ggml-model-q4_0.gguf q4_0

q4_0 是最常用的 4-bit 量化类型,兼容性好,体积能压到 1GB 出头。llama.cpp 还支持 q4_K_M、q5_K_M 等 K-quant 类型,质量更高但体积略大。Qwen1.8B 这种小模型,q4_0 和 q4_K_M 的差距不算明显,先用 q4_0 跑通再说。

量化完成后,目录下会多出 ggml-model-q4_0.gguf。可以用 ls -lh 看下体积,正常应该在 1GB 到 1.2GB 之间。

3.3 config.toml 骨架

如果你用 llama.cpp 的 server 模式或者某些封装工具,会需要一个 config.toml 来指定模型路径和推理参数。下面是一个可复制的骨架:

[model] path = "./Qwen-1_8B-Chat/ggml-model-q4_0.gguf" n_ctx = 2048 n_threads = 8 n_batch = 512 [chat] template = "qwen" system_prompt = "You are a helpful assistant." [server] host = "127.0.0.1" port = 8080

n_ctx 是上下文长度,Qwen1.8B 支持到 8192,但本地跑 2048 够用,显存/内存占用更小。n_threads 按你机器的物理核心数填,一般设成核心数或者核心数减一。

4. 加载验证与推理测试

4.1 用 main 做单次推理

编译出来的 build/bin/main 可以直接加载 GGUF 做命令行推理:

./build/bin/main -m ../Qwen-1_8B-Chat/ggml-model-q4_0.gguf -p "你好,介绍一下你自己" -n 128 --temp 0.7

参数说明:-m 指定模型文件,-p 是 prompt,-n 是生成的最大 token 数,--temp 是温度。跑起来后终端会先打印加载信息,然后逐 token 输出结果。如果看到中文正常输出,说明转换和量化都成功了。

4.2 用 server 模式做接口验证

如果想用 HTTP 接口调用,启动 server:

./build/bin/server -m ../Qwen-1_8B-Chat/ggml-model-q4_0.gguf --host 127.0.0.1 --port 8080 -c 2048

然后另开终端用 curl 测试:

curl http://127.0.0.1:8080/completion \ -H "Content-Type: application/json" \ -d '{"prompt": "用一句话解释什么是量化", "n_predict": 64}'

返回 JSON 里 choices 字段就是模型输出。如果返回空或者报错,先检查模型路径和端口是否被占用。

4.3 验证成功的判断标准

一次成功的转换加验证,应该满足这几点:FP16 GGUF 能加载不报错;q4_0 量化文件体积在预期范围;main 或 server 能输出连贯中文;对话模板生效,模型能理解多轮上下文。如果输出乱码或者重复,多半是量化类型和模型结构不匹配,换 q4_K_M 再试。

5. 常见报错与排查

5.1 convert 脚本报 KeyError: 'qwen'

这是 llama.cpp 版本太老,不认识 Qwen 的模型类型。git pull 更新到最新 main 分支,重新编译再跑转换脚本。如果更新后还报,检查权重目录里的 config.json 里 model_type 是不是 qwen。

5.2 quantize 报 unsupported type

量化类型写错了。llama.cpp 支持的量化类型有 q4_0、q4_1、q5_0、q5_1、q8_0 以及各种 K-quant。命令最后那个参数必须和 build/bin/quantize 支持的列表一致,可以先跑 ./build/bin/quantize --help 看支持哪些。

5.3 加载模型时报 magic number 错误

GGUF 文件损坏或者转换中断。删掉重新转,确保转换过程中磁盘空间足够。FP16 转换需要临时空间,至少留出权重体积两倍的空余。

5.4 推理输出重复或乱码

温度设太高或者量化损失太大。把 --temp 降到 0.3 到 0.7 之间,或者换 q5_K_M 量化。Qwen1.8B 本身参数量小,q4_0 在复杂任务上确实会掉点,日常对话够用。

5.5 server 启动后 curl 无响应

检查 host 和 port 是否和启动参数一致,防火墙是否放行。如果 server 日志显示 model loaded 但请求超时,可能是 n_ctx 设太大导致内存不足,降到 1024 再试。

6. 接入与后续使用建议

转换出来的 GGUF 文件是通用的,llama.cpp、llama-cpp-python、以及各种基于 llama.cpp 的本地工具都能加载。如果你后续想把这套流程接到更自动化的编码或 Agent 场景里,可以关注 TaoToken 的 Coding Plan,它面向长期编码和 Agent 任务,省去自己维护推理服务的麻烦。需要单独申请 API Key 的话,在 API Keys 页面创建即可,接入文档里有各语言的调用示例。想先在线对比一下 Qwen 系列模型的输出效果,可以直接用模型对话页面试几个 prompt,确认量化后的表现是否符合预期。

整个流程跑通一次之后,换其他模型也是同样的套路:改权重路径、改 convert 脚本参数、改量化类型。Qwen1.8B 因为体积小,特别适合拿来练手,把 GGUF 转换和 llama.cpp 加载的每个环节都摸清楚,后面上更大的模型就不会慌。

需要专业的网站建设服务?

联系我们获取免费的网站建设咨询和方案报价,让我们帮助您实现业务目标

立即咨询