H34

昇腾 NPU

点击正文段落选定收藏或划线位置;未选定时使用屏幕内第一段。

课内目录

1 昇腾 NPU 要理解什么

把训练或推理任务放到昇腾设备上,首先要分清芯片、板卡和整机。NPU 是面向神经网络计算的处理器类别,昇腾是其中的产品系列。芯片提供计算与片上存储,板卡增加供电、散热和外部接口,服务器再把 CPU、主机内存、系统盘、数据盘、网卡与加速设备连接起来。采购单上的设备数量、程序看见的逻辑设备数量和可同时承载的模型数量,不能直接画等号。

不同型号、硬件版本和软件版本的能力有差异。本课用带主机 CPU 的服务器作为入门场景:CPU 负责应用控制、数据准备和任务提交,NPU 执行适合它的计算。某些产品采用不同的集成形态,因此不能把这里的连接方式当成全系列配置。面对真实设备,先查具体型号的产品手册、服务器兼容清单和当前软件支持范围,再讨论吞吐量。

例如,拟议配置可以写成 2 路 CPU、256 GB 主机内存、2 块企业级 NVMe SSD、2 个 100 GbE 端口和 4 张加速卡。这只是待核对的服务器需求示例,不是某款昇腾整机的默认规格。还要问每张卡的设备内存容量、插槽宽度、最大功耗、供电接口以及机箱风道。4 个物理插槽不代表同时支持 4 张指定型号的卡;散热空间、供电余量或平台认证都可能限制安装数量。

模型文件通常先从 SSD 读入主机内存,再由运行时加载到设备侧。网络请求到达网卡后,解码和预处理可能仍在 CPU 上。若设备通过 PCIe 与主机连接,输入、输出和部分控制信息需要经过这条通路。PCIe 4.0 x16 的单向理论有效编码后速率约为 31.5 GB/s,实际应用传输还要扣除协议与软件开销,并受协商宽度影响。100 GbE 的线速折算为 12.5 GB/s,也不能当作文件读取速度。

从服务器部件到模型执行的边界
从服务器部件到模型执行的边界

因此,理解 NPU 的目标是回答 4 个问题:哪些工作在设备上完成,数据如何到达计算单元,哪些条件会让设备等待,以及如何确认输出正确。峰值算力只能描述特定精度、特定运算条件下的能力。实际服务还受内存容量、数据布局、算子支持、CPU 准备速度和请求组织方式约束。读懂这些边界,才能解释“设备很忙但服务仍慢”,也能解释“设备很闲但请求已经超时”。

2 达芬奇架构与计算单元

昇腾产品使用达芬奇架构体系。入门时可以把典型 AI Core 理解为协同工作的计算单元、数据搬运单元和局部存储资源的组合,而不是把整颗芯片看成只能做矩阵乘法的黑盒。具体单元数量、支持的数据类型和执行能力应以目标芯片资料为准;本课只建立分析路径,不把某代芯片的细节外推到其他产品。

矩阵计算单元适合大量具有规则结构的乘加,例如全连接层以及经过适当组织的卷积计算。向量计算单元处理成组元素上的操作,例如部分激活、逐元素运算和归约中的工作。标量控制相关能力负责必要的地址、循环与控制处理。数据搬运单元把操作数送到可供计算使用的位置,并把结果送往后续阶段。这些角色经常协作,不能用算子名称直接推断只有某种单元参与。

以矩阵乘法 C=A×B 为例,令 A 的形状为 1024×512,B 的形状为 512×256,则 C 的形状为 1024×256。若元素按 FP16 的 2 字节存放,A 的逻辑数据量为 1 MiB,B 为 0.25 MiB,C 为 0.5 MiB。这里计算的是逻辑张量大小,没有计入内部布局填充、工作空间和中间结果。运行时申请量可能更大,输入输出使用相同类型也不代表累加过程一定采用相同精度。

设备通常把大矩阵分成较小的数据块,让局部操作数进入计算所需的存储位置,再逐步形成结果。分块让有限的局部空间能够处理更大的问题,并通过复用减少反复读取。同样完成矩阵乘法,块大小、边缘处理和数据布局不同,搬运量与有效计算比例就可能不同。理解这个结论已经足够,本课不展开指令编码、流水线安排或具体分块算法。

还有 2 个直观限制。首先,小矩阵可能没有足够工作摊薄任务启动和数据准备成本,降低精度未必带来可见收益。其次,不规则形状可能需要补齐、转换或特殊处理,逻辑元素数量少不代表设备执行的工作一定少。评估时应保留实际形状、批量和精度;用大而整齐的测试矩阵代替线上小张量,容易得出失真的结论。

