主题
📦 模型量化与优化
训好了,太大了——怎么把 14GB 模型压到 4GB 还不影响效果?
为什么需要量化
模型默认用 FP16(16-bit浮点数)存储,7B 模型约 14GB。量化就是把 16-bit 压到 8-bit、4-bit,体积成倍缩小。
| 精度 | 7B 模型大小 | 显存需求 |
|---|---|---|
| FP32 | 28GB | 32GB+ |
| FP16 | 14GB | 16GB+ |
| INT8 | 7GB | 8GB+ |
| INT4 | 3.5GB | 6GB+ |
量化方式对比
| 方式 | 质量 | 速度 | 适用 |
|---|---|---|---|
| GPTQ | 好 | 快 | GPU 推理首选 |
| AWQ | 好 | 快 | GPU 推理,比 GPTQ 更稳定 |
| bitsandbytes 4-bit | 中 | 慢 | 微调时省显存(QLoRA) |
| GGUF (llama.cpp) | 好 | 中 | CPU 推理 / Ollama |
用 AutoGPTQ 量化
bash
pip install auto-gptq optimumpython
from transformers import AutoModelForCausalLM, AutoTokenizer
from auto_gptq import AutoGPTQForCausalLM, BaseQuantizeConfig
model_name = "./qwen-contract-merged"
output_dir = "./qwen-contract-gptq-4bit"
# 量化配置
quant_config = BaseQuantizeConfig(
bits=4, # 4-bit
group_size=128, # 分组大小
desc_act=False, # 是否使用描述激活
)
# 加载模型
model = AutoGPTQForCausalLM.from_pretrained(model_name, quant_config)
tokenizer = AutoTokenizer.from_pretrained(model_name)
# 准备校准数据(几百条就够了)
calibration_data = [
tokenizer("审查以下合同条款:甲方应承担..." )
]
# 开始量化
model.quantize(calibration_data)
# 保存
model.save_quantized(output_dir)
tokenizer.save_pretrained(output_dir)转 GGUF 给 Ollama 用
bash
# 安装 llama.cpp
git clone https://github.com/ggerganov/llama.cpp
cd llama.cpp && make
# 把 HuggingFace 模型转成 GGUF
python convert_hf_to_gguf.py ../qwen-contract-merged \
--outtype q4_k_m \
--outfile qwen-contract-q4km.gguf
# 创建 Ollama Modelfile
cat > Modelfile << 'EOF'
FROM ./qwen-contract-q4km.gguf
TEMPLATE """<|im_start|>system
{{ .System }}<|im_end|>
<|im_start|>user
{{ .Prompt }}<|im_end|>
<|im_start|>assistant
"""
PARAMETER temperature 0.7
PARAMETER top_p 0.8
EOF
# 导入 Ollama
ollama create contract-reviewer -f Modelfile
# 测试
ollama run contract-reviewer "审查合同:违约金每日千分之五"量化后的质量检查
量化不是无损的,必须验证:
python
# 拿同一条输入,比较量化前后的输出
test_prompt = "审查以下合同条款的合规性和风险点:..."
# 原始模型
output_original = original_model.generate(...)
# 量化模型
output_quantized = quantized_model.generate(...)
# 人工对比关键信息是否一致重点检查:
- 关键信息是否丢失(违约金额、风险等级)
- 输出格式是否保持(三段式结构)
- 有没有乱码或重复
- 专业知识表述是否准确
性能优化技巧
Flash Attention 2
加速推理 2-3 倍:
bash
pip install flash-attn --no-build-isolationpython
model = AutoModelForCausalLM.from_pretrained(
model_name,
attn_implementation="flash_attention_2",
torch_dtype=torch.float16,
)投机采样(Speculative Decoding)
用一个小模型预测 token,大模型验证,速度提升 2-5 倍:
python
# vLLM 支持投机采样
--speculative-model Qwen/Qwen2.5-0.5B-Instruct部署优化清单
| 场景 | 推荐方案 |
|---|---|
| 个人使用,有 GPU | Ollama + GGUF q4_k_m |
| 多人使用,有 GPU | vLLM + AWQ/GPTQ 量化 |
| 无 GPU,纯 CPU | Ollama + GGUF q4_k_m |
| 嵌入式设备 | llama.cpp + q2_k(质量换速度) |
| 微调中省显存 | bitsandbytes 4-bit(QLoRA) |
🎯 本章要点
- 量化把 16-bit 压到 4-bit,模型从 14GB 缩到 3.5GB,效果轻微下降
- GPTQ/AWQ 适合 GPU 推理,GGUF 适合 CPU/Ollama,bitsandbytes 适合微调
- 量化后必须人工验证关键信息不丢失、格式不变、无乱码
- Flash Attention 2 加速推理,投机采样用小模型辅助大模型进一步提升速度
加载练习题中...