《昇腾310B实战》教材配套演示

第2章:CANN软件栈核心组件解析

从 ONNX 到可核验的 OM 推理

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

本讲目标与路线

  • 分清 CANN 五层架构与 ONNX、ATC、OM、msame 三种证据
  • 读懂 ATC 的输入契约与版本门
  • 用 msame 把 OM 变成可观察的运行结果
  • 保留 8T 与 20T 各自的单次记录

本讲主线:模型契约 → ATC 工件 → 运行证据

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

01

CANN 软件栈与模型契约

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

一条链路,三种不能互相替代的证据

阶段 关键输入 核心动作 产物 首先证明什么
模型交换 训练框架导出 ONNX 固定图、算子与张量契约 .onnx 输入语义是否明确
离线编译 ONNX、目标 SoC、输入形状 图优化、算子选择、内存规划 .om 与编译日志 编译器是否完成
工件检查 OM 路径与目标平台 大小、哈希、文件名、版本核验 可追踪工件记录 文件身份是否可信
运行验证 OM 与匹配的输入 ACL 加载、执行、输出、释放 msame 日志与结果 该组合能否实际执行

ATC 成功、OM 存在、推理成功是三道独立的门。任何一道没有证据,都不能用下一道的结果替代。

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

CANN 把框架语义接到硬件执行

CANN 异构计算软件栈与生态层次图

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

五层架构各自回答一个问题

层次 主要职责 课堂追问
计算语言接口 设备、上下文、流、内存、模型和媒体 API 应用从哪里进入 CANN
计算服务层 算子库、图调优、梯度优化与模型压缩 谁来复用和优化计算
计算编译层 ATC、图编译与 TBE 算子开发 前端图如何变成设备可执行体
计算执行层 Runtime、图执行、AIPP 与 DVPP 任务怎样被调度和搬运
计算基础层 共享虚拟内存、虚拟化和主机设备通信 资源底座由谁管理

CANN 的复杂度来自跨层协作。排障时必须先确定故障发生在哪一层。

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

CANN 与 CUDA:目标相近,抽象不同

维度 CANN CUDA
硬件绑定 昇腾达芬奇架构 NVIDIA GPU
主要优化对象 模型图、算子融合与设备执行 通用并行核函数与线程组织
预处理协同 AIPP、DVPP 进入设备侧链路 通常由框架与推理引擎组合实现
可观测手段 日志、精度 Dump、Profiling 日志、Profiler 与调试工具

共同点是都需要把模型或程序转换成设备指令。差异在抽象层次、硬件耦合和软件生态。

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

ONNX 不是“万能模型文件”,而是一份契约

  • Model Proto 保存版本、生产者和图入口等元数据。
  • Graph Proto 描述节点、输入、输出与初始化器。
  • Node Proto 给出算子类型、输入输出张量和属性。
  • Tensor Proto 保存权重、形状和数据类型。
  • ATC 只支持目标 CANN 版本实际覆盖的算子、控制流和数据类型。
第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

ATC 流程:从统一图到离线模型

ATC 流程与图优化示意图
ATC 将框架模型解析为统一 IR,再经图优化生成 OM。
  1. 环境准备并确认目标 SoC。
  2. 解析 ONNX,形成统一 IR Graph。
  3. 执行图准备、拆分、融合与编译。
  4. 生成离线模型,交给运行时执行。
第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

ATC 做的事不只是文件后缀转换

  • 解析模型并把节点映射到统一中间表示。
  • 进行图准备、拆分、融合和形状推理。
  • 根据目标硬件选择算子实现与精度策略。
  • 规划权重重排与内存复用。
  • 输出 OM,并留下转换日志和融合摘要。
第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

版本门:ATC 之前先固定四个对象

