资讯动态

DeepSeek与昇腾适配实战:国产大模型在国产算力上的推理部署与性能调优

发布时间:2026/10/13 23:31:45 来源:尧图企业网站定制
1. 国产大模型与国产算力的这次握手到底意味着什么大模型圈子里有个老生常谈的尴尬模型代码开源了权重放出来了但真正想跑起来的时候发现手里那几张卡要么显存不够要么算子不兼容要么推理框架根本不支持。尤其是当你想用国产算力芯片去跑一个国产大模型时这种“两头都是国产、中间却接不上”的割裂感做过部署的人应该都深有体会。DeepSeek 和华为昇腾的这次联手本质上就是在解决这个割裂问题。它不是简单发个公告说“我们适配了”而是把模型在昇腾硬件上的推理链路真正打通了——从算子层面的兼容到推理框架的对接再到实际部署时的性能调优整条路径都做了工程化落地。这意味着你手里如果有一台搭载昇腾 910 系列芯片的服务器现在可以直接把 DeepSeek 的模型拉下来跑推理不需要再折腾各种第三方转换工具也不用担心跑着跑着突然报一个算子不支持的错。这件事的影响范围其实比表面看起来要大。对于做私有化部署的团队来说以前选模型和选硬件是两条独立的决策线——模型看效果硬件看预算和供货。现在这两条线开始交汇了你可以在国产芯片上跑国产模型整条技术栈的自主可控程度往前迈了一大步。对于做推理服务优化的工程师来说昇腾的 CANN 工具链和 DeepSeek 的模型结构之间有了官方级的适配意味着你可以把精力放在调 batch size、调并发、调显存分配这些真正影响吞吐的事情上而不是天天跟算子兼容性打架。这篇文章适合几类人看一是正在做大模型私有化部署、需要评估国产算力方案的架构师二是对推理性能优化感兴趣、想了解昇腾平台调优思路的工程师三是关注国产大模型生态进展、想搞清楚“适配”两个字背后到底做了哪些工作的技术决策者。我会从适配的技术路径、实操部署的关键步骤、性能调优的核心参数、以及实际落地中容易踩的坑这几个角度把这件事拆开来讲清楚。2. 适配背后的技术账为什么国产模型跑国产芯片不是一句话的事2.1 算子兼容模型结构里的每一个计算都要有对应的硬件实现大模型推理的本质是一连串张量计算的堆叠。Transformer 结构里涉及的计算类型其实不算特别多——矩阵乘法、层归一化、激活函数、注意力机制里的 softmax 和 scaling、位置编码的旋转操作等等。但问题在于不同模型在实现这些计算时会有细微差别。比如同样是层归一化有的模型用标准 LayerNorm有的用 RMSNorm同样是注意力有的用标准 MHA有的用 GQA 或 MQA。这些变体在 CUDA 生态里通常有现成的算子库覆盖但换到昇腾的 CANN 平台上就需要确认每一个变体都有对应的算子实现。DeepSeek 的模型结构里有几个比较特殊的地方。一是它用了细粒度的专家混合架构MoE 层的路由计算和专家调度逻辑对算子融合的要求比较高二是它的注意力实现里有一些自定义的 mask 处理方式不是标准的 causal mask 那么简单。这些细节在适配昇腾时要么找到对应的算子直接映射要么通过算子组合的方式来实现。昇腾的 CANN 提供了算子开发框架允许在必要时自定义算子但自定义算子的性能调优又是另一回事了。实操心得如果你在昇腾上跑某个模型时遇到算子不支持的报错先别急着写自定义算子。第一步应该是查 CANN 版本对应的算子支持列表很多时候升级一下工具链版本就能解决。第二步是看能不能用现有算子组合替代比如某些特殊 mask 可以用矩阵乘法加加法来模拟。最后才考虑自定义算子开发因为自定义算子的性能往往不如官方优化过的版本。2.2 推理框架对接从模型加载到请求调度的全链路打通算子兼容只是第一层。模型要在昇腾上跑起来还需要推理框架的支持。DeepSeek 官方支持的推理框架包括 vLLM、SGLang 等这些框架原本主要是针对 CUDA 生态设计的。要在昇腾上跑就需要把这些框架的底层计算后端从 CUDA 切换到昇腾的 CANN。这个切换过程涉及几个关键环节。首先是设备管理框架需要能正确识别昇腾设备并分配显存。其次是内存管理昇腾的显存分配策略和 CUDA 有差异框架的内存池实现需要做适配。然后是计算图执行框架生成的算子调用需要能正确路由到 CANN 的运行时。最后是通信层如果是多卡推理还需要适配昇腾的 HCCL 通信库来替代 NCCL。DeepSeek 和昇腾的这次合作应该是把这条链路上的关键节点都做了官方适配。具体来说可能是昇腾版的 vLLM 或类似的推理服务框架能够直接加载 DeepSeek 的模型权重在昇腾芯片上完成推理计算并通过标准的 OpenAI 兼容接口对外提供服务。这样一来上层应用不需要关心底层是 CUDA 还是 CANN调用方式完全一致。2.3 性能调优适配只是起点跑得好才是目标适配完成、模型能跑起来这只是及格线。真正体现工程价值的是性能——同样的硬件配置下能不能达到接近 CUDA 生态的吞吐和延迟表现。昇腾 910 系列芯片在 FP16 和 INT8 精度下的算力理论值不低但实际推理性能取决于很多因素。显存带宽是否充分利用、算子融合是否到位、batch size 是否合理、KV Cache 的管理策略是否高效这些都会显著影响最终的 tokens/s 指标。DeepSeek 的 MoE 结构在这方面有天然优势——每次推理只激活部分专家计算量比同等参数量的稠密模型小很多但 MoE 的调度开销和专家并行的通信开销又是新的挑战。在昇腾平台上做 MoE 推理一个关键问题是专家权重的分布和调度。如果专家数量多、每个专家的参数量小那么权重加载和切换的开销可能成为瓶颈。昇腾的显存带宽和片上缓存设计会影响这个过程的效率。实际调优时可能需要调整专家的分组策略或者利用昇腾的某些硬件特性来做专家计算的流水线化。3. 从零到一在昇腾平台上部署 DeepSeek 推理服务的完整路径3.1 环境准备驱动、固件与工具链的版本对齐在昇腾上部署任何模型之前第一步永远是确认环境版本。昇腾的软件栈包括驱动、固件、CANN 工具链、以及上层的推理框架这几个组件的版本必须严格匹配。版本不匹配是导致各种诡异报错的首要原因。具体来说你需要确认以下几项昇腾 NPU 驱动版本通过npu-smi info命令查看这个命令类似于 NVIDIA 的nvidia-smi能显示芯片型号、显存占用、温度等信息。固件版本同样通过npu-smi info查看固件版本和驱动版本有对应关系。CANN 版本通过cat /usr/local/Ascend/ascend-toolkit/latest/version.cfg查看CANN 是昇腾的计算架构层相当于 CUDA 的角色。Python 版本和 PyTorch 版本昇腾版的 PyTorch 是专门适配过的分支不是官方 PyTorch 直接安装就能用。注意昇腾环境最忌讳的就是“我觉得版本差不多就行”。驱动和 CANN 之间、CANN 和 PyTorch 适配层之间、PyTorch 适配层和推理框架之间都有严格的版本对应关系。建议直接使用华为官方提供的容器镜像里面已经把版本对齐做好了能省掉大量排查时间。3.2 模型权重准备与格式转换DeepSeek 的模型权重在发布时通常是 PyTorch 的 checkpoint 格式包含多个分片的 safetensors 文件。在昇腾上使用之前可能需要做一步格式转换把权重转换成昇腾推理框架能直接加载的格式。这个转换过程通常包括合并分片权重、转换数据类型比如从 FP32 转 FP16 或 BF16、以及可能的算子融合预处理。昇腾提供了模型转换工具支持从 PyTorch 的 ONNX 导出再转成昇腾的离线模型格式但对于大模型来说更常见的做法是直接在推理框架里加载原始权重由框架在运行时完成图优化和算子映射。实际操作中你需要准备好模型的配置文件config.json、分词器文件tokenizer.json 等、以及所有权重分片。然后通过推理框架提供的加载接口指定模型路径和昇腾设备框架会自动完成后续的加载和初始化过程。3.3 推理服务启动与接口验证模型加载完成后下一步是启动推理服务。以 vLLM 风格的框架为例启动命令通常需要指定几个关键参数python -m vllm.entrypoints.openai.api_server \ --model /path/to/deepseek-model \ --device npu \ --tensor-parallel-size 4 \ --max-model-len 8192 \ --dtype bfloat16 \ --port 8000这里的--device npu是关键它告诉框架使用昇腾设备而不是 CUDA。--tensor-parallel-size指定张量并行的卡数需要根据实际可用的昇腾芯片数量来设置。--max-model-len是模型支持的最大序列长度这个值会影响 KV Cache 的显存占用需要根据显存容量来调整。服务启动后可以通过 curl 命令验证接口是否正常工作curl http://localhost:8000/v1/completions \ -H Content-Type: application/json \ -d { model: deepseek-model, prompt: 介绍一下昇腾芯片的架构特点, max_tokens: 128, temperature: 0.7 }如果返回了正常的生成结果说明推理链路已经打通。接下来就可以用更复杂的请求来测试并发能力和长序列处理能力。3.4 性能基准测试建立可对比的指标基线服务跑通之后别急着上生产。先做一轮基准测试建立性能基线。需要关注的指标包括指标含义测量方法首 token 延迟从发送请求到收到第一个 token 的时间单请求测试记录时间差输出吞吐每秒生成的 token 数固定 batch size统计总 token 数除以总时间并发吞吐多请求同时处理时的总吞吐逐步增加并发数观察吞吐变化显存占用模型加载后和推理时的显存使用量通过 npu-smi 监控长序列性能输入长度增加时的延迟变化测试不同输入长度下的首 token 延迟这些指标的意义在于当你后续做调优时有一个明确的对比基准。比如调整了 batch size 之后吞吐提升了多少换了 KV Cache 的量化策略之后显存节省了多少。没有基线数据调优就是盲人摸象。4. 调优实战让 DeepSeek 在昇腾上跑得更快更稳4.1 显存优化KV Cache 的量化与分页管理大模型推理的显存瓶颈往往不在模型权重本身而在 KV Cache。以 DeepSeek 的某个版本为例模型权重可能占 30GB 左右但在处理长序列和高并发时KV Cache 的占用可能轻松超过权重本身。昇腾平台上的 KV Cache 优化有几个方向。一是量化把 KV Cache 从 FP16 降到 INT8显存占用直接减半代价是轻微的精度损失。实测下来对于大多数对话场景INT8 的 KV Cache 对输出质量的影响几乎不可感知。二是分页管理借鉴操作系统的虚拟内存思路把 KV Cache 分成固定大小的块按需分配和回收避免显存碎片化。三是前缀共享对于系统提示词相同的多个请求共享同一份 KV Cache减少重复计算和存储。实操心得KV Cache 量化在昇腾上需要确认 CANN 版本是否支持对应的量化算子。如果工具链版本较老可能只能做 FP16 的 KV Cache这时候就需要通过限制并发数或序列长度来控制显存。建议在服务启动参数里设置--gpu-memory-utilization昇腾上可能是类似的参数来限制显存使用比例留出余量给系统和其他进程。4.2 计算优化算子融合与流水线并行昇腾芯片的算力要充分发挥算子融合是关键。所谓算子融合就是把多个连续的小算子合并成一个大的计算核减少 kernel launch 的开销和中间结果的显存读写。在 Transformer 推理中常见的融合模式包括LayerNorm 矩阵乘、注意力计算中的 QKV 投影融合、以及 MoE 层中的专家计算融合。DeepSeek 的 MoE 结构在算子融合方面有特殊考量。每个 token 会被路由到不同的专家如果每个专家的计算都单独 launch 一个 kernel调度开销会非常大。优化的做法是把多个专家的计算合并成一个 batched GEMM或者利用昇腾的某些硬件特性来做专家计算的流水线化。具体来说可以在专家计算的同时预取下一个专家的权重让计算和访存重叠起来。另一个优化方向是流水线并行。如果模型太大单卡放不下就需要把模型的不同层分配到不同的卡上形成流水线。昇腾的 HCCL 通信库支持这种并行模式但流水线的效率取决于层与层之间的计算量是否均衡以及通信是否能和计算重叠。实际配置时需要根据模型的结构和卡的数量来划分流水线阶段尽量让每个阶段的耗时接近。4.3 调度优化批处理策略与请求排队推理服务的吞吐不仅取决于单次计算的速度还取决于请求的调度策略。连续批处理是当前主流的做法不等一个 batch 里的所有请求都完成而是动态地把新请求插入到正在执行的 batch 中让 GPU/NPU 始终保持忙碌。在昇腾上实现连续批处理需要框架层面的支持。vLLM 的 PagedAttention 机制就是为这个场景设计的它把 KV Cache 分页管理使得不同请求的 KV Cache 可以非连续存储从而支持动态的 batch 组合。昇腾版的推理框架如果移植了这套机制那么调度效率应该和 CUDA 版本接近。实际调优时需要关注的参数包括最大 batch size、最大并发请求数、以及请求排队的超时时间。最大 batch size 受限于显存需要根据 KV Cache 的占用来反推。最大并发请求数则影响排队延迟设得太小会导致请求被拒绝设得太大又会让每个请求的响应变慢。这些参数没有万能值需要根据实际业务场景的 QPS 和延迟要求来调。5. 踩坑记录昇腾部署 DeepSeek 时最容易遇到的几个问题5.1 算子不支持报错从报错信息定位到具体算子最常见的报错就是算子不支持。昇腾的报错信息通常会包含算子名称和输入张量的形状信息。比如类似The operator [XXX] is not supported on Ascend这样的提示。看到这种报错第一步是确认这个算子是否在 CANN 的支持列表里。如果不在就需要考虑用其他算子组合来替代或者升级 CANN 版本看是否新增了支持。有些算子虽然在支持列表里但对输入的形状或数据类型有限制。比如某些算子只支持 FP16 不支持 BF16或者只支持 4D 张量不支持 3D。这种情况下需要在模型加载时做数据类型转换或者在模型结构里插入 reshape 操作来满足算子的形状要求。注意不要盲目地给所有算子都写自定义实现。自定义算子虽然能解决兼容性问题但性能往往不如官方优化过的版本。优先考虑用现有算子组合替代实在不行再走自定义开发的路子。5.2 显存不足从权重加载到 KV Cache 的全链路排查显存不足的报错可能出现在两个阶段模型加载阶段和推理执行阶段。加载阶段显存不足通常是因为模型权重太大单卡放不下。这时候需要启用张量并行把权重切分到多张卡上。推理阶段显存不足则多半是 KV Cache 占用过高需要降低并发数或序列长度或者启用量化。排查显存问题时npu-smi info是主要工具。它能看到每张卡的显存总量和已用量。但要注意框架报告的显存占用和 npu-smi 显示的可能有差异因为框架有自己的内存池管理。建议在服务启动后、接收请求前先记录一次显存基线然后在压测过程中持续监控观察显存增长趋势。5.3 性能不达预期从计算、访存、通信三个维度定位瓶颈如果服务能跑但性能明显低于预期需要做瓶颈定位。昇腾提供了性能分析工具可以采集算子执行时间、显存带宽利用率、通信耗时等数据。分析时重点关注三个维度计算瓶颈某个算子的执行时间特别长或者 NPU 利用率一直上不去。可能是算子没有融合好或者计算精度设置不当。访存瓶颈显存带宽利用率接近饱和但计算单元利用率不高。可能是模型权重的访存模式不友好或者 KV Cache 的读写太频繁。通信瓶颈多卡推理时卡间的通信时间占比过高。可能是张量并行的切分方式不合理或者 HCCL 的配置需要调整。定位到瓶颈之后再针对性地做优化。计算瓶颈就做算子融合或换更高效的实现访存瓶颈就调整数据布局或启用量化通信瓶颈就优化并行策略或通信配置。6. 这件事对开发者的实际影响和我的一些判断从实际落地的角度来看DeepSeek 和昇腾的这次适配最大的价值是给做私有化部署的团队提供了一个经过验证的组合方案。以前你要在昇腾上跑一个国产大模型需要自己踩一遍算子兼容、框架适配、性能调优的坑周期长、风险高。现在有了官方级的适配至少模型加载和基础推理这条链路是通的你可以把精力集中在业务层面的优化上。对于做推理服务开发的工程师来说这意味着你需要开始了解昇腾的工具链和调优方法。CANN 的算子开发框架、HCCL 的通信配置、npu-smi 的监控指标这些和 CUDA 生态里的对应工具虽然思路相似但具体操作和参数体系有差异。早点熟悉这套东西在国产算力逐渐普及的趋势下会是一个有竞争力的技能点。我在实际测试中体会比较深的一点是昇腾平台上的性能调优很多时候是在做“减法”而不是“加法”。CUDA 生态里有很多成熟的优化技巧可以直接套用但在昇腾上你需要先确认哪些技巧是适用的哪些会因为硬件架构差异而失效。比如某些在 CUDA 上效果很好的算子融合模式在昇腾上可能因为片上缓存的容量和带宽不同反而导致性能下降。这种时候就需要回到硬件架构本身去分析而不是盲目照搬经验。最后分享一个小技巧在昇腾上做性能调优时建议先用小模型比如 1B 到 3B 参数量的模型快速验证调优思路确认有效之后再上大模型。因为大模型的加载和推理测试周期长如果每个想法都直接在大模型上验证迭代速度会非常慢。小模型上验证过的参数配置和优化策略在大模型上通常也是适用的只是具体数值需要重新调整。

读完文章,也想定制专属网站?

尧图设计师 24 小时内与您沟通定制方案

免费获取报价 →
↑