LongCat-Flash模型在NPU上推理
【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer
概述
本样例基于LongCat-Flash开源代码进行迁移,并完成对应的优化适配。
支持的产品型号
Atlas A3 系列产品
环境准备
安装CANN软件包。
本样例的编译执行依赖CANN开发套件包(cann-toolkit)与CANN二进制算子包(A3-ops)。
请从软件包下载地址下载
Ascend-cann-toolkit_${version}_linux-${arch}.run与Ascend-cann-A3-ops_${version}_linux-${arch}.run软件包,并参考CANN安装文档进行安装。${version}表示CANN包版本号,如8.5.0等。${arch}表示CPU架构,如aarch64、x86_64。
安装Ascend Extension for PyTorch(torch_npu)。
Ascend Extension for PyTorch(torch_npu)为支撑PyTorch框架运行在NPU上的适配插件。 请从软件包下载地址下载
v2.6.0源码(CommitID71047a90f6e32af5de6268795b73c4cdeb07c4ea),参考源码编译安装。下载项目源码并安装依赖的python库。
# 下载项目源码,以master分支为例 git clone https://gitcode.com/cann/cann-recipes-infer.git # 安装依赖的python库 cd cann-recipes-infer pip3 install -r ./models/longcat-flash/requirements.txt配置样例运行所需环境信息。
修改
executor/scripts/set_env.sh中的如下字段:IPs:配置所有节点的IP,按照rank id排序,多个节点的ip通过空格分开,例如:('xxx.xxx.xxx.xxx' 'xxx.xxx.xxx.xxx')。cann_path: CANN软件包安装路径,例如/usr/local/Ascend/ascend-toolkit/latest。
权重准备
请根据所使用的模型类型自行下载原始权重到本地路径,例如/data/models/origin/。
LongCat-Flash-Chat模型的原始权重下载地址为:LongCat-Flash-Chat权重
权重转换
本样例支持LongCat-Flash模型量化,基于models/longcat-flash/utils/convert_model.py可以完成从Bfloat16到Int8的权重转换。
入参介绍:
input_bf16_hf_path:原始Bfloat16权重路径;output_hf_path:转换后输出的权重路径。
如果权重转换的运行环境为NPU,需要先执行:
cann_path=/usr/local/Ascend/ascend-toolkit/latest # cann包安装路径 source ${cann_path}/bin/setenv.bash权重转换执行示例:
# 转换为W8A8权重 python models/longcat-flash/utils/convert_model.py --input_bf16_hf_path /data/models/LongCat-Flash-Chat --output_hf_path /data/models/LongCat-Flash-Chat-W8A8推理执行
配置推理执行需要加载的权重文件以及YAML文件。
修改YAML文件中
model_path参数。在
models/longcat-flash/config目录下已提供了较优性能的YAML样例供您参考,您可以根据模型类型、集群规模以及量化类型选择对应的YAML文件,本文以models\longcat-flash\config\longcat_flash_densetp8_ep32_gegraph_mtp.yaml文件为例,修改其中的model_path参数,将其设置为权重准备阶段准备好的权重文件存储路径,例如/data/models/origin/LongCat-Flash-Chat/。修改
models/longcat-flash/infer.sh脚本中YAML_FILE_NAME参数。将
YAML_FILE_NAME设置为config文件夹下YAML文件名称,例如longcat_flash_densetp8_ep32_gegraph_mtp.yaml。
准备输入prompt。
使用内置prompt。
本样例已在
dataset/default_prompt.json中内置了输入prompt,若您直接使用内置prompt,本步骤可直接跳过。当然,您也可以在
dataset/default_prompt.json文件中自定义prompt输入。使用长序列prompt。
本样例默认使用内置prompt,若您需要使用长序列prompt,需要执行以下操作:
修改YAML文件中的
dataset参数,将其修改为dataset: "LongBench",使用LongBench数据集作为长序列prompt。若您的机器无法联网,需要您从huggingface手动下载数据集至
dataset/LongBench目录下,LongBench文件夹需手工创建,目录中包含LongBench.py和data目录,并需要在LongBench.py中修改数据集加载路径;若您的机器可正常联网,样例执行过程中会自动在线读取LongBench数据集,您无需手工下载。
说明:
- 使用LongBench数据集时,默认执行文本摘要任务,可在
cann-recipes-infer/executor/utils/data_utils.py的build_dataset_input函数里修改默认的system prompt。 - 长序列请求执行中若出现
out of memory问题,可参见附录中的长序列请求out of memory问题处理。
执行推理脚本。
cd models/longcat-flash bash infer.sh说明:如果是多机环境,需要在每个节点上执行。
优化点参考
本样例采用的详细优化点介绍及性能Benchmark可参见基于Atlas A3训练/推理集群的LongCat-Flash模型推理性能优化实践。
Benchmark
基于 Atlas A3 环境,本实践对 Longcat-Flash W8A8量化版本进行了性能 Benchmark 测试。 在使能 AFD 特性后,模型的 TPOT 迈入了 10 ms 之内, 并且相比于同样卡数和 global batch size 的不分离场景,拥有更优的 TPOT 和吞吐。
| Enable AFD | Quant Mode | Global Batch Size | Seq Length | Chips | TPOT (ms) | Throughput (tokens/p/s) |
|---|---|---|---|---|---|---|
| N | W8A8 | 512 | 4608 | 64 | 10.37 | 771.46 |
| N | W8A8 | 256 | 4608 | 32 | 10.64 | 751.88 |
| N | W8A8 | 256 | 4608 | 64 | 9.95 | 402.01 |
| Y | W8A8 | 256 | 4608 | 64 | 9.5 | 421.05 |
- 性能数据基于 MTP2 与 perfect eplb 配置采集。
- 当前 CANN 软件版本下,SuperKernel 标记范围内的部分算子尚不支持完全融合。该限制将在后续社区版本中得到解决,以进一步提升模型性能。
- 由于当前 Send/Recv 算子单次通信只支持1:1的发送/接收模式,不支持 M:N 模式,所以 AFD 场景部署时 Attention Instance 的 Node 个数 和 FFN Instance 的 Node 个数是一样,也即 M == N;后续会计划支持 M:N 的部署模式。
附录
常见问题处理
长序列请求out of memory问题处理
- 长序列请求可能导致device内存out of memory,尤其是在perfill阶段,MoE的Routing分发可能存在极端负载不均,导致个别卡上的grouped_matmul算子占用较大内存。为缓解由此引入的OOM问题,可采用以下方法:
- 为了缓解MoE负载不均带来的峰值内存,我们可进行Chunk MoE推理,即在MoE切Chunk串行推理,降低极端场景下的峰值内存,可通过YAML中的
moe_chunk_max_len开关设置chunk的大小。当前该开关只针对prefill生效,开启后,由于MoE部分将串行计算各chunk,会对prefill的性能产生相应的影响。
- 长序列请求的KV Cache内存占用过大,单个rank上存储完整的KV Cache导致device内存out of memory,而针对长序列低时延场景支持的KVP特性能够缓解OOM问题:
- 通过使能KVP特性,可实现将长序列的KV Cache沿S维度交错式存储至多个rank,并在Attention计算过程中利用各个rank上分片后的KV Cache完成全局注意力计算,最终达到缓解OOM的效果。KVP切分的大小可通过YAML中的
kvp_size开关设置。
【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考