更新时间:2024-09-14 GMT+08:00
分享

使用GPTQ量化

当前版本使用GPTQ量化仅支持W8A16 perchannel的量化形式,使用W8A16的量化不仅可以保证精度在可接受的范围内,同时也有一定的性能收益。

GPTQ W8A16量化支持的模型请参见表3

本章节介绍如何在GPU的机器上使用开源GPTQ量化工具GPTQ (huggingface.co)量化模型权重,然后在NPU的机器上实现推理量化。

具体操作如下:

  1. 开始之前,请确保安装了以下库:
    pip install auto-gptq
    pip install --upgrade accelerate optimum transformers
  2. 设置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)
  3. 您也可以将自己的数据集作为字符串列表传递,但强烈建议使用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)
  4. 加载要量化的模型,并将gptq_config传递给from_pretrained()方法。
    quantized_model = AutoModelForCausalLM.from_pretrained(model_id, device_map="auto", quantization_config=gptq_config)
  5. 您还可以使用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的机器上运行。

1. 在模型的保存目录中创建quant_config.json文件,bits必须设置为8,指定量化为int8;group_size必须设置为-1,指定不使用pergroup;desc_act必须设置为false,内容如下:

{
    "bits": 8,
    "group_size": -1,
    "desc_act": false
}

2. 启动vLLM,如果是使用命令行的方式,指定--quantization "gptq"参数,其他参数请参考Step6 启动推理服务

python -m vllm.entrypoints.openai.api_server --model <your_model> --quantization "gptq"

3. 如果是sdk使用的方式,指定quantization="gptq"参数

llm = LLM(model="meta-llama/CodeLlama-34B-Instruct-bf16-GPTQ-w8a16", trust_remote_code=True, 
         max_num_seqs=64, max_model_len=2048, block_size=128, quantization="gptq")

启动之后可以正常进行推理。

相关文档