精度选择还必须包含正确性条件。FP16、BF16、FP32 或整数计算的支持范围,随硬件和算子实现而变化。不能只看模型权重能否转换,还要检查输入范围、输出误差和任务指标。图像分类可能关注准确率变化,数值回归可能关注绝对误差与相对误差。只有性能和误差都满足约束,某种精度才是可采用的配置。

3 片上存储与任务调度

服务器里至少要区分主机内存、设备内存和片上局部存储。主机内存供 CPU 与操作系统使用;设备内存保存设备侧权重、输入、输出和工作空间;片上局部存储靠近计算单元,容量更有限,用于正在参与计算的数据。它们的地址空间、分配方式和访问成本不同。主机还有 100 GB 空闲内存,不能证明设备侧还能再加载 1 个模型。

可以把设备内存想成车间仓库,把局部存储想成工位暂存区。仓库装得下整批材料,不代表工位能同时摆下所有材料。计算实现需要安排分批搬运、计算和结果写回,尽量复用已经搬入的数据。如果每做少量运算就重新读取大量数据,计算单元会受供给速度限制。缓存与局部存储也不是可以混用的同义词,开发者可见的管理方式取决于具体架构与接口。

输入搬运、局部计算与结果返回
输入搬运、局部计算与结果返回

任务调度还发生在主机侧。应用通过运行时提交工作,运行时结合已编译的执行内容和设备资源安排执行。某些 API 的返回只表示任务已提交,并不表示设备已经完成。若只在提交前后读取主机时钟,就可能把排队时间漏掉,或者把异步提交耗时当作设备执行耗时。需要依据接口语义,在正确的位置等待完成,或使用设备侧计时与分析工具。

在支持的条件下,搬运与计算可以部分重叠,但重叠需要独立数据、合适缓冲区和明确依赖。下一批输入还依赖 CPU 解码时,设备就不能凭空开始计算;输出还未完成时,主机也不能安全复用对应缓冲区。增加执行流或队列数量,不保证任务就能并行,更不能绕过结果依赖。入门阶段先把串行路径测清,再观察重叠是否真实发生。

批量大小影响这条路径。批量从 1 增加到 8,可能让计算资源得到更充分利用,也会增加输入、激活与工作空间占用,并产生等待凑批的时间。吞吐量提升和单请求时延下降是不同目标。在线服务要看包含排队的尾部时延,离线处理则更关注总完成时间。发生设备内存不足时,不能只减权重精度,还要检查并发、批量、动态形状与临时缓冲区。

4 动手:对照一次昇腾算子执行路径

这次动手的目标是给 1 次矩阵乘法留下可解释的执行记录。使用现有、经过兼容性确认的昇腾环境和官方提供的对应版本样例即可,不需要先写自定义设备代码。准备 A 为 1024×512、B 为 512×256 的固定输入,选取环境明确支持的数据类型,并计算 CPU 参考结果。保存输入生成规则,避免每次测试输入不同而无法比较。

先建立环境记录:芯片与板卡型号、整机型号、CPU 和主机内存配置、设备可用内存、操作系统、驱动、固件、CANN 以及所用框架版本。CANN 是昇腾计算软件栈的重要组成部分,提供运行、算子与开发相关能力。版本号的意义在于确定兼容关系;“都装最新版本”不是兼容性证据。若环境已有受支持的版本组合,应优先保留可复现基线。

随后把路径标成数据准备、设备输入准备、计算提交、完成等待、结果读取与正确性比较。具体是显式复制还是由框架管理,取决于使用接口。初学者不应根据代码里有没有复制函数就判断没有数据搬运。首次调用还可能包含初始化、编译或缓存建立,因此先单独记录首次耗时,再进行预热后的重复测量,不把这 2 类数据混成平均值。

可采用 10 次预热、100 次测量作为练习设置,并在记录里写明同步位置。测量前后不要每次都打印整个张量,因为格式化和终端输出会干扰主机侧时间。分别收集设备计算时间、输入输出处理时间和整段调用时间,并注明工具对各时间段的定义。异步阶段存在重叠时,各段时间之和未必等于端到端时间,不能用简单相加代替时间线分析。

把测量点映射到可观察证据
把测量点映射到可观察证据

