Skip to content

📦 模型量化与优化

训好了,太大了——怎么把 14GB 模型压到 4GB 还不影响效果?

为什么需要量化

模型默认用 FP16(16-bit浮点数)存储,7B 模型约 14GB。量化就是把 16-bit 压到 8-bit、4-bit,体积成倍缩小。

精度7B 模型大小显存需求
FP3228GB32GB+
FP1614GB16GB+
INT87GB8GB+
INT43.5GB6GB+

量化方式对比

方式质量速度适用
GPTQGPU 推理首选
AWQGPU 推理,比 GPTQ 更稳定
bitsandbytes 4-bit微调时省显存(QLoRA)
GGUF (llama.cpp)CPU 推理 / Ollama

用 AutoGPTQ 量化

bash
pip install auto-gptq optimum
python
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-isolation
python
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

部署优化清单

场景推荐方案
个人使用,有 GPUOllama + GGUF q4_k_m
多人使用,有 GPUvLLM + AWQ/GPTQ 量化
无 GPU,纯 CPUOllama + 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 加速推理,投机采样用小模型辅助大模型进一步提升速度
加载练习题中...

有问题或补充?欢迎留言