LLaMA-Factory-310P3/mindie/examples/models/qwen
wql faa909dcc3 add: add mindie file 2024-09-10 15:38:33 +08:00
..
README.md add: add mindie file 2024-09-10 15:38:33 +08:00
convert_quant_weights.py add: add mindie file 2024-09-10 15:38:33 +08:00
convert_quant_weights_14b.py add: add mindie file 2024-09-10 15:38:33 +08:00
quant_qwen2_14b_w4a16_64.py add: add mindie file 2024-09-10 15:38:33 +08:00
quant_qwen2_72b_w4a16_64.py add: add mindie file 2024-09-10 15:38:33 +08:00
quant_qwen2_72b_w8a16_fast.py add: add mindie file 2024-09-10 15:38:33 +08:00
quant_qwen_14b_w8a8.py add: add mindie file 2024-09-10 15:38:33 +08:00
quant_qwen_72b_w8a16.py add: add mindie file 2024-09-10 15:38:33 +08:00
qwen.jinja add: add mindie file 2024-09-10 15:38:33 +08:00
run_fa.sh add: add mindie file 2024-09-10 15:38:33 +08:00
run_pa.sh add: add mindie file 2024-09-10 15:38:33 +08:00

README.md

README

  • 千问qwen语言大模型是阿里巴巴集团推出的大型语言模型具备强大的自然语言处理能力能够理解和生成文本应用于智能客服、内容生成、问答系统等多个场景助力企业智能化升级。

特性矩阵

  • 此处罗列QWen模型各版本支持的特性
模型及参数量 800I A2 Tensor Parallelism 300I DUO Tensor Parallelism FP16 BF16 Flash Attention Paged Attention W8A8量化 W8A16量化 W4A16量化 KV cache量化 稀疏量化 MOE量化 MindIE Service TGI 长序列
Qwen-7B 支持world size 1,2,4,8 支持world size 1 × × × × × × ×
Qwen-14B 支持world size 2,4,8 支持world size 1,2 × × × × × × ×
QWen-72B 支持world size 8 × × × × × × × ×
Qwen1.5-0.5B 支持world size 1,2,4,8 支持world size 1 × × × × × × × ×
Qwen1.5-1.8B 支持world size 1,2,4,8 支持world size 1 × × × × × × × ×
Qwen1.5-4B 支持world size 1,2,4 支持world size 1 × × × × × × × ×
Qwen1.5-7B 支持world size 1,2,4,8 支持world size 1 × × × × × × × ×
Qwen1.5-14B 支持world size 2,4,8 支持world size 1,2 × × × × ×
Qwen1.5-32B 支持world size 4,8 支持world size 1,2 × × × × × × ×
Qwen1.5-72B 支持world size 8 × × × × × × ×
Qwen1.5-MoE-A2.7B 支持world size 4 × × × × × × × ×

表中所示支持的world size为对话测试可跑通的配置实际运行时还需考虑输入序列长度带来的显存占用。

原始权重

模型 huggingface下载链接
Qwen-7B https://huggingface.co/Qwen/Qwen-7B/tree/main
Qwen-14B https://huggingface.co/Qwen/Qwen-14B/tree/main
QWen-72B https://huggingface.co/Qwen/Qwen-72B/tree/main
Qwen1.5-14B https://huggingface.co/Qwen/Qwen1.5-14B/tree/main
Qwen-14B-Chat https://huggingface.co/Qwen/Qwen-14B-Chat/tree/main
Qwen-72B-Chat https://huggingface.co/Qwen/Qwen-72B-Chat/tree/main
Qwen1.5-0.5B-Chat https://huggingface.co/Qwen/Qwen1.5-0.5B-Chat/tree/main
Qwen1.5-4B-Chat https://huggingface.co/Qwen/Qwen1.5-4B-Chat/tree/main
Qwen1.5-7B https://huggingface.co/Qwen/Qwen1.5-7B/tree/main
Qwen1.5-14B-Chat https://huggingface.co/Qwen/Qwen1.5-14B-Chat/tree/main
Qwen1.5-32B-Chat https://huggingface.co/Qwen/Qwen1.5-32B-Chat/tree/main
Qwen1.5-72B https://huggingface.co/Qwen/Qwen1.5-72B/tree/main
Qwen1.5-MoE-A2.7B-Chat https://huggingface.co/Qwen/Qwen1.5-MoE-A2.7B-Chat/tree/main

