faa909dcc3 | ||
---|---|---|
.. | ||
README.md | ||
convert_quant_weights.py | ||
convert_quant_weights_14b.py | ||
quant_qwen2_14b_w4a16_64.py | ||
quant_qwen2_72b_w4a16_64.py | ||
quant_qwen2_72b_w8a16_fast.py | ||
quant_qwen_14b_w8a8.py | ||
quant_qwen_72b_w8a16.py | ||
qwen.jinja | ||
run_fa.sh | ||
run_pa.sh |
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.safetensors
和quant_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=None;label-free需要传入校准集,设置calib_data=dataset_calib,权重生成时间较长 disable_level='L0' # 自动回退等级,根据精度损失程度增加不量化的层(L0~L5,L0为不回退,精度损失明显时可适当提升等级) )
- 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_path
和save_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.safetensors
和quant_model_description_w8a16.json
两个文件(对于W4A16量化为quant_model_weight_w4a16.safetensors
和quant_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])
-
环境变量释义
- HCCL_DETERMINISTIC=0 LCCL_DETERMINISTIC=0
这两个会影响性能,开启了变慢,但是会变成确定性计算,不开会变快,所以设置为0。
- HCCL_BUFFSIZE=120
这个会影响hccl显存,需要设置,基本不影响性能。
- 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