更新时间:2024-10-23 GMT+08:00
分享

使用AWQ量化

AWQ(W4A16)量化方案能显著降低模型显存以及需要部署的卡数。降低小batch下的增量推理时延。支持AWQ量化的模型列表请参见支持的模型列表和权重文件

本章节介绍如何使用AWQ量化工具实现推理量化。

量化方法:W4A16 per-group/per-channel,W8A16 per-channel

Step1 环境准备

  1. 在节点自定义目录${node_path}下创建config.yaml文件
    apiVersion: apps/v1
    kind: Deployment
    metadata:
      name: yourapp
      labels:
          app: infers
    spec:
      replicas: 1
      selector:
        matchLabels:
          app: infers
      template:
        metadata: 
          labels:
             app: infers
        spec:
          schedulerName: volcano
          nodeSelector:
            accelerator/huawei-npu: ascend-1980
          containers:
          - image: ${image_name}                  # 推理镜像名称
            imagePullPolicy: IfNotPresent
            name: ${container_name}
            securityContext:
              runAsUser: 0
            ports:
            - containerPort: 8080
            command: 
            - "sleep"
            - "1000000000000000000"
            resources:
              requests:
                huawei.com/ascend-1980: "8"             # 需求卡数,key保持不变。
              limits:
                huawei.com/ascend-1980: "8"             # 限制卡数,key保持不变。
            volumeMounts:                             # 容器内部映射路径
            - name: ascend-driver               #驱动挂载,保持不动
              mountPath: /usr/local/Ascend/driver
            - name: ascend-add-ons           #驱动挂载,保持不动
              mountPath: /usr/local/Ascend/add-ons
            - name: hccn                             #驱动hccn配置,保持不动
              mountPath: /etc/hccn.conf
            - name: localtime                       
              mountPath: /etc/localtime
            - name: npu-smi                             # npu-smi
              mountPath: /usr/local/sbin/npu-smi
            - name: model-path                       # 模型权重路径
              mountPath: ${model-path}
            - name: node-path                       # 节点自定义目录,该目录下包含pod配置文件config.yaml
              mountPath: ${node-path}
          volumes:                                   # 物理机外部路径
          - name: ascend-driver
            hostPath:
              path: /usr/local/Ascend/driver
          - name: ascend-add-ons
            hostPath:
              path: /usr/local/Ascend/add-ons
          - name: hccn
            hostPath:
              path: /etc/hccn.conf
          - name: localtime
            hostPath:
              path: /etc/localtime
          - name: npu-smi
            hostPath:
              path: /usr/local/sbin/npu-smi
          - name: model-path
            hostPath:
              path: ${model-path}
          - name: node-path
            hostPath:
              path: ${node-path}

    参数说明:

    • ${container_name}:容器名称,此处可以自己定义一个容器名称,例如ascend-vllm。
    • ${image_name}:Step3 制作推理镜像构建的推理镜像名称。
    • ${node-path}:节点自定义目录,该目录下包含pod配置文件config.yaml。
    • ${model-path}:Step1 上传权重文件中上传的模型权重路径。
  2. 参考Step4 创建pod创建pod以用于后续进行模型量化

Step2 模型量化

可以在Huggingface开源社区获取AWQ量化后的模型权重;或者获取FP16/BF16的模型权重之后,通过autoAWQ工具进行量化。

方式一:从开源社区下载发布的AWQ量化模型。

https://huggingface.co/models?sort=trending&search=QWEN+AWQ

方式二:使用AutoAWQ量化工具进行量化。

  1. 执行如下命令进入容器,并进入AutoAWQ目录下运行以下命令下载并安装AutoAWQ源码。
    kubectl exec -it {pod_name} bash
    cd /home/ma-user/AscendCloud/AscendCloud-LLM/llm_tools/AutoAWQ
    bash build.sh
  2. 运行“examples/quantize.py”文件进行模型量化,量化时间和模型大小有关,预计30分钟~3小时。
    pip install transformers==4.41.0 # AutoAWQ未适配transformers 4.42以上
    python examples/quantize.py --model-path /home/ma-user/llama-2-7b/ --quant-path /home/ma-user/llama-2-7b-awq/ --calib-data /home/ma-user/mit-han-lab/pile-val-backup --group-size 128 --w-bit 4

    参数说明:

    • --model-path:原始模型权重路径。
    • --quan-path:转换后权重保存路径。
    • --group-size:量化group size参数,指定-1时为per-channel权重量化,W4A16支持128和-1,W8A16支持-1。
    • --w-bit:量化比特数,W4A16设置4,W8A16设置8。
    • --calib-data:数据集路径,推荐使用:https://huggingface.co/datasets/mit-han-lab/pile-val-backup,注意需指定到val.jsonl的上一级目录。

      详细说明可以参考vLLM官网:https://docs.vllm.ai/en/latest/quantization/auto_awq.html

Step3 权重格式离线转换(可选)

AutoAWQ量化完成后,使用int32对int4的权重进行打包。昇腾上使用int8对权重进行打包,在线转换会增加启动时间,可以提前对权重进行转换以减少启动时间,转换步骤如下:

进入llm_tools/AutoAWQ代码目录下执行以下脚本:

执行时间预计10分钟。执行完成后会将权重路径下的原始权重替换成转换后的权重。如需保留之前权重格式,请在转换前备份。

python convert_awq_to_npu.py --model /home/ma-user/Qwen1.5-72B-Chat-AWQ

参数说明:

model:模型路径。

Step4 启动AWQ量化服务

参考部署推理服务,使用量化后权重部署AWQ量化服务。

注:Step3 创建服务启动脚本启动脚本中,服务启动命令需添加如下命令。

 -q awq 或者--quantization awq

相关文档