昇腾部署第 C1 课:TorchNPU 是什么——PyTorch 怎么接到昇腾上
编制:观澜|日期:2026-10-05|级别:T2 标准级 层级:C 层 · L2 框架(C 层第 1 课;L1 已在 B1–B5 讲完) 素材来源:昇腾官方文档 MCP 实时抓取(TorchNPU 26.1.X 官方文档) 数据纪律:版本对应关系、安装结构、验证命令、接口名逐字出自官方文档;标注「归纳」的是便于记忆的整理,非官方口径。
第一段 · 章前定位
A0《一张地图》给过五条部署成功判据,其中第三条是:
torch.npu.is_available()
当时只知道"它要返回 True"。现在,轮到把它讲透了。
这一课要回答的问题:
为什么昇腾上的 PyTorch 要额外装一个叫 TorchNPU 的东西? 它和 PyTorch 是什么关系? 装它之前,有哪几个"版本"必须同时对得上?
为什么这是 C 层的第一课:
- 它是 L2 框架层的入口 —— B 层讲完 CANN(L1),这一课往上接框架。
- 它是判据 ③ 的实现主体 —— 判据 ③ 通不过,八成就卡在这一课讲的东西上。
- 它把 B 层学的所有东西"用起来": - B3 讲"版本配套关系" → 这一课告诉你到底有几个版本要配套(答案:五个) - B1 讲"环境变量" → 这一课告诉你框架层也要先满足前提 - B2 讲"算子库" → 这一课告诉你框架是怎么最终调到那些算子的
第二段 · 学习目标
学完这一课,你应该能回答:
- TorchNPU 是什么——它和 PyTorch 是什么关系(插件?分支?)
- 为什么要装"两样东西"(PyTorch 本体 + TorchNPU),而且 PyTorch 装的是哪个版本
- 装 TorchNPU 之前,有几件事必须对上(官方的版本对应表)
- 装完怎么验收(官方给了一条命令,以及它该输出什么)
torch.npu.is_available()背后的那套接口是哪些
第三段 · TorchNPU 是什么
先说名字
TorchNPU = torch + NPU —— 从名字就能看出它是"PyTorch 的 NPU 部分"。
官方的定位(从官方文档的用词能直接读出):
官方章节标题是「安装 PyTorch 框架和 TorchNPU 插件」 官方的验证说明里写:执行以下命令可检查「PyTorch 框架和 TorchNPU 插件」是否已成功安装。
官方称它为"插件"(plugin)。
插件意味着什么(归纳)
| 如果是"分支/魔改版" | 实际是"插件" | |
|---|---|---|
| PyTorch 本体 | 要用华为自己维护的一份 | 用官方 PyTorch(而且是 CPU 版,见第五段) |
| 装法 | 装一个东西 | 装两个:PyTorch + TorchNPU |
| 升级 PyTorch | 要等分支跟上 | PyTorch 和插件各自有版本,要对上 |
| 名字 | 会另起一个 | 插件就叫 torch_npu |
这一条解释了两个常见现象:
- 为什么文档让你装两次(先
pip3 install torch...,再pip3 install torch_npu...)—— 因为是两个包。 - 为什么
torch_npu的包名里带着 PyTorch 的版本号(torch_npu-2.12.0-...)—— 因为插件要跟 PyTorch 版本配对。
归纳一句话: PyTorch 负责"是什么",TorchNPU 负责"跑在哪张卡上"。
第四段 · 从"装上"到"能用":那条验收命令说明了什么
官方给的验收方式(原文)
安装后验证
执行以下命令可检查 PyTorch 框架和 TorchNPU 插件是否已成功安装。
python python3 -c "import torch;import torch_npu; a = torch.randn(3, 4).npu(); print(a + a);"输出如下类似信息说明安装成功。
拆开这一行命令(本段是 C1 最实用的部分)
这一行短命令,其实一次性验了四件事(归纳):
| 命令片段 | 验的是什么 | 对应此前哪一课 |
|---|---|---|
import torch |
PyTorch 装上了 | —— |
import torch_npu |
TorchNPU 插件装上了 | 本课 |
torch.randn(3, 4).npu() |
能把张量放到 NPU 上(.npu() 是插件加的动作) |
本课 |
print(a + a) |
NPU 上真能算出结果(加法要落到 kernel 上) | B2(算子库) |
最后一条尤其重要(归纳):
a + a能打印出来,说明"算子库里有这个算子、而且能跑"。 如果import都成功、但一算就报算子相关的错 —— 那就不是框架的问题,是 B2 的问题。
这正好给出了一个分层判断法:
| 卡在哪一步 | 说明问题在哪一层 |
|---|---|
import torch 就失败 |
PyTorch 根本没装上 |
import torch_npu 失败 |
插件没装上 / 版本不对 |
.npu() 报错 |
设备层——B5(容器里卡没挂进来)或 A1(驱动) |
a + a 报算子相关错 |
L1——B2(算子库)或 B3(版本配套) |
⭐ 这条命令值得背下来:它是昇腾部署分层排错的一个微缩版。
官方还给了另一组接口(libtorch_npu 文档)
| 接口 | 官方说明 |
|---|---|
torch_npu::init_npu() |
使用 NPU 设备前需进行初始化,输入值格式为 npu:<id>,其中 id 为 NPU 卡号 |
at::Device() |
通过传 NPU 字符串构造 NPU 设备,输入值格式为 npu:<id> |
torch_npu::finalize_npu() |
使用 NPU 设备结束需进行…… |
归纳:C++ 侧(libtorch)要用 NPU,要显式初始化 / 构造设备 / 收尾;
Python 侧因为有了插件的语法糖(.npu()),日常写起来更省事。
注意那个 npu:<id> 格式 —— id 是卡号。
这就接上了 A2(你手上是第几张卡)和 B5(容器里挂了哪几张卡)——
多卡机器上,"用哪张卡"是一个要明确回答的问题。
第五段 · 装之前:把"五个维度"对上
官方的版本对应表(这是本课的核心)
官方《安装 TorchNPU · 方式一:离线安装(Whl)》给出了一张表, 每一行就是一个可用组合。表头是:
| PyTorch 版本 | TorchNPU 插件版本 | Python 版本 | 系统架构 | CANN 版本 | 安装方式 |
|---|---|---|---|---|---|
| 2.12.0 | 26.1.0 | Python 3.13 | AArch64 | 9.1.0 | 离线安装(Whl) |
| 2.12.0 | 26.1.0 | Python 3.12 | AArch64 | 9.1.0 | 离线安装(Whl) |
| 2.12.0 | 26.1.0 | Python 3.11 | … | 9.1.0 | … |
| 2.12.0 | 26.1.0 | Python 3.10 | … | 9.1.0 | … |
⚠️ 数据纪律提示:上表只是这张表的表头与示例行, 完整矩阵随版本变化,请到官方文档页取当前版本的表。 本课不声称这是完整清单,只用它说明"要同时对上哪几件事"。
从这张表能读出五件事必须同时对
| 维度 | 例子(官方示例行) | 谁决定的 |
|---|---|---|
| PyTorch 版本 | 2.12.0 |
你的业务代码依赖哪个版本 |
| TorchNPU 插件版本 | 26.1.0 |
必须和 PyTorch 版本配对 |
| Python 版本 | 3.13 / 3.12 / 3.11 / 3.10 |
你的环境 |
| 系统架构 | AArch64 / X86_64 |
你的服务器 CPU |
| CANN 版本 | 9.1.0 |
B3 讲的那个 CANN |
⚠️ 这一条是 C 层最容易踩的坑(归纳):
B3 讲"CANN 要与驱动、固件配套"——那是三个。 到了框架层,要配套的变成五个:加上 PyTorch 版本和 Python 版本/架构。
而且这五件事的"决定权"不在同一个地方:
- CANN 版本 → 由你装的 CANN 决定(B3/B4)
- Python 版本 → 由你的环境决定
- 系统架构 → 由服务器决定
- PyTorch 版本 → 由业务代码决定
- TorchNPU 版本 → 上面四个定完了,它只剩一个选项
归纳(一句好记的): TorchNPU 的版本不是你"选"的,是你"算"出来的 —— 其他四样定了,它就只有一行能用。
从包名就能看出这些约束(官方示例)
官方给的实际命令是这样的(AArch64 / Python 3.13 那一行):
# 下载并安装 PyTorch 框架
wget https://download.pytorch.org/whl/cpu/torch-2.12.0%2Bcpu-cp313-cp313-manylinux_2_28_aarch64.whl
pip3 install torch-2.12.0+cpu-cp313-cp313-manylinux_2_28_aarch64.whl
# 下载并安装 TorchNPU 插件
wget https://gitcode.com/Ascend/pytorch/releases/download/v26.1.0-pytorch2.12.0/torch_npu-2.12.0-cp313-cp313-manylinux_2_28_aarch64.whl
pip3 install torch_npu-2.12.0-cp313-cp313-manylinux_2_28_aarch64.whl
包名里全是信息(归纳,逐段拆):
| 包名片段 | 含义 |
|---|---|
torch-2.12.0 |
PyTorch 版本 2.12.0 |
+cpu |
装的是 CPU 版 PyTorch(见下) |
cp313 |
CPython 3.13 |
manylinux_2_28 |
兼容的 glibc 平台标签 |
aarch64 |
CPU 架构 |
torch_npu-2.12.0 |
插件版本号跟着 PyTorch 走 |
下载路径里的 v26.1.0-pytorch2.12.0 |
发布标签里同时写了插件版本和对应的 PyTorch 版本 |
⭐ 一个反直觉但很重要的事实:PyTorch 装的是 CPU 版
官方命令里,PyTorch 是从 download.pytorch.org/whl/cpu/ 下载的,包名带 +cpu。
为什么不用 GPU 版(归纳,帮理解):
昇腾不是 CUDA 设备。 +cpu 是 PyTorch 官方对"不带任何加速器后端"的标准版;
加速能力由 TorchNPU 插件补上——这就是"插件"设计的实际体现。
由此得出一条实用判断: 如果你装的是 PyTorch 的 CUDA 版,那是给 NVIDIA 卡用的 —— 在昇腾上不对。
第六段 · 两种安装方式
官方给了两条路:
| 方式 | 官方章节名 | 说明 |
|---|---|---|
| 方式一 | 离线安装(Whl) | 用 wget 下载 whl,再用 pip3 安装 |
| 方式二 | 源码安装 | 从源码编译安装(章节含:安装 PyTorch 框架 → 安装 TorchNPU 插件 → 查询版本 → 安装后验证) |
怎么选(归纳):
- 绝大多数情况用方式一(Whl)——和 B4 的结论一致:能用现成包就别编译。
- 方式二用在:官方没提供对应你环境的 whl(比如特定 Python 小版本 / 特定架构), 或者你要改插件本身。
与 B4 呼应:B4 讲 CANN 时有"在线/离线"两条路; 框架层的对应关系是:python 生态天然以 whl 为主(
pip3 install), 所以这里不是"在线 vs 离线",而是"装现成的 vs 自己编译"。
一个相关的官方事实:TorchAir
官方《TorchAir · 简介》里有一句值得记的话:
TorchAir 不是独立软件包,而是作为 TorchNPU 的三方库,随着 TorchNPU 包一起发布。 请直接安装 TorchNPU 插件,即可使用 TorchAir。
归纳:装 TorchNPU 就等于装上了 TorchAir,不用单独找。 (这解释了为什么你不会在安装教程里看到"单独装 TorchAir"这一步。)
第七段 · 装之前的前置条件
官方的安装文档明确要求:
执行安装命令前,请参见《安装前准备》完成环境变量配置及其他环境准备。
归纳出装 TorchNPU 之前要准备好的东西(把前面几课串起来):
① 驱动/固件装好 → A1,用 npu-smi info 验
② CANN 装好并配好环境变量 → B1,source set_env.sh
③ 算子库就位 → B2(ops 包按型号,别装错)
④ CANN 与驱动的版本配套 → B3
⑤ Python 环境 + pip3 → B4 讲过多数的装法都要求这个
⚠️ 注意"先配环境变量"这条(归纳):
source set_env.sh必须在装 TorchNPU 之前做,而且要在同一个 shell 里。 否则可能出现"装完了但 import 进来找不到库"—— 这正是 B1 讲的"环境变量只在当前 shell 有效"的又一次体现。
第八段 · 出问题怎么查
先按第四段的分层法定位
| 卡在哪 | 问题层 | 去哪一课 |
|---|---|---|
import torch 失败 |
PyTorch 没装上 | 本课第六段 |
import torch_npu 失败 |
插件没装上 / 装错版本 | 本课第五段(五维对应) |
.npu() 报错 / torch.npu.is_available() 为 False |
设备层 | A1(驱动)、B5(容器没挂卡) |
| 能算,但报算子相关错 | L1 | B2(算子库)、B3(版本配套) |
| 装完能 import,一跑就找不到库 | 环境变量 | B1(当前 shell 有没有 source) |
其他常见情况的查法
| 现象 | 先查什么 |
|---|---|
pip3 install 报"找不到匹配的 whl" |
五个维度有一个没对上(第五段的表) |
| 装完 import 报 "undefined symbol" 之类 | TorchNPU 版本与 PyTorch 版本不配对 |
| 同事的机器能装,我的装不了 | 比 Python 版本 / 系统架构(这两个人各不同) |
| 不知道该装哪个 TorchNPU 版本 | 别猜:先确定 PyTorch 版本 + Python 版本 + 架构 + CANN 版本 → 查官方表 |
| 装完发现装的是 CUDA 版 PyTorch | 错了:昇腾上要用 +cpu 版(第五段) |
⭐ 一个最省时间的判断法
框架层的报错,先分清是"版本没对上"还是"环境没到位"。
| 类型 | 表现 | 查 |
|---|---|---|
| 版本没对上 | 能 import,但一用就报错;或者 pip3 install 直接找不到包 |
第五段的五个维度 |
| 环境没到位 | 换个终端就好了 / 手工 source 一下就好了 | B1 的环境变量 |
"装上了但用不了"八成是版本;"刚才还好好的"八成是环境。
第九段 · 小结与下一课
三句话带走
- TorchNPU 是 PyTorch 的插件,不是 PyTorch 的分支——
所以要装两样:PyTorch 本体(
+cpu版)+ TorchNPU 插件。 - 框架层要同时对上五个维度:PyTorch 版本 / TorchNPU 版本 / Python 版本 / 系统架构 / CANN 版本。其中前四个定完之后,TorchNPU 版本只剩一个选项。
- 那一行验收命令一次性验四件事:
python3 -c "import torch;import torch_npu; a = torch.randn(3, 4).npu(); print(a + a);"—— 卡在哪一步,就知道问题在哪一层。
本课在体系里的位置
─── L0 硬件与环境(A 层,已完成)─── A0 / A1 / A2 / A3
─── L1 基础软件(B 层,已完成)─── B1 / B2 / B3 / B4 / B5
─── L2 框架(C 层)───
C1 TorchNPU 是什么:PyTorch 怎么接到昇腾上 ★ 本课
C2(拟)MindSpore 与多框架
C3(拟)框架适配原理:一个算子从框架到芯片走了哪条路
C4(拟)框架层验收与排错
─── 排障(E 层)─── E1
本课留下的"钩子"
| 钩子 | 在哪一课填 |
|---|---|
| 昇腾上除了 PyTorch 还有哪些框架?各有什么不同 | C2 |
.npu() 之后,一个算子究竟走了哪条路到芯片上 |
C3 |
torch.npu.is_available() 为 False 的完整排查 |
C4 |
| 推理服务层(MindIE / vLLM)怎么接进来 | D 层 |
课后自测(3 题)
- 为什么官方命令里 PyTorch 装的是
+cpu版?那加速能力从哪来? - 你要在 AArch64 服务器、Python 3.12 上跑一个依赖 PyTorch 2.12 的模型, 已经装了 CANN 9.1.0。该装哪个 TorchNPU 版本?依据是什么?
- 验收命令
... a = torch.randn(3, 4).npu(); print(a + a)里, 如果import都成功、但a + a报算子相关的错,问题在哪一层?
附录 A · 本课引用的官方出处
| 内容 | 出处 |
|---|---|
| 「安装 PyTorch 框架和 TorchNPU 插件」;版本对应表(PyTorch / TorchNPU / Python / 架构 / CANN / 安装方式) | 官方 TorchNPU《安装 TorchNPU · 方式一:离线安装(Whl)》zh/Pytorch/2610/installguide/swinstall/docs/zh/installation_guide/installation_via_binary_package.md |
完整安装命令(下载 +cpu 版 PyTorch + 下载 TorchNPU whl) |
同上 |
| 安装后验证命令与说明「输出如下类似信息说明安装成功」 | 同上 / 官方《方式二:源码安装》.../compilation_installation_using_source_code.md |
| 安装前须完成《安装前准备》(环境变量配置) | 同上 |
torch_npu::init_npu() / at::Device() / torch_npu::finalize_npu() 及 npu:<id> 格式 |
官方 TorchNPU《编译 libtorch_npu》.../installation_guide/building_libtorch_npu.md |
| 「TorchAir 不是独立软件包,而是作为 TorchNPU 的三方库,随 TorchNPU 包一起发布」 | 官方 TorchNPU《TorchAir · 简介》zh/Pytorch/2610/devguide/TorchAir/docs/zh/overview.md |
| TorchNPU 当前文档版本(26.1.X) | 官方 TorchNPU 文档站版本标识 |
⚠️ 数据纪律提示: ① 版本对应表未完整搬运——那是随版本变化的矩阵,本课只给表头与示例行, 完整矩阵请到官方文档页取当前版本; ② 本课未给出历史版本兼容列表(官方另有《版本说明》/兼容性文档); ③ 标注「归纳」的解读("插件 vs 分支"的对比、分层判断法、包名拆解)非官方口径。
附录 B · 本课出现的命令详解
那一行验收命令(本课最该背的一条)
python3 -c "import torch;import torch_npu; a = torch.randn(3, 4).npu(); print(a + a);"
逐段拆解:
| 片段 | 含义 |
|---|---|
python3 -c "..." |
把引号里的内容当作 Python 代码直接执行,不写文件 |
import torch |
导入 PyTorch |
import torch_npu |
导入 TorchNPU 插件(这一句是关键:只 import torch 不会启用 NPU) |
torch.randn(3, 4) |
生成一个 3×4 的随机张量(先在 CPU 上) |
.npu() |
TorchNPU 提供的方法:把张量搬到 NPU 上 |
a + a |
在 NPU 上做一次加法(这一步才真正用到算子库) |
print(...) |
打印结果 |
期望结果:打印出一个 3×4 的数值矩阵(官方说明:输出如下类似信息说明安装成功)。
拆解命令语法:
- -c = command,把后面字符串当代码跑
- ; = Python 的语句分隔符(一行写多条)
- 为什么用 -c:不建文件、一条命令验完 —— 这是官方给的最短验证路径
pip3 install <whl 文件名>
- 含义:安装本地 whl 包。
- 拆解:
pip3= Python 包管理器;install= 安装;参数是包文件名(本地文件也可)。 - 用法:
pip3 install torch_npu-2.12.0-cp313-cp313-manylinux_2_28_aarch64.whl - 期望结果:
Successfully installed torch_npu-... - 不用会怎样:只下不装,插件不存在 →
import torch_npu失败。
wget <url>
- 含义:从 URL 下载文件到当前目录。
- 用法:
wget https://gitcode.com/Ascend/pytorch/releases/download/v26.1.0-pytorch2.12.0/torch_npu-...whl - 注意:URL 里的
%2B是+的转义(+在 URL 里有特殊含义)—— 这是 PyTorch 官方 whl 地址的常见写法,照着官方命令抄就行,别手改。
包名解读(本课实用技能)
以 torch_npu-2.12.0-cp313-cp313-manylinux_2_28_aarch64.whl 为例:
| 片段 | 含义 |
|---|---|
torch_npu |
包名(TorchNPU 插件) |
2.12.0 |
对应的 PyTorch 版本 |
cp313 |
CPython 3.13 |
manylinux_2_28 |
Linux 平台标签(glibc 兼容性) |
aarch64 |
CPU 架构 |
.whl |
Python 的二进制包格式 |
学会读包名,就能对着第五段那张表自己核对,不用求人。
参数速查表
| 命令 / 片段 | 用途 |
|---|---|
python3 -c "..." |
一行命令跑 Python 代码(验收用) |
.npu() |
把张量搬到 NPU(TorchNPU 提供) |
import torch_npu |
启用 NPU 支持的关键 import |
pip3 install <whl> |
装 whl 包 |
wget <url> |
下载文件 |
npu:<id> |
设备标识格式,id 是卡号(C++ 侧构造设备用) |
npu-smi info |
装框架前先确认驱动就位(A1) |
source .../set_env.sh |
装框架前先配 CANN 环境变量(B1) |
附:B 层与 C 层的分工(避免重复)
| 问题 | 在哪一课 |
|---|---|
| CANN 是什么、装在哪、环境变量 | B1 |
| 算子库、"找不到算子" | B2 |
| 版本配套(驱动/固件/CANN 三方)、升级回退 | B3 |
| 七种装法怎么选 | B4 |
| 容器场景 | B5 |
| 框架怎么接到昇腾上(TorchNPU 是什么、五维版本对应、验收命令) | 本课(C1) |
| 其他框架(MindSpore 等) | C2 |
| 算子从框架到芯片的路径 | C3 |