检查对象 8T 板 20T 板 通过标准
SoC 与档位 Ascend310B4,8T Ascend310B1,20T npu-smi 实际显示一致
CANN 环境 同一 shell 加载 8.0.0 同一 shell 加载 8.0.0 set_env.sh 生效
Toolkit 与 Kernels 同一发布号 同一发布号 版本不混装
模型合同 1×3×224×224 1×3×224×224 名称、布局和精度一致

Name 为 310B4 或 310B1 时,目标参数分别追加 Ascend 前缀。健康状态单独记录,不能替代版本检查。

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

读懂一条真实的 ATC 命令

export TE_PARALLEL_COMPILER=1
export MAX_COMPILE_CORE_NUMBER=1
atc \
  --model=resnet50.onnx \
  --framework=5 \
  --output=resnet50 \
  --input_shape="actual_input_1:1,3,224,224" \
  --soc_version=Ascend310B4

8T 使用 Ascend310B4;20T 使用 Ascend310B1。命令结构相同,不代表 OM 字节相同或结果可以互相继承。

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

02

从 ATC 到 msame 的运行证据

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

第一层证据:ATC 编译成功

板卡 目标 SoC 退出码 原始 stdout 关键行
8T Ascend310B4 0 ATC run success, welcome to the next use.
20T Ascend310B1 0 ATC run success, welcome to the next use.

这两行证明本次 ATC 进程成功结束,并分别记录了两块板的目标 SoC。它仍不证明 OM 文件完整、推理正确或结果准确。

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

第二层证据:OM 工件必须能被追踪

ls -lh model/resnet50.om
sha256sum model/resnet50.om
  • 路径要能对应转换批次和目标 SoC。
  • 文件大小必须非零,哈希用于区分同名的不同工件。
  • 当前双板记录能证明运行时加载了各自板上的 model/resnet50.om。
  • 但原始 JSON 没有保留该文件的独立大小与 SHA-256,不能补造这两项。

因此,本轮能确认“该路径的 OM 被 msame 成功加载”,不能宣称已经完成完整的工件身份核验。

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

第三层证据:msame 把 OM 变成可观察的运行

  • 初始化 ACL,打开设备并创建上下文与流。
  • 加载 OM,读取模型输入输出描述。
  • 把与模型合同匹配的二进制输入送入设备。
  • 执行推理,把结果写到指定目录。
  • 卸载模型,并按顺序释放流、上下文和设备。
第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

一张 JPG 不能直接喂给 msame

ResNet50 示例输入图片
教材中的示例图片,仅用于说明输入预处理。
  1. 读取为 RGB。
  2. 缩放到 256×256。
  3. 中心裁剪到 224×224。
  4. 转为 float32 并按通道归一化。
  5. 变为 NCHW,加入 batch 维。
图片与流程:src/book/chapter2.md「图片预处理」;src/book/img2/dog1_1024_683.jpg
第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

msame 命令与成功链

命令来源:src/book/chapter2.md「图片预处理」

./msame \
  --model "./model/resnet50.om" \
  --input "./data/dog1_224_float32.bin" \
  --output "./out" --outfmt BIN

日志来源:src/book/chapter2.md「图片预处理」

[INFO] acl init success
[INFO] load model model/resnet50.om success
[INFO] model execute success
[INFO] output data success
[INFO] unload model success
[INFO] end to finalize acl

关键不是某一行单独出现,而是加载、执行、输出和释放形成连续闭环。

双板结果:tool-matrix.json
第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

双板运行环境:同版本,不同证据集

项目 8T 板 20T 板
SoC Ascend310B4 Ascend310B1
系统 Ubuntu 22.04.3,aarch64 Ubuntu 22.04.3,aarch64
CANN 8.0.0 8.0.0
驱动与 npu-smi 25.2.0 25.2.0
健康快照 Alarm,80 C Alarm,70 C

相同软件版本降低了一部分干扰,但不能把两个 SoC 的结果合成一个硬件排名。

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

双板 msame:保留各自的单次结果

