DeepSeek-V4 昇腾 NPU 推理部署实践:基于 CANN cann-recipes-infer 的完整环境搭建与多卡推理指南
【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer
本文以 CANN 开源样例仓库 cann-recipes-infer 中的 DeepSeek-V4 推理实践 为核心,系统讲解如何在昇腾 Atlas A3 Pod 与 Ascend 950 系列平台上完成 DeepSeek-V4 Flash / Pro 的权重准备、量化转换、环境部署与多卡推理拉起,并深入拆解convert_config.py、convert_model.py、YAML 配置与infer.sh启动脚本等源码实现。读者读完即可独立完成 DeepSeek-V4 在 CANN 平台上的端到端推理部署,并掌握 W8A8-INT8、Hybrid INT8-INT4、Hybrid MXFP8-MXFP4、Hybrid HiF8-MXFP8-MXFP4 等多种量化策略与 DSpark 投机推理的配置方法。
概述:DeepSeek-V4 与 CANN 平台的 0 Day 适配
DeepSeek 团队发布了最新的 DeepSeek-V4 系列模型,包含DeepSeek-V4 Flash与DeepSeek-V4 Pro两种规格。本实践基于 DeepSeek 开源代码进行迁移,并在 CANN 平台上完成性能优化,支持在昇腾Atlas A3 Pod平台和Ascend 950系列平台部署。
与上一代 DeepSeek-V3.2 相比,DeepSeek-V4 在稀疏 Attention(DeepSeek Sparse Attention)基础上,在不同层间进一步引入KV Cache 滑窗(Window Cache)与压缩算法(KV Cache Compress),显著降低 Attention 的计算与访存开销,可大幅提升长序列计算效率、降低推理成本。本实践对模型推理代码、融合算子、量化方案与投机推理路径均做了 NPU 适配,整体优化特性、融合 Kernel 细节与性能 Benchmark 可参见 NPU DeepSeek-V4 推理优化实践。
硬件与环境要求
部署前请先核对目标硬件的产品型号、操作系统与驱动版本:
| 项目 | 要求 |
|---|---|
| 产品型号 | Atlas A3 Pod 系列、Ascend 950 系列 |
| 操作系统 | Linux ARM(Atlas A3 Pod)、Linux x86(Ascend 950) |
| 驱动版本 | Ascend HDK 25.5.1 |
安装或升级驱动后,可通过npu-smi info检查 Ascend NPU 固件和驱动是否正确安装,并确认版本是否为25.5.1。如果未安装或版本不符,请先从昇腾社区固件驱动下载页面获取与Ascend HDK 25.5.1匹配的固件和驱动包,并根据社区安装指导自行安装。
CANNLab 一站式开发平台指南
CANNLab 一站式开发平台已预置部署运行环境,使用该平台时请以本章节为准,无需重复执行标准流程中的软件包安装步骤。与自建环境的关键差异如下:
- 模型支持:CANNLab 一站式开发平台环境为 Atlas A3 8 卡环境,仅支持部署 DeepSeek-V4 Flash。
- 环境部署:平台已搭建好运行环境,无需重复安装 CANN、PyTorch 和 torch_npu。
- CANN 路径:CANN 安装路径为
/home/developer/Ascend/cann,涉及cann_path的脚本(如权重转换前的source命令)均需使用此路径。 - YAML 配置:CANNLab 一站式开发平台请使用 deepseek_v4_flash_rank_16_16ep_w8a8_platform.yaml 作为配置文件。由于 CANNLab 一站式开发平台和 A3 Pod 硬件核数差异,本实践不支持多流控核,yaml 配置中
enable_limit_core需设置为False。
以下「环境准备」和「快速启动」章节适用于非 CANNLab 一站式开发平台环境,CANNLab 一站式开发平台用户请根据上述差异调整对应步骤。
环境准备
Atlas A3 Docker 部署
A3 使用预置 ARM 镜像,镜像中已包含本实践所需的 PyTorch、torch_npu、torchair 和 CANN 运行环境。从 A3 ARM 镜像地址下载 docker 镜像后,上传到 A3 服务器的每个节点,并在每个节点执行:
docker load -i cann9.2.0.pt2.9.0_dsv4_aarch_a3_image_custom_20260827.tar拉起 docker 容器
在各个节点上通过如下脚本拉起容器,默认容器名为cann_recipes_infer。请将权重路径和源码路径挂载到容器中:
docker run -u root -itd --name cann_recipes_infer --ulimit nproc=65535:65535 --ipc=host \ --device=/dev/davinci0 --device=/dev/davinci1 \ --device=/dev/davinci2 --device=/dev/davinci3 \ --device=/dev/davinci4 --device=/dev/davinci5 \ --device=/dev/davinci6 --device=/dev/davinci7 \ --device=/dev/davinci8 --device=/dev/davinci9 \ --device=/dev/davinci10 --device=/dev/davinci11 \ --device=/dev/davinci12 --device=/dev/davinci13 \ --device=/dev/davinci14 --device=/dev/davinci15 \ --device=/dev/davinci_manager --device=/dev/devmm_svm \ --device=/dev/hisi_hdc \ -v /home/:/home \ -v /data:/data \ -v /etc/localtime:/etc/localtime \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /etc/ascend_install.info:/etc/ascend_install.info -v /var/log/npu/:/usr/slog \ -v /usr/local/bin/npu-smi:/usr/local/bin/npu-smi -v /sys/fs/cgroup:/sys/fs/cgroup:ro \ -v /usr/local/dcmi:/usr/local/dcmi -v /usr/local/sbin:/usr/local/sbin \ -v /etc/hccn.conf:/etc/hccn.conf -v /root/.pip:/root/.pip \ -v /etc/hosts:/etc/hosts -v /usr/bin/hostname:/usr/bin/hostname \ --net=host --shm-size=128g --privileged \ cann9.2.0.pt2.9.0_dsv4_aarch_a3_image_custom_20260827:latest /bin/bash要点说明:
- 通过
--device=/dev/davinci0~/dev/davinci15将 16 张 NPU 设备逐一映射进容器,同时需要映射davinci_manager、devmm_svm、hisi_hdc等管理设备; --net=host用于多机通信,--shm-size=128g保障大 batch 与长序列场景下的共享内存需求;- 容器名和镜像 tag 必须与上述命令保持一致。
进入容器后,将源码挂载或放置在/home/code/cann-recipes-infer,并按后续「修改配置」和「拉起多卡推理」章节执行。
Atlas A5 部署(非预置镜像环境)
对于没有预置镜像的 x86 环境(对应 Ascend 950 系列),按以下步骤从零搭建:
1. 安装 PyTorch 与 torch_npu
torch_npu为 PyTorch 在 NPU 上运行提供适配,执行:
python -m pip install torch==2.9.0 --index-url https://download.pytorch.org/whl/cpu mkdir -p /tmp/torch_npu_290_daily cd /tmp/torch_npu_290_daily wget -O pytorch_v2.9.0_py311.tar.gz \ "https://pytorch-package.obs.cn-north-4.myhuaweicloud.com/pta/Daily/v2.9.0/20260903.1/pytorch_v2.9.0_py311.tar.gz" tar -xzf pytorch_v2.9.0_py311.tar.gz python -m pip install --no-deps \ ./torch_npu-2.9.0.post7.dev20260903-cp311-cp311-manylinux_2_28_x86_64.whl2. 下载项目源码并安装 Python 依赖
git clone https://gitcode.com/cann/cann-recipes-infer.git cd cann-recipes-infer python -m pip install -r ./models/deepseek_v4/requirements.txtrequirements.txt 中固定了关键依赖版本,例如torch==2.9.0、transformers==4.53.3、compressed-tensors==0.6.0、torchao==0.15.0等,其中compressed-tensors用于解析权重中的量化配置(quantization_config),torchao提供 MX 量化基础算子,与后续权重转换脚本utils/convert_model.py直接相关。
3. 安装 CANN 软件包
本实践依赖 CANN 开发套件包(toolkit)和与目标硬件匹配的二进制算子包(ops),支持 CANN 9.2.0。请从 CANN 下载页面选择对应架构的 weekly 版本,下载后按以下命令依次安装 toolkit 和 ops 软件包:
chmod +x Ascend-cann-toolkit_<version>_linux-<arch>.run ./Ascend-cann-toolkit_<version>_linux-<arch>.run --install chmod +x Ascend-cann-kernels-<product>_<version>_linux.run ./Ascend-cann-kernels-<product>_<version>_linux.run --install多节点部署时,各节点应使用相同的 CANN、驱动和固件版本。CANN 安装完成后,根据实际安装路径加载环境变量:
cann_path=/usr/local/Ascend/cann source "${cann_path}/bin/setenv.bash"新建终端后,重新加载 CANN 环境脚本即可。
4. 配置样例运行环境
修改 executor/scripts/set_env.sh 中的节点 IP 和 CANN 安装路径。其中cann_path需与实际的 CANN 安装路径保持一致,例如/usr/local/Ascend/cann。
快速启动
下载数据集
从公开数据集仓库下载长序列输入数据集longbook_qa_eng(InfiniteBench 子集),并上传到各个节点上新建的路径dataset/InfiniteBench下:
mkdir -p dataset/InfiniteBench下载权重
下载 DeepSeek-V4-Flash 原始 Hybrid FP8-MXFP4 权重或 DeepSeek-V4-Pro 原始 Hybrid FP8-MXFP4 权重,并上传到各节点的某个固定路径下,例如/data/models/deepseek_v4_hybrid_fp8_mxfp4。
转换权重中的 config.json
使用原生 Hybrid FP8-MXFP4 版本权重执行推理时需要执行此步骤,其他场景可跳过。在各个节点上进入models/deepseek_v4目录,使用utils/convert_config.py脚本完成权重路径下 config.json 的转换。
注意:该步骤不会对权重做任何处理,仅将新生成的 config.json 覆盖原始 config.json。如需保留原始 config.json,请自行备份。
如果权重 config.json 转换的运行环境为 NPU,需要先执行:
cann_path=/usr/local/Ascend/cann # cann包安装路径 source ${cann_path}/bin/setenv.bash入参介绍:
--input_fp8_hf_path:原始权重路径;--hif:可选标志,生成 HiF8 量化配置而非默认的 MXFP4 配置(对应 convert_config.py 中的参数解析)。
拉起示例:
python utils/convert_config.py --input_fp8_hf_path /data/models/deepseek_v4从源码实现看,convert_config.py 的核心逻辑是:
- 读取权重目录下的
config.json,获取num_hidden_layers与compress_ratios; - 依据每层的压缩倍率(1 / 4 / 128)生成需要跳过量化的层名列表(如
attn.wq_a、attn.wkv、indexer.compressor.wkv等,见generate_ignore_item); - 生成标准
quantization_config(quant_method: "compressed-tensors"、quantization_status: "compressed"),其中 KV Cache 与 LI Cache 均按 8bit float 格式配置; - 将新生成的
quantization_config写回原 config.json。
这意味着转换后的权重目录可直接被推理框架按 compressed-tensors 规范解析,从而识别出每个算子的量化位宽与策略。
转换权重
原生 Hybrid FP8-MXFP4 权重执行推理时可跳过此步骤。若需要使用INT8、Hybrid INT8-INT4、Hybrid MXFP8-MXFP4 或 Hybrid HiF8-MXFP8-MXFP4权重执行推理,需在各个节点上进入models/deepseek_v4目录,使用utils/convert_model.py脚本完成从 Hybrid FP8-MXFP4 到目标量化格式的权重转换。
入参介绍:
--input_fp8_hf_path:原始权重路径;--output_hf_path:转换后输出的权重路径;--quant_type:量化模式。源码 convert_model.py 支持的可选值为w8a8-int、w4a8-int、bfloat16、w4a8-mx、w4a8-mx-hif,默认w8a8-int;--quant_param_path:量化参数文件夹路径,仅适用于 DeepSeek-V4-Pro 的 Hybrid INT8-INT4 量化。
如果权重转换的运行环境为 NPU,需要先执行:
cann_path=/usr/local/Ascend/cann # cann包安装路径 source ${cann_path}/bin/setenv.bash如果想要获取 DeepSeek-V4-Pro 的 Hybrid INT8-INT4 量化权重,需要预先从量化参数下载地址获取并解压缩对应的量化参数文件(每个层对应一个quant_params_{layer_idx}.pt文件,源码通过load_clip_params按层加载,用于 INT4 量化时的 clip factor 搜索)。
权重转换拉起示例:
# 转换为W8A8-INT8权重,适用于Atlas A3 Pod系列 python utils/convert_model.py --input_fp8_hf_path /data/models/deepseek_v4 --output_hf_path /data/models/deepseek_v4_int8_w8a8 --quant_type w8a8-int # 转换为Hybrid INT8-INT4权重,适用于Atlas A3 Pod系列,DeepSeek-V4-Pro模型 python utils/convert_model.py --input_fp8_hf_path /data/models/deepseek_v4 --output_hf_path /data/models/deepseek_v4_int4_w4a8 --quant_type w4a8-int --quant_param_path /path/to/your_quant_param_folder # 转换为Hybrid MXFP8-MXFP4权重,适用于Ascend 950系列 python utils/convert_model.py --input_fp8_hf_path /data/models/deepseek_v4 --output_hf_path /data/models/deepseek_v4_hybrid_mxfp8_mxfp4 --quant_type w4a8-mx # 转换为Hybrid HiF8-MXFP8-MXFP4权重,适用于Ascend 950系列 python utils/convert_model.py --input_fp8_hf_path /data/models/deepseek_v4 --output_hf_path /data/models/deepseek_v4_hybrid_hif8_mxfp8_mxfp4 --quant_type w4a8-mx-hif结合 convert_model.py 源码可以进一步理解各量化模式的区别:
- 反量化回全精度:脚本首先将 FP8(含 MXFP4 打包格式)权重按对应 scale 反量化为 BF16,其中 MXFP4 权重通过
unpack_mxfloat4_to_fp32拆包、按 block_size=32 反量化(见weight_dequant); - W8A8-INT8(
w8a8-int):对 MoE 路由/共享专家、Attention 的wq_b/wo_b等按 Per-Channel 静态量化,调用int_weight_quant得到 INT8 权重与 FP32 scale; - Hybrid INT8-INT4(
w4a8-int):路由专家 Linear 使用 4bit 量化(per_channel_searching搜索最优 clip 比例),并生成 W4A8 MoEGMM 所需的 assistance bias 与打包后的 UINT64 scale(pack_4bit、int4_assistance_bias、scale_fp32_to_u64); - Hybrid MXFP8-MXFP4(
w4a8-mx):Attention 相关 Linear 使用 MXFP8,MoE 路由专家使用 MXFP4(quantize_mx+pack_uint4); - Hybrid HiF8-MXFP8-MXFP4(
w4a8-mx-hif):在 MX 模式基础上,对 Attention / MTP 的 8bit Linear 使用 HiF8 离线量化(hif8_weight_quant,基于torch_npu.npu_dynamic_quant),共享专家仍保持 MXFP8。
脚本同时会复制原权重目录中的.py/.json/.jinja文件到输出目录,并重写model.safetensors.index.json与config.json,保证转换后的权重目录结构可直接被加载。
修改配置
公共环境脚本(executor/scripts/set_env.sh)
在各个节点上修改公共环境脚本cann-recipes-infer/executor/scripts/set_env.sh中的如下字段:
IPs:离线模式配置所有节点的 IP,按照 rank id 排序,多个节点的 ip 通过空格分开,例如('xxx.xxx.xxx.xxx' 'xxx.xxx.xxx.xxx');PREFILL_IPS/DECODE_IPS:在线 PD 模式分别配置 prefill 和 decode 节点 IP;cann_path:CANN 软件包安装路径,例如/usr/local/Ascend/cann。
模型私有环境脚本(models/deepseek_v4/set_env.sh)
executor/scripts/infer.sh 会先加载公共环境脚本executor/scripts/set_env.sh,然后再继续加载模型私有环境脚本 models/deepseek_v4/set_env.sh。后者负责 source 自定义算子包的环境变量(${ASCEND_HOME_PATH}/opp/vendors/customize/bin/set_env.bash与custom_transformer对应目录),确保自定义融合算子可被正确加载。
YAML 配置
- 在 Atlas A3 Pod 各个节点上修改
config/ci_a3路径下需要执行的 yaml 文件中的model_config.model_path为真实权重路径; - 在 Ascend 950 各个节点上修改
config/ci_950路径下需要执行的 yaml 文件中的model_config.model_path路径; - 通用 YAML 配置说明可参见 YAML 参数描述。
执行后端:npugraph_ex
在 yaml 配置中,默认采用npugraph_ex执行方式(例如ci_a3/deepseek_v4_flash_rank_128_128ep_w8a8.yaml中exe_mode: "npugraph_ex")。这一后端是 NPU 平台全新推出的高性能图计算组件,其基于 CANN 的 AclGraph(对标 CUDAGraph)底层能力,深度融合了一系列 NPU 架构亲和调度和图优化技术。从落地层面来看,npugraph_ex具备以下显著优势:可快速接入 PyTorch 生态、能无缝集成到 SGLang、vLLM 等主流推理框架中,同时保障极致的运行性能。
DeepSeek-V4 专属特性(custom_params)
除框架统一配置之外,DeepSeek-V4 还额外支持以下特性,放置在 YAML 文件model_config的custom_params字段下:
| 参数名 | 类型 | 默认值 | 含义 |
|---|---|---|---|
enable_multi_streams | bool | false | 启用模型内多流并行,主要用于 decode 阶段 MLA、Indexer、Compressor、MoE shared expert 等模块的并行调度。 |
enable_limit_core | bool | false | 在 Atlas A3 上配合多流使用,对部分算子限制 AI Core 数以提升多流重叠效果;开启时要求enable_multi_streams=True,且不支持enable_pypto=True。 |
enable_pypto | bool | false | 启用 PyPTO 算子路径;当前与enable_limit_core互斥。 |
moe_chunk_max_len | int | 65536 | MoE token 分发的最大 chunk 长度,用于长序列 prefill 场景规避 OOM。 |
以仓库中的 deepseek_v4_flash_rank_128_128ep_w8a8.yaml 为例,其custom_params同时开启了enable_multi_streams: True、enable_limit_core: True与moe_chunk_max_len: 65536,对应高吞吐 128 卡 EP 部署场景;而 CANNLab 平台配置 deepseek_v4_flash_rank_16_16ep_w8a8_platform.yaml 则关闭了enable_limit_core,以适配平台核数差异。
多流并行的收益来源在于 Attention 模块天然存在的计算并行空间:Query 计算流与 KV 计算流可以并行,CSA 场景下 LightningIndexer 与 Compressor 无数据依赖。多流方案与相关 Benchmark 的详细分析见 多流并行优化。
CANNLab 一站式开发平台 A3 场景请使用
ci_a3/deepseek_v4_flash_rank_16_16ep_w8a8_platform.yaml,详见 CANNLab 一站式开发平台指南。
Note: 在 A3 环境下,INT8 W8A8 场景支持 4~64 卡部署。可分别在 config 下的 yaml 文件中修改
parallel_config.world_size(chips * 2)配置。
DSpark 投机推理配置
DeepSeek-V4 Flash 支持通过 DSpark 草稿模型一次生成多个 Draft Token,再由主模型批量校验。DSpark 支持 Ascend 950 系列,4 卡离线推理示例为 deepseek_v4_flash_rank_4_4ep_dspark.yaml,实现说明见 DSpark 方案。
与原生 MTP 逐步生成候选不同,DSpark 使用多级 Proposal Layer 生成 Draft Block,并通过 Markov Head 建模模块内 Token 依赖、Confidence Head 给出候选置信度,实现一次草稿模型执行即生成一组候选、主模型批量 Verify 的块级投机解码:
权重准备:
- 将
model_config.model_path设置为配套 DSpark 权重目录,包含主模型和mtp.*草稿权重。使用独立草稿目录时,设置speculative_config.draft_model_path;草稿模型仍共享主模型的 Embedding 和 LM Head,需使用配套权重及相同词表。 - 草稿配置需包含
dspark_target_layer_ids(主模型辅助输出层)和dspark_block_size(每组候选数)。n_mtp_layers表示草稿 stage 数,可由权重目录下的inference/config.json补充,无需在 YAML 中重复设置。
参数配置:
以下字段位于speculative_config,其余配置沿用前文说明。
| 参数名 | 示例值 | 含义 |
|---|---|---|
method | "dspark" | 选择 DSpark;原生 MTP 使用"mtp"。 |
num_speculative_tokens | 5 | 每轮最大候选 Token 数;0关闭投机推理。启用 DSpark 时须与权重的dspark_block_size一致。 |
draft_model_path | "" | 草稿权重目录;空字符串复用model_config.model_path。 |
confidence_threshold | 0.0 | 候选置信度阈值,范围为[0, 1];0关闭前缀截断。 |
draft_temperature | 空值 | 草稿采样温度,非负;空值继承请求温度。主模型温度由data_config.temperature设置。 |
仓库中的 deepseek_v4_flash_rank_4_4ep_dspark.yaml 给出了完整示例:method: "dspark"、num_speculative_tokens: 5、confidence_threshold: 0.0,并行配置world_size: 4,数据配置input_truncated_len: 8192。
DSpark 当前仅支持离线非 PD 分离部署,要求
parallel_config.cp_size=1。置信度截断只调整有效候选前缀,主模型校验宽度仍为num_speculative_tokens + 1。
原生 MTP 兼容
model_config.next_n配置,DSpark 示例使用speculative_config。同时设置model_config.next_n和speculative_config.num_speculative_tokens时,两个参数的数值须保持一致。
拉起多卡推理
以下命令在仓库根目录执行。统一入口脚本位于 executor/scripts/infer.sh,通过以下参数控制启动:
| 参数 | 含义 | 取值示例 |
|---|---|---|
--model | 模型目录名,对应models/下的子目录 | deepseek_v4 |
--mode | 推理模式 | offline/online |
--yaml | 离线模式:yaml 文件名,路径相对models/deepseek_v4/config/ | ci_a3/deepseek_v4_flash_rank_128_128ep_w8a8.yaml |
--pd-role | 在线 PD 模式部署角色 | prefill/decode |
--p-yaml-name | 可选,在线模式 prefill yaml 文件名 | ci_a3/deepseek_v4_pd/prefill.yaml |
--d-yaml-name | 可选,在线模式 decode yaml 文件名 | ci_a3/deepseek_v4_pd/decode.yaml |
在线模式 IP 等更多配置可参考 executor 设计文档 §5.1 启动方式。
使用方式一:命令行传参
# offline 模式,A3 Flash bash executor/scripts/infer.sh --model deepseek_v4 --yaml ci_a3/deepseek_v4_flash_rank_128_128ep_w8a8.yaml # offline 模式,CANNLab A3 bash executor/scripts/infer.sh --model deepseek_v4 --yaml ci_a3/deepseek_v4_flash_rank_16_16ep_w8a8_platform.yaml # offline 模式,Ascend 950 bash executor/scripts/infer.sh --model deepseek_v4 --yaml ci_950/deepseek_v4_flash_rank_16_16ep.yaml # offline 模式,Ascend 950系列,DeepSeek-V4 Flash DSpark bash executor/scripts/infer.sh --model deepseek_v4 --yaml ci_950/deepseek_v4_flash_rank_4_4ep_dspark.yaml # online PD 模式,暂时只支持A3机型 bash executor/scripts/infer.sh --model deepseek_v4 --mode online --pd-role prefill --p-yaml-name ci_a3/deepseek_v4_pd/prefill.yaml --d-yaml-name ci_a3/deepseek_v4_pd/decode.yaml bash executor/scripts/infer.sh --model deepseek_v4 --mode online --pd-role decode --p-yaml-name ci_a3/deepseek_v4_pd/prefill.yaml --d-yaml-name ci_a3/deepseek_v4_pd/decode.yaml如需查看参数说明,可执行bash executor/scripts/infer.sh --help。
从 infer.sh 的脚本实现看,启动流程为:source 公共函数与公共环境脚本 → 按参数覆盖默认值 → source 模型私有set_env.sh→ 通过validate_infer_args.py校验参数合法性 → 依据MODE导出YAML(离线)或P_YAML/D_YAML(在线)→ 调用launch函数拉起推理。
使用方式二:直接修改脚本默认值后执行
编辑executor/scripts/infer.sh,按需修改MODEL/MODE/YAML_FILE/PD_ROLE/P_YAML_NAME/D_YAML_NAME等参数的默认值,例如:
MODEL=deepseek_v4 MODE=offline YAML_FILE=ci_a3/deepseek_v4_flash_rank_128_128ep_w8a8.yaml保存后直接执行:
bash executor/scripts/infer.sh如果是多机环境,需要在每个节点上同步执行拉起命令。
Note:不同平台最小部署单元要求如下
| 平台 | 模型型号 | 推荐量化策略 | 最小部署单元(chips) |
|---|---|---|---|
| Ascend 950 | DeepSeek-V4 Flash | Hybrid MXFP8-MXFP4 | 4 |
| Ascend 950 | DeepSeek-V4 Flash | Hybrid HiF8-MXFP8-MXFP4 | 4 |
| Ascend 950 | DeepSeek-V4 Pro | Hybrid MXFP8-MXFP4 | 16 |
| Atlas A3 | DeepSeek-V4 Flash | INT8 W8A8 | 4 |
| Atlas A3 | DeepSeek-V4 Pro | Hybrid INT8-INT4 | 32 |
配套 YAML 与源码速览
仓库为 DeepSeek-V4 提供了覆盖多场景的完整配置文件,便于直接复用:
| 配置文件 | 平台 | 场景 |
|---|---|---|
| deepseek_v4_flash_rank_128_128ep_w8a8.yaml | Atlas A3 | 128 卡高吞吐 W8A8 离线推理 |
| deepseek_v4_flash_rank_128_128ep_128cp_w8a8.yaml | Atlas A3 | 128 卡 128 CP 长序列 prefill |
| deepseek_v4_flash_rank_16_16ep_w8a8_platform.yaml | Atlas A3 | CANNLab 平台(8 卡物理设备) |
| deepseek_v4_pro_rank_64_64ep_w4a8.yaml | Atlas A3 | Pro 模型 Hybrid INT8-INT4 |
| deepseek_v4_pd/prefill.yaml / decode.yaml | Atlas A3 | 在线 PD 分离部署(eager prefill + npugraph_ex decode) |
| deepseek_v4_flash_rank_16_16ep.yaml | Ascend 950 | 16 卡 Flash(Hybrid MXFP8-MXFP4 权重) |
| deepseek_v4_flash_rank_4_4ep_dspark.yaml | Ascend 950 | 4 卡 Flash DSpark 投机推理 |
与推理直接相关的核心源码包括:
- 模型结构:modeling_deepseek.py(主模型)与 modeling_dspark.py(DSpark 草稿模型);
- 模型模块:modules/(含 Indexer、Compressor、Attention 等子模块与 op_impls/ 下的 GatingTopK、mHC 算子实现);
- 权重与量化工具:utils/convert_config.py、utils/convert_model.py、utils/mx_quantize.py;
- 投机推理 Worker:DSpark 与 MTP 共用投机 Worker 基类,DSpark 的块级候选生成与拒绝采样校验实现在 executor/core/model_worker/dspark_worker.py 与 executor/core/model_worker/base_speculative_worker.py 中。
优化特性与参考 Benchmark
围绕 DeepSeek-V4 的新结构,本实践在 NPU DeepSeek-V4 推理优化实践 中系统介绍了如下优化点,可作为部署调优的背景参考:
- 融合 Kernel:针对多 Layer 交织的 Window / Sparse / Compress Attention 提供 SparseAttnSharedKV(SAS)统一接口;针对不同 Compress Ratio 提供 Compressor 与 CompressEpilog 融合算子;强化 LightningIndexer(LI)算子并新增 Compress Ratio 支持;针对 mHC 架构提供 HCPre / HCPost 融合算子。上述算子的 AscendC 实现与 PyPTO、TileLang 实现均已在仓内开源;
- 并行策略:Prefill 长序列场景使用 Context Parallel(CP)并沿用
zig_zag切分与 128 Token 的 all_gather 通信设计;Decode 场景沿用 Attention DP + MoE EP 并行,LM Head 采用 TP,并可选择性对o_a_proj做 TP 切分以分摊访存; - 量化策略:Atlas A3 Pod 支持 Int8 W8A8(Flash 推荐)与 Hybrid INT8-INT4(Pro 推荐);Ascend 950 系列支持原生 Hybrid FP8-MXFP4 以及硬件亲和的 Hybrid MXFP8-MXFP4、Hybrid HiF8-MXFP8-MXFP4;
- 多流并行:覆盖 Attention 模块、MoE 共享路由、AICPU Scheduler 元数据生成等多个并行机会点;
- MTP:原生多 Token 预测机制,Cache 侧针对 Window KV 与 Compressor 的
kv_state/score_state设计 Ring Buffer,实现少数 Block 的内存复用。
Benchmark 均在离线推理模式(不含 Serving 调度与框架负载均衡影响)下采集,例如950DT平台 16 卡 128K 序列 Flash 场景 TPOT 可低于 10ms、Atlas A3 Pod 64 卡 8K 序列 Decode 单卡吞吐可达 4388 TPS 量级。详细的性能数据、测试条件与接受率说明请以该文档「Benchmark」章节为准,用户可按照数据集实际接受率自行折算。
总结
DeepSeek-V4 在 CANN 平台的部署链路已经高度工程化:从预置镜像(Atlas A3)或手动安装(Ascend 950)的环境准备,到convert_config.py与convert_model.py的权重量化转换,再到 YAML 配置与infer.sh的统一拉起,整个流程均有对应脚本与配置文件支撑。实际部署时只需把握三个关键点:按平台选择正确的量化策略与最小部署单元、将model_path与cann_path等路径配置为真实环境路径、多机场景保持各节点配置一致并同步执行拉起命令。在此基础上,可通过custom_params中的多流并行、PyPTO 算子路径与moe_chunk_max_len等开关,以及 DSpark / MTP 投机推理,进一步压榨昇腾硬件的推理性能。
【免费下载链接】cann-recipes-infer本项目针对LLM与多模态模型推理业务中的典型模型、加速算法,提供基于CANN平台的优化样例项目地址: https://gitcode.com/cann/cann-recipes-infer
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考