大型语言模型(LLMs)由于其参数量庞大,导致很难在有限资源下运行,所以工业界通常会将模型进行量化后再部署到生产环境,今天我们来不讲理论、定义等,只人话梳理一下这个技术。
前置基础
量化(人话):大模型在训练或微调后的每个参数,都是float32或半精度(float16或bf16)的。量化就是将模型权重降低精度(如8位、6位、4位等),以致模型能以最小化计算资源运行。
举例:假设某个参数=3.1415926789,通过量化后该参数值=3.14,则必然所需计算资源要少得多。
缺点:由于量化会降低精度,所以必然会带来一定的损失,我们现在要讨论的是如何才能在最小化损失和运行速度上取得平衡。
常用量化手段
量化方法 | 主要应用 | 优势 | 劣势 | 性能损失 |
点击跳转 | CPU 推理 | 灵活,CPU 性能好 | GPU 支持可能较弱,生态系统仍在发展 | 取决于量化级别,目标是在给定级别下最小化损失。 量化到8位-2位都有,性能损失越来越高。 推荐q4_k_m就行。 |
点击跳转 | CPU/GPU 推理 | 性能好,量化快,适应性好 | 灵活性可能不如 GGUF | 4 比特量化损失较小,接近原始模型性能。 |
点击跳转 | GPU 推理,Transformer 模型 | Transformer 模型性能好,压缩率高 | 量化耗时,主要针对 Transformer | 4 比特量化损失相对较小,过度量化损失较大。 |
点击跳转 | CPU/GPU 推理 | 精度高,理论基础扎实 | 实现复杂,量化过程可能需要更多资源 | 旨在减少损失,相同压缩率下通常优于传统方法。 |
量化后损失(以GGUF为例)
Type | Size (GB) | PPL | Mean Δp | RMS Δp |
---|---|---|---|---|
f16 | 14.97 | 6.2331 | - | - |
q8_0 | 7.96 | 6.2342 | -0.019 ± 0.003 % | 1.198 % |
q6_K | 6.14 | 6.2533 | -0.007 ± 0.006 % | 2.295 % |
q5_K_M | 5.33 | 6.2886 | -0.114 ± 0.008 % | 3.160 % |
q5_0 | 5.21 | 6.3632 | -0.416 ± 0.012 % | 4.634 % |
q4_K_M | 4.58 | 6.3830 | -0.389 ± 0.014 % | 5.251 % |
q4_0 | 4.34 | 6.7001 | -1.588 ± 0.022 % | 8.434 % |
数据来源于:Comparing Quantized Performance in Llama Models — LessWrong
量化后模型运行软件
量化方法 | 常用运行软件 |
GGUF | llama.cpp、Ollama、vLLM |
AWQ | NVIDIA TensorRT-LLM、FastChat、vLLM、SGLang、HuggingFace TGI、LMDeploy |
GPTQ | 同上 |
工业界最佳实践
- 【有GPU】如果只是测试,GGUF+Ollama足矣,4位就行。
- 【有GPU】如果需要在业务上使用,AWQ+vLLM或SGLang是最佳配合。如果是不缺钱的大佬,请忽略这个建议,跑原版没有损失。
- 【只有CPU】GGUF+Ollama,没什么别的省时省力的好方案。
Qwen系列模型是除了LLama外,目前国内外最知名的开源模型。最新发版的QwQ-32B模型,官方有原版和AWQ版。通过开源的模型权重文件对比即可发现,原版模型权重文件有14个safetensors,而AWQ版仅有5个safetensors,从这即可看出量化后不管是在文件存储上,还是在模型加载速度上,都能有好处。当然,最重要的是文件变小(本质是权重精度变低),所需计算资源(CPU和GPU)大大降低,咱老百姓也能本地玩玩7B、14B,甚至32B的大模型。
参考资料
Which Quantization Method Works Best for You?
https://huggingface.co/docs/transformers/v4.49.0/quantization/overview