版本配套

模型版本 transformers版本
Qwen 4.30.2、4.32.0
Qwen1.5 4.37.0、4.37.2

Paged Attention 推理使用说明

注意:

  • Qwen模型权重所在路径中的config.json文件需添加字段torch_dtype,例如"torch_dtype": "float16"
  • Qwen1.5模型权重所在路径中的config.json文件需将字段torch_dtype的值修改为"float16",例如"torch_dtype": "float16"
  • 执行量化推理时须在量化权重所在路径的config.json文件中添加字段quantize,值为当前量化权重的量化方式,例如"quantize": "w8a8""quantize": "w8a16"
  • QWen-14B执行2K以上QWen-7B为8K以上长序列推理时需增加环境变量LONG_SEQ_ENABLE=1。长序列推理过程具有更多计算节点,因此相比于短序列,推理性能将有下降。

路径变量解释

变量名称 含义
working_dir 加速库及模型库下载后放置的目录
llm_path 模型仓所在路径。若使用编译好的包,则路径为${working_dir}/MindIE-LLM/若使用gitee下载的代码则路径为${working_dir}/MindIE-LLM/examples/atb_models
script_path 脚本所在路径。QWen系列模型的工作脚本所在路径为${llm_path}/examples/models/qwen
weight_path 模型权重路径

权重格式转换

Paged Attention 场景需要.safetensors格式的权重如果没有参考此README文件转换 注huggingface官网给出的QWen模型权重为.safetensors格式

量化权重导出

量化权重可通过msmodelslim昇腾压缩加速工具实现。

环境准备

环境配置可参考此README文件

  • 设置环境变量
# 设置CANN包的环境变量
source /usr/local/Ascend/ascend-toolkit/set_env.sh

需要安装 CANN已包含msmodelslim工具 以及 pytorch 和 pytorch-npu 以及相关的python库

pip install transformers  # transformers版本应根据Qwen版本确定配套关系见版本配套
pip install accelerate==0.27.2
pip install scipy==1.11.4
pip install tiktoken==0.5.2
pip install einops==0.7.0
pip install transformers_stream_generator==0.0.4

导出量化权重

qwen系列
  • 通过${llm_path}/examples/models/qwen/quant_qwen_14b_w8a8.py${llm_path}/examples/models/qwen/quant_qwen_72b_w8a16.py文件导出目标模型的量化权重(注意量化权重不要和浮点权重放在同一个目录下):

    python quant_qwen_14b_w8a8.py ${浮点权重路径} ${量化权重保存路径}
    

    导出量化权重后应生成quant_model_weight_w8a8.safetensorsquant_model_description_w8a8.json两个文件。

  • 注意:

    • quant_qwen_14b_w8a8.py、quant_qwen_72b_w8a16.py分别为Qwen1-14B模型、Qwen1-72B模型已配置好的较优的量化策略。导出量化权重时可直接使用也可修改为其它策略。
    • 72b模型较大导出量化权重使用DataFree形式需要花费半小时使用LabelFree需要耗费4小时左右
    calibrator = Calibrator(
        model,
        quant_config,
        calib_data=None,  # w8a16 支持精度无损的data-free形式设置calib_data=Nonelabel-free需要传入校准集设置calib_data=dataset_calib权重生成时间较长
        disable_level='L0'  # 自动回退等级根据精度损失程度增加不量化的层L0~L5L0为不回退精度损失明显时可适当提升等级
    )
    
    • qwen系列目前有qwen-14b、qwen-72b支持量化,具体支持情况请参考‘特性矩阵’