正确性比较应先检查形状、数据类型,再检查元素结果。例如可为练习暂设绝对误差阈值 0.01、相对误差阈值 0.01,但这只是教学起点,不能直接成为业务验收标准。常用判断形式为误差不超过“绝对阈值加相对阈值乘参考值绝对值”,以照顾接近 0 的结果。若失败,先固定输入和版本,再缩小形状、比较数据准备步骤,避免同时改精度和算法。

最后只改变 1 个条件,例如把批量增加或改用较小矩阵,重复同样记录。观察设备计算占比是否变化、传输是否成为主要部分、输出误差是否满足约定。产出应是配置、时间线、正确性和结论组成的短记录。即便结果是“小矩阵在此环境中没有收益”,也已经完成了有价值的实验,因为它明确了适用范围。

5 通用算子与定制优化取舍

通用算子通常覆盖较广的形状、数据类型和边界条件,并随软件栈维护。它适合作为初始基线,但“有同名算子”仍不足以证明模型可运行:算子版本、属性、布局、动态维度和输入类型都可能影响支持情况。模型中 99% 的运算能执行,剩余部分若导致主机与设备反复交换数据,端到端体验仍可能很差。

优化顺序可以从成本较低的选择开始:确认已有实现是否被正确调用,减少重复类型转换,稳定常见输入形状,调整满足时延要求的批量,再评估支持的图优化与融合。融合的直观意义是让相邻计算减少中间结果读写或启动开销,但它必须保持语义,并受软件版本和执行条件约束。不能为了追求更少的算子数量而忽略数值变化。

定制算子适用于通用实现无法满足明确需求,而且瓶颈证据足够集中的场景。它的成本不仅是写出核心计算,还包括边界形状、误差验证、工作空间、异常处理、编译部署与后续版本适配。如果每周都会更换输入规格,覆盖这些变化的维护成本可能超过节约的机器费用。团队能否持续验证,也是选型条件。

用简单数字判断收益上限。假设端到端处理耗时 20 ms,其中待优化算子占 4 ms。即使把这 4 ms 缩短到 1 ms,总时间仍为 17 ms,加速约为 1.18 倍。如果输入解码和布局转换才占大头,定制矩阵计算不会自动消除它们。分析必须保留同样的请求范围,不能拿旧版本端到端耗时与新版本算子耗时比较。

评审时应同时记录性能收益、支持范围和维护责任。例如限定静态形状、固定精度和固定软件版本可以降低实现难度,却会缩小可用范围。部署前还需要可回退的通用路径,以及触发回退的明确条件。至于设备编程语言、分块优化和更深入的调度实现,留到开发课程,在已有测量证据的基础上学习更合适。

6 常见坑:把 GPU 经验无条件搬到 NPU

GPU 上积累的并行计算、减少搬运和数值验证经验有参考价值,但具体执行模型与工具接口不能直接照搬。CUDA 程序不能因为同样做矩阵运算就直接在昇腾上运行。框架中的某段代码能够导入,也不证明全部算子、精度与动态行为都得到支持。迁移前应确认当前使用的是哪条受支持的框架与运行路径。

第 1 类坑是把“显存够用”当作完整容量判断。不同设备的可用内存、分配器行为、临时空间和内部布局可能不同。原来能放下的模型,迁移后可能在某个形状出现时才申请失败。应记录失败输入、峰值占用和并发数量,再检查是否存在缓冲区未释放或动态形状导致的额外分配,避免直接归因于芯片性能。

第 2 类坑是把主机计时习惯原样搬来。异步任务尚未完成,计时器就停止,会得到过分乐观的数字;为了纠正而在每个小操作后等待,又可能破坏原有重叠。正确办法是先定义测量对象,再按工具语义放置完成等待。设备利用率也要结合采样周期与时间线理解,短促任务的忙闲变化可能被平均值掩盖。

第 3 类坑是忽略 CPU 与总线。CPU 解码跟不上、线程争用、主机内存带宽不足,都会让设备等输入。PCIe 插槽标注为 x16 外形,实际链路可能只协商到 x8;还可能因平台连接关系与其他设备共享上游带宽。在多路 CPU 服务器中,数据所在内存与设备连接位置也会影响访问路径。本课只要求识别这种关联,不展开 NUMA 调优细节。

第 4 类坑是只换后端就接受输出。精度策略、算子实现与输入预处理的差异可能改变结果。性能验收必须与正确性验收一起进行,并保留失败样本。遇到设备不可见、驱动报错或持续降频,还应查硬件健康、温度、供电及版本匹配;算子调优无法修复错误的板卡安装或不足的散热。

7 案例:格式转换拖垮端到端时延

