前阵子我们接了个有意思的活把 DeepSeek-R1 这个 6710 亿参数的 MoE 模型部署到四台昇腾服务器上对外提供推理服务。项目排期很紧团队里还有第一次摸昇腾的新人从昇腾有哪些 GPU 型号这种问题开始问起我光是纠正那叫 NPU 不叫 GPU就纠正了不下五遍。但做完之后回头再看整个部署过程其实可以压缩成一条极简流水线确认硬件、选对部署栈、做好权重分片、一步到位拉起多机服务。这篇文章就是把这条流水线完整拆开给你看每一步怎么选的、为什么这么选以及我们实际踩过的那些坑。如果你手头正好有昇腾集群正打算部署 DeepSeek 系列或者同类超大 MoE 模型又不想在环境配置和分布式细节上耗掉两三个星期那这篇应该能帮你省下大量时间。我默认你至少有基本的 Linux 操作经验也装过昇腾驱动和 CANN但即使你连这些都没碰过照着路线走也能少走很多弯路。1. 先把门槛看清楚昇腾跑超大MoE模型的三个真实难点1.1 第一个难点昇腾不是GPU心智模型要换很多人搜昇腾系列有哪些 GPU这个搜索词本身就是错的。昇腾是华为的 AI 处理器属于 NPU不是 GPU。它用的是达芬奇架构编程模型、算子实现、内存管理逻辑跟 CUDA 都不一样。这意味着什么意味着你在 GPU 上形成的很多习惯不能直接搬过来。查显存不能用nvidia-smi要用npu-smi info多机集合通信不是 NCCL是 HCCLPyTorch 代码想跑昇腾得先import torch_npu然后通过npu.xxx接口把张量和模型搬到昇腾设备上。这个心智模型不换过来后面每一步都会觉得别扭。我们团队一个新人照着 GPU 部署教程把devicecuda改成devicenpu就以为完事了结果算子全部落到 CPU 上性能惨不忍睹。正确的认知应该是昇腾有自己的编译器栈CANNPyTorch 程序要经过torch_npu适配层才能把算子下发到 NPU 上执行。部署大模型时更要尽量使用昇腾官方或社区深度适配过的推理引擎而不是自己手撕算子。1.2 第二个难点671B参数带来的显存压力DeepSeek-R1 是一个 MoE 架构模型总参数 671B每次激活的参数大约 37B。很多人一听激活参数才 37B就觉得单卡能跑这是个严重的误解。激活 37B 指的是每条 token 只经过部分专家网络但整个模型的权重依然要完整加载到显存里一点都不能少。用 FP16 粗略估算671B × 2 字节 ≈ 1.34TB 权重这还没算 KV Cache、激活值、中间缓冲。也就是说即使不考虑计算光把模型权重装进显存也需要至少 1.34TB 的显存容量。昇腾 910B 单卡 HBM 常见是 64GB310P3 这类推理卡显存更小从十几 GB 到二十几 GB 不等。单卡肯定装不下四卡也不够必须上多机多卡分布式推理。以 64GB 卡为例最理想情况下也要 21 张卡才能装下纯权重再算上 KV Cache 等运行时开销实际通常要 24 卡起步。我们用的是四台八卡服务器一共 32 张卡正好落在可行区间内。1.3 第三个难点多机分布式推理的隐形复杂度如果你只在一台机器上部署过模型可能觉得多机就是把启动命令多跑几遍。真正上手就会发现多机分布式推理至少有四层隐形复杂度第一层是通信拓扑。机间通信需要 RDMA/RoCE 这类低延迟网络普通千兆网卡跑大模型会让集合通信直接变成瓶颈一个 all-reduce 卡几分钟都是正常的。第二层是任务编排。哪个进程跑在哪个节点、哪张卡上rank 号和 IP 怎么对应都需要一个清晰的全局规划。第三层是模型切分。MoE 模型的专家层可以按专家维度切分EPExpert Parallelism这部分由推理引擎自动处理但你要理解它的切分规则否则很容易出现某几张卡显存爆满、另外几张卡空转的情况。第四层是版本兼容。多机多卡环境下驱动、固件、CANN、推理引擎任何一个版本对不上报错都会千奇百怪。这就是为什么倍简化这件事有价值。昇腾生态已经把这些复杂度封装进了官方推理引擎我们要做的不是重新发明部署方案而是顺着官方支持的路径把决策点收敛到最少。2. 硬件确认与机间拓扑动手前的决策表2.1 选卡310P3还是910B昇腾系列里310P3 和 910B 是两代定位差异很大的产品。310P3 偏边缘推理单卡算力和显存都有限适合轻量级模型、单机多卡或低并发场景910B 是数据中心主力算力和 HBM 容量都大得多适合大模型训练和大规模推理。维度昇腾310P3昇腾910B定位边缘推理、轻量场景数据中心训练/推理显存十几GB级别视型号而定常见64GB HBM算力中低高大模型推理适合量化后的较小模型适合超大MoE模型多机部署购买/运维成本较低较高我们的场景是 671B 模型多机推理最终用了 910B 机器。310P3 在本文里重点讨论的是精度选型问题因为不少边缘场景会拿它做量化推理下面第 5 节专门讲。如果你手里只有 310P3又想跑 DeepSeek-R1那基本只能走 INT8/INT4 量化加激进模型切分的路线效果会打折扣不是特别推荐。2.2 机间网络没有RDMA就别谈多机推理多机推理对机间网络的要求远比大多数人想象的高。大模型分布式推理过程中每生成一个 token各节点之间都要同步中间状态这个通信频率极高。普通千兆以太网在这种负载下会直接把吞吐拉垮。昇腾多机场景里最常用的是 RoCERDMA over Converged Ethernet也就是在以太网上跑 RDMA 协议。部署前你需要确认每台机器的 RoCE 网卡驱动是否正常加载交换机是否开启 PFC 流控避免丢包节点之间的 IP 能不能直接互通防火墙是否放行 HCCL 需要的端口。多机的节点拓扑信息通常用 rank table 文件描述里面记录每个节点的 IP、device ID、rank 号。这个文件是整个多机配置的核心我习惯在动手前用一张表格手工整理一遍再生成配置文件避免落差。2.3 一个够用的规模评估方法很多人一上来就问我需要几台机器这里给一个偏保守的估算方法模型总参数亿× 每个参数的字节数 权重显存需求除以单卡可用显存向上取整得到最少卡数再乘以 1.2~1.3 的系数把 KV Cache、激活值、临时缓冲的空间留出来最后根据并发需求往上加因为 KV Cache 是并发量越大占用越高。以 DeepSeek-R1 为例671B 参数FP16 就是约 1341GB 权重。单卡 64GB忽略其他开销的最少卡数是 21 张加上运行时开销24~32 张比较稳妥。四机八卡共 32 卡这个配置刚好是可以接受的方案。如果目标并发只有个位数32 卡甚至能有富余如果要支撑高并发那还要继续加节点。3. 部署栈锁定CANN、推理引擎与容器化3.1 CANN版本与驱动匹配是玄学但可以不玄昇腾整个软件栈里最容易让人崩溃的就是版本匹配。固件、驱动、CANN Toolkit、torch_npu、推理引擎每一层都有自己的版本号官方支持矩阵里的组合才靠谱。如果版本不匹配常见的症状是npu-smi info正常但程序一跑就报算子编译错误或者干脆找不到设备。我的建议是不要自己配组合直接用容器。昇腾官方和生态社区维护了带 CANN 的镜像镜像里哪一层版本和哪一层版本匹配是被验证过的你只需要基于镜像再叠加推理引擎即可。这能省掉大量排查时间。装完之后记得做一个冒烟测试npu-smi info python3 -c import torch, torch_npu; print(torch_npu.__version__); print(torch_npu.npu.device_count())如果这两条命令顺利通过说明底层环境基本没问题后面可以放心往后走。3.2 推理引擎选择MindIE为主vLLM-Ascend为辅昇腾上跑 DeepSeek 这类超大模型业界主流有两条路线华为官方的 MindIE以及社区适配的 vLLM-Ascend。MindIE 是华为的推理引擎针对昇腾硬件做了深度优化对多机多卡、MoE 专家并行、KV Cache 管理这些都有专门支持性能通常是最好的。代价是需要跟着官方工具链走配置文件格式、模型转换流程都是自成一体。vLLM-Ascend 是 vLLM 在昇腾上的移植版本好处是如果你熟悉 vLLM上手几乎零成本API 也是兼容 OpenAI 格式的社区案例多。但在超大 MoE 模型的多机性能上不一定有 MindIE 调得那么极致。维度MindIEvLLM-Ascend性能官方深度优化通常更优社区适配持续演进上手难度配置规范学习成本中等熟悉vLLM则上手极快API自带服务化组件兼容OpenAI风格API多机MoE支持专家并行等特性完善支持多机细节需实测适合场景生产环境追求极致性能快速验证、已有vLLM经验团队我们这次生产部署选了 MindIE同时保留 vLLM-Ascend 作为备用对比方案。如果你的目标只是先跑通看效果可以直接从 vLLM-Ascend 开始路径更平滑。3.3 容器化锁定环境多机部署唯一解多机部署最怕的就是每台机器环境不一样。A 机器驱动新一点、B 机器 CANN 旧一点最终表现就是同一条命令在 A 上成功、在 B 上报错。容器化是解决这个问题的最简单方式。昇腾容器需要安装 Ascend Docker Runtime启动容器时把 NPU 设备映射进去。一个典型的启动命令大概长这样docker run -itd \ --name deepseek-r1-infer \ --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/davinci_manager \ --device/dev/hisi_hdc \ -v /usr/local/Ascend/driver:/usr/local/Ascend/driver \ -v /data/models:/models \ --nethost \ ascend-mindie:latest--nethost很重要多机分布式通信依赖节点间直接通过网络互联host 网络模式可以避免 NAT 带来的通信问题。所有节点用同一个镜像、同一套启动参数环境一致性就有了保障。4. 倍简化核心操作从模型权重到多机服务的四步法4.1 第一步权重转换与分片MindIE 通常不能直接读 HuggingFace 格式的原始权重需要先做一次离线转换转成 MindIE 的模型格式。这一步会把原始权重重新打包同时按你指定的并行策略分片。分片策略里最关键的是专家并行数EP。DeepSeek-R1 是 MoE 模型专家层的专家数量非常大把这些专家平均分配到多张卡上推理时每条 token 只去对应卡上找专家这就是专家并行的核心思想。EP 数通常和总卡数呈倍数关系比如 32 卡可以设 EP8、TP4或者 EP16、TP2具体组合要看显存和通信带宽的平衡。转换工具的命令参数各个版本有差异但核心输入无非是三件事原始权重路径、输出路径、并行策略配置。转换完成后检查一下分片文件大小是否均匀如果某一两个分片文件明显偏大说明切分布均匀后续大概率会出现显存倾斜。4.2 第二步多机配置生成多机配置文件是整个部署的总指挥它决定了哪个进程跑在哪台机器的哪张卡上。我们需要为每个节点分别准备配置段包含本节点 IP、本节点设备列表、全局 rank 范围。生成方式可以采用脚本自动化但开始建议手写一遍以加深理解。到了这一步倍缩化的效果就体现出来了有了统一的配置模板换模型、换节点规模都只是改参数的事不需要回到裸机环境重新折腾。4.3 第三步启动服务启动多机推理有两种常见姿势。第一种是各节点分头启动。在每台机器上进入容器执行引擎的启动命令加载对应的配置段。这种方式适合人工排查问题但启动顺序有讲究通常先启 rank 0 所在节点再启其他节点否则后启动的节点会因为连不上 rank 0 而反复重试。第二种是统一入口脚本。在管理节点上写一个 deploy 脚本通过远程命令在所有节点上同时启动。由于我们已经用容器锁定了环境远程启动只需要保证统一的容器名和挂载路径即可。脚本大致思路如下# deploy.sh for host in 192.168.1.10 192.168.1.11 192.168.1.12 192.168.1.13; do ssh $host docker exec deepseek-r1-infer /start_infer.sh $host done wait我强烈建议用第二种方式多机场景下手动敲命令容易漏节点漏一个节点整个分布式任务就挂掉最后还得满世界查日志。4.4 第四步请求验证服务启动后先用最简单的请求验证连通性再用并发工具压测。最简单的验证方式是 curl 一发curl -X POST http://任意节点IP:8080/v1/chat/completions \ -H Content-Type: application/json \ -d { model: deepseek-r1, messages: [{role: user, content: 11?}], max_tokens: 32 }这里有个小技巧多机部署完成后任意节点的 IP 都可以访问服务入口因为服务化组件会做请求分发。第一次验证推荐指定非 rank 0 节点的 IP确认请求确实能横跨节点转发而不只是在单机上自嗨。5. 精度选型实测310P3上的FP16与INT85.1 精度模式的选择逻辑热词里有人问昇腾310P3使用什么精度这个问题不是拍脑袋问的。310P3 这类推理卡算力相对有限显存也小跑大模型必须在精度和容量之间做权衡。从原理上说模型权重的数据精度决定了显存占用和计算量。FP16 是两字节INT8 是一字节INT4 是半字节。精度越低显存占用越小但量化误差会引入质量损失。昇腾推理引擎支持对权重做 INT8/INT4 量化同时对 KV Cache 也可以做整数化压缩进一步提升并发能力。一个需要特别注意的点是310P 系列对 BF16 的支持没有 910B 那么完善。如果你在 GPU 习惯上用 BF16到了 310P3 上不要强行 BF16很多算子可能没有 BF16 实现导致运行回退到低效路径。FP16 是 310P3 上最稳妥的高精度选择再往下压就直接走 INT8/INT4。5.2 实测对比我们在 310P3 上用小规模 DeepSeek 蒸馏模型做了 FP16 和 INT8 的对比实验结果很有参考价值指标FP16INT8权重显存占用基准约为基准的50%首token延迟基准略降低单卡可并发较低明显提升输出质量基准小幅下降专业任务偶见误差部署难度无需量化直接跑需要量化步骤与校准数据集结论很清晰如果你追求极致精度且显存充足用 FP16如果显存紧张或者并发要求高INT8 是性价比较高的选择。对于 671B 的 DeepSeek-R1 这种超大规模模型想在 310P3 上部署几乎只有 INT4 配合激进切分这条路效果确实不如 910B 集群但作为一种低成本方案也有它的适用场景。还有一点经验值得说量化不是简单地把 FP16 权重取整为 INT8 就完事通常需要一个校准过程用一小批有代表性的数据计算量化 scale 和 zero point。昇腾的量化工具链对这一步有支持实测中用百来条中文问答数据做校准效果已经足够。6. 踩坑实录多机推理最容易翻车的三个环节6.1 多机通信一个PFC配置让我排查了两天第一次做多机拉起时模型加载正常但一进入生成阶段就卡死日志里全是集合通信超时。排查链路是这样的先 ping 节点 IP通再用 RDMA 带宽工具测机间延迟发现时高时低出现大量重传。这基本锁定了问题方向不是物理链路而是协议层面的流控问题。最后检查交换机配置发现 PFC 流控没开RDMA 报文在拥塞时被静默丢弃而 TCP 有重传机制能自动恢复RDMA 不行一丢包就卡死。后来把交换机的 PFC 打开重新压测通信延迟稳定了模型生成也恢复正常。这个坑在单机测试时完全无法暴露所以多机部署前一定要单独跑一遍 RDMA 通信验证不要直接上模型。6.2 显存分配不均有人撑死有人饿死四机 32 卡全量加载后从npu-smi info看到一组很魔幻的数据一部分卡显存占用 95%另一部分卡只有不到 30%。加载完权重后所有卡空闲显存差异极大最终表现为并发一上来显存满的卡直接 OOM显存空的卡闲得发慌。这里要分两层看第一层是权重分片本身是否均匀回第一步检查转换产物的分片文件大小第二层是推理引擎的运行时分配策略MoE 模型里某些路由逻辑会导致专家负载天然不均匀需要在配置里调整 EP 粒度或让引擎动态均衡。我们最终的解法是调整并行策略把 EP 数从 16 降为 8同时配合 TP整体显存分布均匀了很多。所以遇到显存倾斜不要急着加机器先检查切分和并行策略配置往往改一个参数就解决了。6.3 swift megatron的适配注意点热词里有昇腾npu swiftmegatron实战这里顺带说清楚一个生态分工问题。swift 是微调框架适合在昇腾上做 LoRA/全参微调它不是推理引擎Megatron 是训练/微调场景的框架昇腾上有对应的适配版本但在纯推理场景里你并不需要它。如果你在推理部署过程中看到 swift 或 megatron 相关教程要确认它的目标场景是训练/微调还是推理。混用会把部署栈搞得很臃肿之前有同学把微调阶段的 torch_npu 环境直接拿来跑推理结果算子版本和推理引擎打架最后只能重建容器。正确分工是推理用 MindIE 或 vLLM-Ascend微调用 swift大规模训练才考虑 Megatron 系。如果确实要在昇腾上把 swift 和 Megatron 配合使用建议先确认两个组件各自的适配版本以及它们对 CANN 版本的要求。最好在同一个镜像里一次装齐避免后续升级一角带崩全局。个人经验体会整套部署走下来我最深的感受是昇腾生态在快速成熟但它的成熟方式跟 GPU 生态不太一样它更像一个高度封装的黑盒你必须顺着官方设计的路径走走偏了代价极大。而倍简化的核心思路就是把所有能交给官方工具链的环节全部交出去自己只保留四个决策点——硬件型号、网络配置、并行策略、精度模式。把这四个决策点想清楚多机部署大型模型就不是什么玄学。最后再分享一个小技巧无论你用哪种推理引擎多机部署成功之后第一件事不是压测性能而是把整套启动命令、配置文件、镜像版本号完整备份下来。我见过太多团队部署完就忘记师出何处下次扩容要重新摸一遍版本依赖。昇腾这个生态版本问题反复出现一份清晰的版本清单比什么优化技巧都管用。