qwen1.5系列W8A8量化
  • W8A8量化权重请使用以下指令生成

    • 当前支持NPU分布式W8A8量化
    • 执行量化脚本
      # 指定当前机器上可用的逻辑NPU核心
      export ASCEND_RT_VISIBLE_DEVICES=0,1,2,3,4,5,6,7
      cd ${llm_path}
      python examples/models/qwen/convert_quant_weights.py --model_path {浮点权重路径} --save_directory {W8A8量化权重路径} --w_bit 8 --a_bit 8 --disable_level L0 --device_type npu --calib_file ${llm_path}/examples/convert/model_slim/boolq.jsonl
      
  • 注意 -model_pathsave_directory请勿使用同一个文件夹,避免浮点权重和量化权重混淆

    • accelerate三方件版本需>=0.28.0
    • qwen1.5系列目前有qwen1.5-14b、qwen1.5-32b支持量化,具体支持情况请参考‘特性矩阵’
  • 稀疏量化权重请使用以下指令生成

    • Step 1

      # 设置CANN包的环境变量
      source /usr/local/Ascend/ascend-toolkit/set_env.sh
      cd ${llm_path}
      python examples/models/qwen/convert_quant_weights_14b.py --model_path {浮点权重路径} --save_directory {W8A8S量化权重路径} --w_bit 4 --a_bit 8 --calib_file ${llm_path}/atb_llm/models/qwen2/cn_en.jsonl --fraction 0.011 --co_sparse True --device_type cpu --do_smooth False --use_sigma True --is_lowbit True
      

      Step 2量化权重切分及压缩

      运行前需要确保压缩工具编译过

      cd /usr/local/Ascend/ascend-toolkit/latest/python/site-packages/msmodelslim/pytorch/weight_compression/compress_graph

      bash build.sh /usr/local/Ascend/ascend-toolkit/latest

      torchrun --nproc_per_node {TP数} -m examples.convert.model_slim.sparse_compressor --model_path {W8A8S量化权重路径} --save_directory {W8A8SC量化权重路径}
      
      • TP数为tensor parallel并行个数

      • 注意若权重生成时以TP=4进行切分则运行时也需以TP=4运行

      • 示例

          torchrun --nproc_per_node 2 -m examples.convert.model_slim.sparse_compressor --model_path /data1/weights/model_slim/Qwen-14b_w8a8s --save_directory /data1/weights/model_slim/Qwen-14b_w8a8sc
        
qwen1.5系列W8A16与W4A16量化
  • 目录${llm_path}/examples/models/qwen/下的quant_qwen2_72b_w8a16_fast.py、quant_qwen2_72b_w4a16_64.py分别为Qwen1.5-72B-W8A16模型、Qwen1.5-72B-W4A16模型已配置好的较优的量化策略。导出量化权重时可直接使用也可修改为其它策略。
  • 通过 ${llm_path}/examples/models/qwen/quant_qwen2_72b_w8a16_fast.py${llm_path}/examples/models/qwen/quant_qwen2_72b_w4a16_64.py 脚本导出Qwen1.5-72B模型W8A16和W4A16的量化权重注意量化权重不要和浮点权重放在同一个目录下。命令如下
    python quant_qwen2_72b_w8a16_fast.py ${浮点权重路径} ${量化权重保存路径}
    
    python quant_qwen2_72b_w4a16_64.py ${浮点权重路径} ${量化权重保存路径}
    
    例:
    python quant_qwen2_72b_w8a16_fast.py /data1/models/Qwen1p5_72B /data1/models/Qwen1p5_72B_W8A16
    
    python quant_qwen2_72b_w4a16_64.py /data1/models/Qwen1p5_72B /data1/models/Qwen1p5_72B_W4A16
    
  • 导出量化权重后生成quant_model_weight_w8a16.safetensorsquant_model_description_w8a16.json两个文件对于W4A16量化为quant_model_weight_w4a16.safetensorsquant_model_description_w4a16.json两个文件。模型浮点权重中的其他文件除safetensors文件外需要手工拷贝到目标量化文件夹中。
  • 在量化权重保存路径中的config.json文件中添加"quantize"字段。对于W8A16量化"quantize"字段的值为"w8a16"对于W4A16量化"quantize"字段的值为"w4a16"。

推理

对话测试

量化权重生成路径下可能缺少一些必要文件与转换量化权重时使用的cann版本有关若启动量化推理失败请将config.json等相关文件复制到量化权重路径中可执行以下指令进行复制

