跳到主要内容

Qwen GGUF 量化对比实验

建议学时

2 学时。

建议安排:

课时内容产出
1准备 Q8/Q5/Q4 GGUF,统一实验变量模型清单和实验矩阵
2运行对比、填写速度/显存/质量记录量化选择结论

本实验对应理论章节:

学习目标

完成本实验后,学习者应能:

  • 用同一套条件比较 Qwen GGUF 的不同量化格式。
  • 观察文件大小、VRAM/RAM、首 token、tokens/s 和输出质量之间的取舍。
  • 解释为什么 Q4 文件更小但不一定在所有设备上都更快。
  • 在 Ubuntu Server 与 Jetson 上分别记录量化对比结果。
  • 建立“不预设 benchmark 数字,只记录真实设备数据”的实验习惯。

问题背景

Q8、Q5、Q4 等 GGUF 变体通常会带来不同的文件大小和运行特征。

但具体收益取决于:

  • 模型基座是否一致。
  • runtime 是否支持对应量化格式。
  • GPU offload 是否生效。
  • ctx-size 和 KV Cache 占用。
  • 目标设备是独立 GPU 还是 Jetson 统一内存。
  • 输出质量是否仍满足任务。

所以本实验不预置性能数字。

每位学员必须在自己的设备上记录结果。

实验边界

本实验只比较 GGUF 文件的运行表现。

不要求学员自己从原始权重重新量化。

如果课程提供了 Q8/Q5/Q4 文件,直接使用这些文件。

如果只拿到两个量化文件,也可以先比较两个,但实验报告中应说明缺失项。

不要把 .gguf 文件放进课程仓库。

图示讲解

KV Cache 和权重共同占用资源:

前置条件

已经完成:

需要准备:

项目要求
llama.cpp已构建,llama-cli 可运行
模型文件至少两个 Qwen GGUF 量化变体
日志目录~/edge-ai-lab/logs
结果目录~/edge-ai-lab/results
GPU 监控Ubuntu 用 nvidia-smi,Jetson 用 tegrastats

Step 1:列出模型文件

