Skip to content

采样、量化与部署 — 练习

练习 1:量化模型对比

将同一个模型分别量化为 Q4_0、Q5_1、Q8_0,对比文件大小和推理速度。

参考答案
bash
# 量化
./llama-quantize model-F16.gguf model-Q4_0.gguf Q4_0
./llama-quantize model-F16.gguf model-Q5_1.gguf Q5_1
./llama-quantize model-F16.gguf model-Q8_0.gguf Q8_0

# 性能测试
./llama-bench -m model-Q4_0.gguf
./llama-bench -m model-Q5_1.gguf
./llama-bench -m model-Q8_0.gguf

预期观察:

  • Q4_0 最快、最小,但质量损失最大
  • Q8_0 接近 F16 质量,但体积约为 F16 的一半
  • 推理速度主要受内存带宽限制,更小的量化 → 更快

练习 2:自定义采样器配置

使用 llama-cli 的参数配置不同的采样策略,观察生成结果的差异。

参考答案
bash
# 贪心解码(确定性)
./llama-cli -m model.gguf --temp 0 -p "The meaning of life is"

# 高温度(更随机)
./llama-cli -m model.gguf --temp 1.5 -p "The meaning of life is"

# 保守采样
./llama-cli -m model.gguf --temp 0.3 --top-k 10 --top-p 0.9 -p "The meaning of life is"

# Mirostat
./llama-cli -m model.gguf --mirostat 2 --mirostat-lr 5 -p "The meaning of life is"

练习 3:启动 llama-server 并调用 API

启动 llama-server,使用 curl 调用 chat completion API。

参考答案
bash
# 启动服务器(后台)
./llama-server -m model.gguf --port 8080 &

# 调用 API
curl -s http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{
    "messages": [
      {"role": "system", "content": "You are a helpful assistant."},
      {"role": "user", "content": "What is llama.cpp?"}
    ],
    "temperature": 0.7,
    "max_tokens": 200
  }' | jq .

# 流式响应
curl -s http://localhost:8080/v1/chat/completions \
  -H "Content-Type: application/json" \
  -d '{"messages":[{"role":"user","content":"Hello"}],"stream":true}'

拓展挑战

  • 使用 imatrix 优化量化质量,对比有无 imatrix 的 perplexity 差异
  • 配置 Grammar 约束输出为 JSON 格式
  • 使用 llama-server 的多 slot 功能实现并发推理
  • 对比不同量化级别在特定任务(如代码生成)上的表现差异