某图像推理服务使用 4 张加速卡,单请求处理 1 张图像,模型输入约定为 1×3×224×224 的 FP16 张量。应用先在 CPU 解码与缩放,再准备输入并调用模型。这个输入仅表达框架层面的逻辑形状,不能推断设备内部采用同样布局。内部布局可能为计算效率而改变,但不要求应用随意暴露或手写这种内部表示。

团队最初只测模型设备计算,得到 5 ms,随后却观察到预热后端到端耗时为 18 ms。以下数字是用于理解排查过程的串行示例:CPU 解码与缩放 4 ms,输入转换和复制 6 ms,模型计算 5 ms,输出处理 3 ms。它们覆盖同样的计时区间,暂不计网络排队。此时计算只占总时间的一部分,增加计算卡数量未必解决单请求时延。

从时延现象到格式转换根因
从时延现象到格式转换根因

分析时间线发现,应用输出的是按 NHWC 排列的 FP32 数据,模型入口却要求按 NCHW 表达的 FP16 数据。NHWC 与 NCHW 表示批量、高、宽、通道维度的排列约定;改变排列并不等于改变图像内容,但通常涉及重新组织元素。仅把形状标签换掉不能完成转换。FP32 转 FP16 又是独立的类型变化,可能涉及舍入。

进一步检查发现,预处理库已经产生过目标布局,包装层却把它转回另一种布局,随后运行接口再次转换。每次转换还有缓冲区申请和复制。请求量小的时候这些开销很容易被忽略;并发增加后,主机内存流量和 CPU 时间上升,尾部时延随之恶化。根因不是所有格式转换都不合理,而是接口约定不清导致重复工作。

修复首先明确每个边界的形状、类型、布局和数据归属,再让预处理尽可能直接生成模型入口所需的数据,移除经验证没有必要的往返转换。若运行时仍需内部布局转换,应保留并测量它,不能强行绕过。每次删除转换都使用相同图像比较数值与任务指标,尤其检查通道顺序、归一化方式与连续存储条件。

假设修复后输入转换和复制从 6 ms 降为 2 ms,其余阶段保持不变,端到端时间变为 14 ms,约加速 1.29 倍。这是案例假设值,不是产品承诺。接下来应在真实输入分布和目标并发下检查 P50、P95、P99,并记录 CPU 占用、设备内存和错误率。若尾部时延仍高,再沿排队、解码、传输与执行继续查证。

8 把 NPU 约束写进选型方案

可执行的选型从负载开始:模型版本、输入形状范围、目标精度、批量、并发、吞吐与尾部时延要求。还要写清是否包含解码、预处理、网络与后处理。对图像服务而言,“模型 5 ms”和“请求 P99 不超过 30 ms”约束的是不同边界。只有测试范围一致,候选设备的结果才能比较。

硬件清单要落到整机兼容关系。除加速卡型号与数量,还应列 CPU 型号及路数、主机内存容量、存储容量与持续读取需求、网卡端口速率、PCIe 代际和实际宽度、机箱空间与供电散热要求。如果采用集成式加速模块或其他整机形态,应按对应平台记录连接方式,不能默认所有设备都以标准 PCIe 插卡出现。

容量估算同时考虑权重、激活、输入输出、工作空间与运行时开销,并留出有依据的余量。举例说,权重占 8 GB、测得其他峰值占用为 6 GB,并不意味着标称 16 GB 的设备一定稳妥;还需核对容量单位、实际可用空间和峰值是否覆盖最大并发与最大形状。主机内存也要容纳解码数据、缓存和服务进程,SSD 则影响加载及数据供给。

软件约束应形成可复现组合:操作系统、驱动、固件、CANN、框架和模型转换方式。未支持的算子要有处理路径,动态形状要有验证范围,定制实现要有维护人。验收材料应保存测试输入、运行配置、时间线、误差报告与版本记录,让接手者能够在相同条件下重跑,而不只看到截图里的吞吐数字。

最后写明故障与扩容边界。单卡不可用时服务是否能降级,恢复后如何重新加载模型,设备健康告警由谁处理,都应在整机方案中有落点。扩到更多卡之后,CPU、网络、存储或卡间通信可能成为新限制;本课不展开多卡通信算法,但方案不能假设吞吐随卡数严格成比例增长。先用实测确认扩展趋势,再决定采购数量。

9 从昇腾 NPU走向MindSpore 与昇腾开发(A37)