ls -lh ~/edge-ai-lab/models/qwen/*.gguf

把实际模型填入:

文件名量化格式文件大小来源备注
待填Q8待填待填待填
待填Q5待填待填待填
待填Q4待填待填待填

如果文件名中没有清晰量化信息,需要查模型来源页面或教师说明。

不要靠猜测填写。

Step 2:固定实验变量

量化对比必须尽量只改变模型量化格式。

变量建议固定值说明
prompt用三句话解释端侧模型量化的价值。与 baseline 一致
-n128固定生成长度
--ctx-size2048固定上下文
-ngl99尽量 GPU offload
采样参数默认或统一设置不要每次不同
运行目录~/edge-ai-lab/src/llama.cpp避免路径错误

如果设备内存不足,可以改成 --ctx-size 1024

但所有量化文件都要用同一个 ctx-size

Step 3:运行 Q8/Q5/Q4 对比

按实际文件名修改数组。

cd ~/edge-ai-lab/src/llama.cpp

for model in \
qwen2.5-1.5b-instruct-q8_0.gguf \
qwen2.5-1.5b-instruct-q5_k_m.gguf \
qwen2.5-1.5b-instruct-q4_k_m.gguf
do
./build/bin/llama-cli \
-m ~/edge-ai-lab/models/qwen/${model} \
-p "用三句话解释端侧模型量化的价值。" \
-n 128 \
-ngl 99 \
--ctx-size 2048 \
2>&1 | tee ~/edge-ai-lab/logs/${model}.log
done

如果只有两个模型:

for model in \
qwen2.5-1.5b-instruct-q8_0.gguf \
qwen2.5-1.5b-instruct-q4_k_m.gguf
do
./build/bin/llama-cli \
-m ~/edge-ai-lab/models/qwen/${model} \
-p "用三句话解释端侧模型量化的价值。" \
-n 128 \
-ngl 99 \
--ctx-size 2048 \
2>&1 | tee ~/edge-ai-lab/logs/${model}.log
done

Step 4:同步记录 GPU 或 Jetson 状态

Ubuntu Server:

watch -n 0.5 nvidia-smi

可在每次运行前后保存:

nvidia-smi > ~/edge-ai-lab/results/nvidia-smi-quantization.txt

Jetson:

tegrastats --interval 1000 | tee ~/edge-ai-lab/logs/jetson-quantization-tegrastats.txt

记录重点:

平台重点
Ubuntu Server峰值显存、是否看到进程、GPU 使用变化
JetsonRAM、GPU/GR3D、温度、功耗模式、是否降频

Step 5:整理性能字段

从每个日志中提取:

  • 模型加载是否成功。
  • prompt eval 或 prefill 时间。
  • eval 或 decode 速度。
  • tokens/s。
  • warning、fallback、OOM、unsupported 等异常。
  • 输出文本。

如果字段名称随 llama.cpp 版本不同,以实际日志为准。

不要把没有出现的字段硬填。

Step 6:质量对比

用同一 prompt 比较输出。

建议从以下维度记录:

维度记录方式
是否回答问题是/否/部分
是否满足“三句话”是/否/大致
是否概念正确简短说明
是否重复无/轻微/严重
是否有格式问题简短说明
中文是否自然简短说明

不要只看速度。

低比特模型如果输出质量明显下降,就需要在结论中说明。

结果记录表

硬件模型文件量化文件大小ctx-size-ngl首 token / prefilltokens/s峰值内存/显存温度/功耗质量备注日志
Ubuntu Server待填Q8待填待填待填待填待填待填待填待填待填
Ubuntu Server待填Q5待填待填待填待填待填待填待填待填待填
Ubuntu Server待填Q4待填待填待填待填待填待填待填待填待填
Jetson待填Q4待填待填待填待填待填待填待填待填待填

Step 7:写部署选择结论

结论不需要很长,但必须回答:

  1. 当前设备上哪个量化格式最适合?
  2. 它的优势是什么?
  3. 它的风险是什么?
  4. 是否有质量下降?
  5. 如果换成 Jetson,结论是否可能变化?

示例结构:

在本设备上,暂时推荐使用 ______。
原因是 ______。
不推荐 ______,因为 ______。
如果部署到 Jetson,需要重新验证 ______。

验收结果

产物验收标准
模型清单至少两个 GGUF 量化变体,最好包含 Q8/Q5/Q4
原始日志每个模型有独立日志
资源记录Ubuntu 有 nvidia-smi,Jetson 有 tegrastats
结果表文件大小、速度、内存、质量备注尽量完整
结论能说明推荐格式和不推荐原因

失败排查

某个 GGUF 无法加载

检查:

  • 文件是否下载完整。
  • 文件名是否写错。
  • llama.cpp 版本是否过旧。
  • 模型是否需要特殊 chat template。

Q4 输出明显变差

处理:

  • 对比 Q5 或 Q8。
  • 固定 prompt 重跑一次。
  • 检查是否采样参数不同。
  • 不要为了速度强行选择不可用输出。

Q8 无法在 Jetson 上运行

可能原因:

  • 模型权重和 KV Cache 超出统一内存预算。
  • ctx-size 太大。
  • 系统进程占用内存较多。

处理:

  • 降低 ctx-size
  • 使用 Q5 或 Q4。
  • 选择更小模型。

速度差异不明显

可能原因:

  • 瓶颈不在权重读取。
  • GPU offload 不充分。
  • 低比特 kernel 没有带来计算收益。
  • prompt 太短,测不出差异。

处理:

  • 推理加速实验-nglctx-size 对比。
  • llama-bench 补充标准化记录。

作业

提交量化对比记录,包含:

  1. 模型清单。
  2. 每个模型的原始日志路径。
  3. 结果表。
  4. 一段部署选择结论。
  5. 如果有 Jetson 设备,补充 Jetson 上至少一个量化文件的运行记录。

参考资料