W8A16量化
什么是W8A16量化
W8A16量化是一种模型量化技术,其中“W8”表示将模型的权重(Weight)量化为8位整数(INT8),“A16”表示激活值(Activation)保留16位浮点精度(FP16或BF16)。
这种量化方式的优势在于精度损失极小,不仅可以保证精度在可接受的范围内,同时也有一定的性能收益。适合对输出敏感的任务,如对话生成、复杂推理等。同时,它硬件兼容性好,可直接支持GPU/NPU的混合精度计算单元,且能将权重压缩至INT8,使模型体积减少约50%,适用于中等显存设备。但其也存在计算加速有限、内存压缩不彻底等缺点,在长序列场景下,激活值占用的显存仍可能成为瓶颈。
约束限制
- 只支持GPTQ W8A16 perchannel量化,只支持desc_act=false。
- GPTQ W8A16量化支持的模型请参见支持的模型列表。
步骤一:量化模型权重
在GPU的机器上使用开源GPTQ量化工具GPTQ (huggingface.co)量化模型权重。
具体操作如下:
- 开始之前,请确保安装了以下库:
pip install auto-gptq pip install --upgrade accelerate optimum transformers
- 设置GPTQConfig的参数,并且创建一个数据集用于校准量化的权重,以及一个tokenizer用于准备数据集。
from transformers import AutoModelForCausalLM, AutoTokenizer, GPTQConfig model_id = "meta-llama/CodeLlama-34b-hf" tokenizer = AutoTokenizer.from_pretrained(model_id) gptq_config = GPTQConfig(bits=8, dataset="c4", tokenizer=tokenizer, group_size=-1, damp_percent=0.01, desc_act=False, sym=True, use_exllama=False)
- 您也可以将自己的数据集作为字符串列表传递,但强烈建议使用GPTQ论文中的相同数据集。
dataset = ["auto-gptq is an easy-to-use model quantization library with user-friendly apis, based on GPTQ algorithm."] gptq_config = GPTQConfig(bits=8, dataset=dataset, tokenizer=tokenizer, group_size=-1, damp_percent=0.01, desc_act=False, sym=True, use_exllama=False)
- 加载要量化的模型,并将gptq_config传递给from_pretrained()方法。
quantized_model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=gptq_config)
- 您还可以使用save_pretrain()方法在本地保存您的量化模型。如果模型是用device_map参数量化的,请确保在保存之前将整个模型移动到GPU或CPU。例如,要将模型保存在CPU上。
quantized_model.save_pretrained("CodeLlama-34b-hf") tokenizer.save_pretrained("CodeLlama-34b-hf") # if quantized with device_map set quantized_model.to("cpu") quantized_model.save_pretrained("CodeLlama-34b-hf")
步骤二:启动量化服务
使用量化模型需要在NPU的机器上运行。
- 在模型的保存目录中创建quant_config.json文件,bits必须设置为8,指定量化为int8;group_size必须设置为-1,指定不使用pergroup;desc_act必须设置为false,内容如下:
{ "bits": 8, "group_size": -1, "desc_act": false }
- 启动vLLM,如果是使用命令行的方式,指定--quantization "gptq"参数,其他参数请参考启动在线推理服务。
python -m vllm.entrypoints.openai.api_server --model <your_model> --quantization "gptq"