cp ${浮点权重路径}/*.py ${量化权重路径}
cp ${浮点权重路径}/*.json ${量化权重路径}
cp ${浮点权重路径}/*.tiktoken ${量化权重路径}

启动量化推理时请在权重路径的config.json文件中添加(或修改)torch_dtype字段,例如"torch_dtype": "float16"

启动量化推理时请在权重路径的config.json文件中添加(或修改)quantize字段,值为相应量化方式,例如"quantize": "w8a8""quantize": "w8a16"

${llm_path}目录执行以下指令

bash examples/models/qwen/run_pa.sh -m ${weight_path}

注:

1.推理支持浮点和量化,若启动浮点推理则在${weight_path}中传入浮点权重路径,若启动量化则传入量化权重路径

2.同时支持Qwen和Qwen1.5模型推理若启动Qwen模型推理时在${weight_path}中传入Qwen权重路径若启动Qwen1.5模型推理时则在${weight_path}中传入Qwen1.5权重路径

3.Qwen1.5系列部分chat模型Qwen1.5-4B-Chat、Qwen1.5-32B-Chat需要开启chat模式才能正常输出。 执行:

bash examples/models/qwen/run_pa.sh -m ${weight_path} -c true

4.启动qwen需要安装三方依赖tiktoken若环境中没有该依赖可使用以下命令安装

pip install tiktoken

根据硬件设备不同请参考下表修改run_pa.sh再运行

5.运行Qwen1.5-MoE-A2.7B-Chat时需写入环境变量

export ATB_LLM_ENABLE_AUTO_TRANSPOSE=0

run_pa.sh 参数说明(需要到脚本中修改)

参数名称 含义 800I A2推荐值 300I DUO推荐值
BIND_CPU 绑定CPU核心开关,默认进行绑核 1 1
ASCEND_RT_VISIBLE_DEVICES 使用的硬件卡号,多个卡间使用逗号相连 根据实际情况设置 根据实际情况设置
RESERVED_MEMORY_GB 保留内存,通常未加速库需要的内存+通信内存 3 3
MASTER_PORT 卡间通信端口,通常不用修改,有冲突时再改

注:暂不支持奇数卡并行

运行MOE量化

  • 待补充

运行KV cache量化

  • 待补充

精度测试

示例:

bash run.sh pa_fp16 full_BoolQ 1 qwen /data1/models/qwen2/qwen_quant_test/ 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen-7b权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen-14b权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen-72b权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen1.5-14b权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen-14b-chat权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen-72b-chat权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen1.5-0.5b-chat权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen1.5-4b-chat权重路径} 4
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen1.5-7b权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen1.5-14b-chat权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen1.5-32b-chat权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen1.5-72b权重路径} 8
bash run.sh pa_fp16 full_BoolQ 1 qwen ${Qwen1.5-MoE-A2.7B-Chat权重路径} 8

性能测试

  • 进入以下路径

    ${llm_path}/tests/modeltest
    
  • 运行指令

    bash run.sh pa_fp16 [performance|full_CEval|full_BoolQ] ([case_pair]) [batch_size] qwen [weight_dir] [chip_num] ([max_position_embedding/max_sequence_length])
    
  • 环境变量释义

  1. HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0

这两个会影响性能开启了变慢但是会变成确定性计算不开会变快所以设置为0。

  1. HCCL_BUFFSIZE=120

这个会影响hccl显存需要设置基本不影响性能。

  1. ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1

这个是显存优化需要开小batch、短序列场景不开更好。

示例:

HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen-7b权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen-14b权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen-72b权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen1.5-14b权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen-14b-chat权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen-72b-chat权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 
ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen1.5-0.5b-chat权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120
ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen1.5-4b-chat权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen1.5-7b权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen1.5-14b-chat权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen1.5-32b-chat权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen1.5-72b权重路径} 8
HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0 HCCL_BUFFSIZE=120 ATB_WORKSPACE_MEM_ALLOC_GLOBAL=1 bash run.sh pa_fp16 performance [[2048,2048],[1024,1024],[512,512],[256,256]] 1 qwen ${Qwen1.5-MoE-A2.7B-Chat权重路径} 8

Flash Attention推理使用说明

路径变量和权重转换等均与Paged Attention相同。

推理

对话测试

${llm_path}目录执行以下指令

bash examples/models/qwen/run_fa.sh ${weight_path}

注:

  • 除启动命令外其他操作与执行PA相同
  • 暂不支持chat模式。部分chat模型输出可能存在异常如qwen1.5-32b-chat若出现上述情况请优先使用PA
  • QWen-14B执行2K以上QWen-7B为8K以上长序列推理时需增加环境变量LONG_SEQ_ENABLE=1暂不支持多batch长序列推理。长序列推理过程具有更多计算节点因此相比于短序列推理性能将有下降。
  • qwen1.5部分Chat模型(4B、32B)fa暂不支持chat推理请优先使用pa。如需使用fa请将输入改造成续写的样式What's deep learning?改写成Deep learning is