
# W8A8量化
#### 什么是W8A8量化
W8A8量化是一种将模型权重和激活值都量化为8位数据的技术。该技术把高位浮点数转为8位，通常是将权重和激活值从16位或32位浮点数转换为8位整数（int8）格式。量化后，模型权重体积会减少，同时使用int8格式数据进行矩阵乘法（MatMul）运算时，可减少计算量，进而提升推理性能。
W8A8量化方案能降低模型显存以及需要部署的卡数。也能同时降低首token时延和增量推理时延。
#### 约束限制
- llm-compressor支持W8A8量化的模型列表请参见[支持的模型列表](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5910002.html)。
- 激活量化支持动态per-token，支持对称量化。
- 权重量化支持per-channel，支持对称量化。
 
#### 获取量化后的模型权重
有两种方式获取量化模型权重：
方式一：可以在Huggingface开源社区获取量化后的模型权重，具体参考[从开源社区下载发布的llm-compressor量化模型](https://huggingface.co/RedHatAI)。
方式二：获取FP16/BF16的模型权重之后，通过llm-compressor工具进行量化，具体参考下文指导。
#### 使用llm-compressor工具量化模型
本章节介绍如何在NPU的机器上使用开源量化工具llm-compressor量化模型权重，然后在NPU的机器上实现推理量化。llm-compressor量化工具使用到的脚本llm_compressor_W8A8.py存放在代码包AscendCloud-LLM-*x.x.x* .zip的"llm_tools/quantization/llm_compressor/"目录下。了解更多开源量化工具信息，请参考[llm-compressor](https://github.com/vllm-project/llm-compressor)。
1. 使用该量化工具，需要切换conda环境，运行以下命令：
   ```
   conda create --name llmcompressor --clone PyTorch-2.5.1  
   conda activate llmcompressor
   ```
   
2. 安装llm-compressor
   ```
   pip install llmcompressor==0.6.0
   pip install transformers==4.51.3
   pip install zstandard
   ```
   
3. W8A8量化默认使用"HuggingFaceH4/ultrachat_200k"数据集作为校准数据集，如需指定数据集请修改"llm_compressor_W8A8.py"脚本中如下字段。llm_compressor_W8A8.py存放在代码包AscendCloud-LLM-*x.x.x* .zip的"llm_tools/quantization/llm_compressor/"目录下。
   ```
   DATASET_ID = "HuggingFaceH4/ultrachat_200k"
   DATASET_SPLIT = "train_sft"
   NUM_CALIBRATION_SAMPLES = 512
   MAX_SEQUENCE_LENGTH = 2048
   ```
   如果当前环境无法访问HuggingFace网站获取数据集，可以先将数据集通过浏览器下载到本地后上传至服务器，并将DATASET_ID指定到服务器路径，数据集下载地址：https://huggingface.co/datasets/HuggingFaceH4/ultrachat_200k/tree/main
   下载的数据集需要保留原始的data目录，下载后目录结构示例如下，其中\<local-data-dir\>是存放数据集的自定义目录：
   ```
   <local-data-dir>
      -- ultrachat_200k
          -- data
             -- train_sft-xxx.parquet
             -- train_gen-xxx.parquet
   ```
   指定本地数据集目录，需要指定到data的上一层级，不包含data：
   ```
   DATASET_ID="<local-data-dir>/ultrachat_200k"
   ```
   
4. 运行"llm_compressor_W8A8.py"文件进行模型量化，量化时间和模型大小有关，预计30分钟\~3小时。
   ```
   # 根据机器卡的空闲情况指定量化使用的卡号，不设置则默认使用0号卡
   export ASCEND_RT_VISIBLE_DEVICES=0
   nohup python llm_compressor_W8A8.py --model-path /home/ma-user/Qwen2.5-72B/ --quant-path /home/ma-user/Qwen2.5-72B-quant/ > Qwen2.5-72B-quant_W8A8_logs.txt 2>&1 &
   ```
   参数说明：
   - --model-path：原始模型权重路径
   
   - --quant-path：转换后保存权重路径
   
   
   量化执行过程中如果打印如下WARNING日志，可以不用关注，不影响量化功能正常使用：
   ```
   get_GPU_usage_nv | WARNING - Pynml library error:
    NVML Shared Library Not Found
   ```
   
5. [启动在线推理服务](https://support.huaweicloud.com/bestpractice-modelarts/modelarts_llm_infer_5910007.html#ZH-CN_TOPIC_0000002477646206__zh-cn_topic_0000002451298474_section228325152719)，在启动服务时添加如下命令。
   ```
   -q compressed-tensors 或者--quantization compressed-tensors
   ```
   
 