到这里,应该已经能把 1 次模型调用拆成主机准备、数据传输、设备计算和结果处理,并知道每段受哪些硬件与软件条件约束。这些概念可以迁移到其他加速器,但具体算子支持、布局规则、同步接口和工具使用必须查目标平台资料。理解共同问题与尊重平台差异,需要同时做到。

下一课 A37 将把这些边界接到 MindSpore 与昇腾开发流程上。MindSpore 是机器学习框架,框架会参与张量表达、计算组织与设备执行衔接;CANN 与设备驱动等组件提供不同层次的支持。它们并不是安装任意版本就能自动组合的独立积木。学习时应从受支持的环境与最小示例开始,逐步加入模型与业务输入。

衔接开发前,可以做 1 次设备映射核对:记录管理工具列出的物理设备标识、进程可见的逻辑编号与框架选择的执行设备。在容器或限制设备可见范围的环境中,程序里的设备 0 未必对应整机清单中的第 1 张卡。若绑定错误,多个进程可能挤到同一设备,表现为部分卡空闲、某张卡内存不足。应把进程与设备的对应关系作为证据,而不是仅凭设备总数判断分配成功。

随后用固定矩阵乘法确认执行位置。输出正确只能证明结果符合参考值,还应从当前版本支持的分析工具中确认设备任务确实执行,并检查有无意外的主机计算或往返复制。例如首次运行慢、后续稳定,可能来自编译与初始化;每换输入形状又变慢,则要检查是否重新编译或选择了不同执行实现。分别保留首次、重复及变形状的时间线,才能把软件准备开销与昇腾硬件执行能力区分开,避免把全部等待都解释为设备算力不足。

进入 A37 前,可准备本课的矩阵乘法记录,以及真实设备的型号和软件版本清单。如果暂时没有设备,也可以完成张量大小计算、画出输入输出路径,并列出需要实测的数据。不要用估算值冒充设备结果。下一步的重点是让框架实际执行、检查输出并定位开销,再根据证据决定是否继续学习定制算子。

放进方案里

在方案中把昇腾 NPU 写成具有明确输入、输出和运行条件的计算资源。先约定模型版本、输入形状与类型、目标精度、批量、并发和正确性阈值,再约定吞吐与 P99 时延。时延边界应覆盖请求接收后的解码、预处理、传输、计算与后处理,并单独保留设备计算数据,便于定位差异。

硬件部分填写经过兼容性确认的整机型号、加速设备型号与数量、设备可用内存,以及 CPU、主机内存、SSD、网卡、PCIe 链路和供电散热条件。不要把插槽数量直接写成可用卡数,也不要把接口理论带宽当作业务吞吐。容量验收覆盖最大输入、最大并发和工作空间峰值,保留实际可用内存与余量依据。

软件部分锁定操作系统、驱动、固件、CANN 和框架的兼容版本,列出未支持算子、必要的格式转换及其处理路径。通用实现作为可重跑基线;采用定制优化时,注明适用形状、数值误差、收益、维护人和回退条件。所有性能结论都附输入集、预热方法、同步位置与测量范围。

持续负载验收还应约定运行时长与机房进风条件,保存每张昇腾设备的温度、功耗、频率及健康告警记录。若热稳定后吞吐下降,应对照降频和散热证据复查;短时冷机成绩不能替代持续能力。对采用 PCIe 的配置,附实际协商代际与宽度,链路降级时先排除安装或平台问题,再接受性能结论。

验收至少包括输出正确性、目标负载下的端到端时延、持续吞吐、设备内存峰值和异常恢复。若设备计算达标而总时延超限,应按时间线检查解码、重复转换、数据复制和排队,再决定优化位置。扩容以前确认 CPU、网络与存储仍有余量,并通过增加设备后的实测判断扩展收益。最终交付配置清单、测试记录和故障处理入口,使方案能够被部署、复测和维护。

10 小结:下一步MindSpore 与昇腾开发(A37)

昇腾 NPU 的入门重点是计算、存储、搬运与软件执行路径之间的关系。芯片能力要放在板卡、服务器和具体负载中评价,算子耗时要放在端到端时间线中解释,任何优化都要同时满足正确性与资源约束。

进入 A37 前,请尝试回答:设备内存充足为何仍可能很慢?异步提交计时为什么容易失真?删除格式转换前需要确认哪些数据约定?如果能用本课的执行路径和案例说明原因,就可以继续学习 MindSpore 环境、模型执行与昇腾开发工具。

同阶段相关课

AI 答疑

默认关闭。启用后,只发送本课标题、最近阅读的屏幕内正文摘录(最多 6000 字)与本次问题。

配置自己的服务