板卡 SoC 运行状态 msame 报告值 测试范围
8T Ascend310B4 加载、执行、输出、释放成功 13.232 ms 单模型、单输入、单次
20T Ascend310B1 加载、执行、输出、释放成功 11.748 ms 单模型、单输入、单次

这两块板各有独立的 ATC 目标与 OM 路径。11.748 ms 只表示本次 20T 记录中的一次 msame 报告值,不能外推成整机性能,也不能据此宣布 20T 全面更快。

第2章:CANN软件栈核心组件解析
《昇腾310B实战》教材配套演示

从日志到结论:先核证据,再下判断

证据门 必须看到什么 本轮已有记录
ATC 退出码、目标 SoC、成功行 两板均为 0,并打印成功
OM 工件 路径、大小、SHA-256、目标平台 路径被加载;大小与哈希未记录
msame 加载、执行、输出、释放完整链 两板均成功
范围 单次还是重复、是否含预处理 单模型、单输入、单次运行

原始 run1 日志保留了首次 ./msame: Permission denied;后续成功结果来自 tool-matrix.json。失败记录不能删除,也不能仅凭这一行判定 NPU 故障。

失败与修正:8T raw log、20T raw log、记录说明
第2章:CANN软件栈核心组件解析

本章不只讲“把模型转过去”,而是讲模型如何经过 CANN、ATC、OM 和 msame 形成可复核的证据链。

先给出本讲路线图;后续每一段都对应这里的一行,最后回到路线收束。

先建立证据分层。学生最容易把 ATC 打印 success 当成推理已经通过,后面用双板记录纠正这个误解。

从上到下带读:应用、AscendCL、服务层、编译层、执行层和基础层。强调 ATC 只属于编译层,不负责应用服务和运行时资源生命周期。

让学生用自己的话说明 ATC、Runtime、AIPP 和 DVPP 各自在哪一层,避免把所有问题都归因于 NPU。

不要把生态成熟度描述成单一输赢。课堂重点是理解两套栈的抽象对象和证据工具不同。

让学生区分“ONNX 文件能打开”和“ONNX 合同能被目标 CANN/ATC 接受”。动态控制流、自定义算子和极端 Shape 都要单独核对。

图中左侧是模型输入,右侧是单算子路径;下方汇入 OM。课堂强调 ATC 是编译阶段,不是运行时服务。

转换成功是编译结果,不是精度或性能结果。融合摘要只能说明图优化发生了什么,不能替代运行和数值验证。

先确认板卡和环境,再运行 ATC。8T 与 20T 用各自的 soc_version,不能复用同一个编译目标来掩盖版本身份。

逐项解释 framework=5、静态 input_shape、output 前缀和 soc_version。两个并行度变量用于降低编译资源压力,不是性能优化结论。

只把 exitCode 0 和 ATC 成功行作为编译层证据。不要从“ATC 成功”跳到“模型可用”。

这是本章最重要的证据缺口。现有记录已证明路径可加载,但缺独立 size/hash。课堂上要明确写“未记录”,不能从一次成功加载推导内容一致。

把 msame 定位成运行时烟测工具。它证明加载和执行链,不证明数据预处理一致,也不替代完整精度和性能基准。

预处理必须与训练和 ATC 的输入合同一致。顺序、均值、方差、颜色通道或布局任一改变,都可能让 msame 正常执行但输出异常。

可以让学生指出每一行属于哪个阶段。只有前后顺序完整,才能排除只加载未执行、只执行未取回或未释放资源。

两块板处于同一 CANN 和驱动版本,但 SoC、内存和算力档位不同。Alarm 只记录为已知板况,不直接判定程序失败。

必须把 13.232 ms 和 11.748 ms 读成两个独立记录,而不是平均值、吞吐或端到端时延。这里不重跑板端,只引用已有原始记录。

收束成四道门。强调缺失的 OM size/hash 必须保持“未记录”,不能为了让课件看起来完整而编数字。课堂作业要求学生补齐每道门的证据。