🔥 深度技术解析

昇腾 PyTorch 插件(torch_npu)
架构与实现深度解析

📦 源码:Ascend/pytorch 📅 整理:2026-04-10 🏷️ 华为昇腾 · PyTorch 编译器
前置说明:本文基于昇腾官方 Ascend/pytorch 仓库源码分析整理,涵盖插件架构、核心模块、算子融合、HCCL 分布式训练等关键技术点。内容面向有一定深度学习框架基础的技术读者。

项目概述

1.1 什么是 torch_npu

torch_npu 是华为昇腾官方开发的 Ascend Extension for PyTorch(昇腾 PyTorch 扩展插件),核心使命是让 PyTorch 框架能够无缝驱动 昇腾 NPU,使开发者无需修改 PyTorch 代码即可调用昇腾 AI 处理器的强大算力。

🔌如果把 PyTorch 想象成一个"通用厨艺学校",教的是如何做各种菜(深度学习模型);那么昇腾 NPU 就像是一套专业级厨房设备,火力强劲但需要专用接口才能操控。torch_npu 就是那个转接头——它一头接 PyTorch 的标准接口,另一头接昇腾 NPU 的底层硬件,让两边顺畅配合。

1.2 核心技术定位

层级技术说明
应用层PyTorch 前端 API开发者写的 torch.nntorch.optim 等标准 PyTorch 代码
适配层torch_npu 插件本项目的核心——做框架到硬件的桥接
中间件层CANN昇腾配套的异构计算架构,负责算子调度
硬件层昇腾 NPU实际执行计算的 AI 处理器(910B / 310P 等)

整体架构

2.1 仓库目录结构

Ascend/pytorch/
├── torch_npu/              # 🏠 主 Python 包(核心实现)
│   ├── __init__.py         # 入口文件,初始化所有子模块
│   ├── _afd/               # AFD 模块:Ascend Framework Dispatcher(分布式推理调度)
│   ├── _inductor/           # PyTorch Inductor 后端适配
│   │   └── ascend_npu_ir/   # 基于 MLIR 的 IR 和代码生成
│   ├── contrib/             # 自定义算子/模块(融合注意力、量化等)
│   │   ├── function/        # fused_attention, nms, iou 等
│   │   └── module/          # multihead_attention, deform_conv 等
│   ├── npu/                 # NPU 底层实现(amp、graphs、memory、streams 等)
│   │   ├── aclnn/           # ACLNN 算子 API
│   │   └── npugraph_ex/     # NPUGraph 推理优化
│   └── profiler/             # 性能分析工具
├── torchnpugen/             # 代码生成工具——生成自定义算子注册代码
│   ├── autograd/            # 自动微分代码生成
│   └── templates/           # C++/Python 代码模板
├── third_party/             # 第三方依赖
│   ├── acl/                 # ACL 运行时头文件和 stub
│   ├── hccl/                # HCCL(昇腾集合通信库)
│   ├── dcmi/                # DCMI(设备管理接口)
│   └── torch-mlir/          # MLIR 编译器基础设施
└── examples/                # 示例代码

2.2 模块依赖关系

用户代码 (torch.nn / torch.compile) ↓ torch_npu/__init__.py (入口) ├→ torch_npu.npu (设备、流、内存、AMP) ├→ torch_npu._inductor (Inductor 编译后端) │ └→ ascend_npu_ir/ (MLIR 代码生成) ├→ torch_npu.contrib (自定义融合算子) ├→ torch_npu._afd (AFD 调度上下文) └→ torchnpugen (代码生成工具) ↓ 底层:ACL / HCCL / DCMI / CANN ↓ 硬件:昇腾 NPU

核心模块详解

3.1 torch_npu/__init__.py —— 入口初始化

这是插件的"总开关",负责以下关键任务:

import torch
import torch_npu.npu
import torch_npu._afd
import torch_npu._inductor
from torch_npu import contrib, profiler

# 为 Tensor/nn.Module 打补丁,添加 .npu() 等方法
from torch_npu.utils import _add_tensor_methods, _apply_module_patch

# 注册 inductor 后端
torch._inductor.config.npu_backend = "mlir"  # MLIR 后端

3.2 torch_npu._afd/ —— AFD 分布式推理调度模块

什么是 AFD? AFD 是昇腾的分布式推理调度框架。在超大模型(如 MoE 大语言模型)推理时,需要将计算分配到多个 NPU 设备上,AFD 负责协调"Attention 计算"和"FFN(前馈网络)计算"之间的数据流转和调度时序。

🏭AFD 就是大型工厂的流水线调度员——确保每个工位(每个 NPU)在正确的时间做正确的事。

核心类是 ScheduleContextHolder,封装了分布式推理中复杂的调度逻辑:

class ScheduleContextHolder:
    """管理分布式推理的调度上下文"""
    def __init__(self,
                 schedule_mode: int,       # 0=调度FFN, 1=调度Attention
                 session_num: int,          # 会话数量
                 micro_batch_num: int,      # 微批次数量
                 selected_expert_num: int,  # MoE 中选中的专家数量
                 expert_num: int,           # 专家总数
                 attn_to_ffn_token_size: int,
                 ffn_to_attn_token_size: int,
                 ...):

底层通过 torch_npu._C._afd.ScheduleContextHolder 调用 C++ 实现。

3.3 torch_npu._inductor/ —— Inductor 编译后端

科普:PyTorch Inductor 是什么?

PyTorch 2.0 引入了 torch.compile(),它的工作流程分为三层:

Inductor 的核心思想是融合编译——把相邻的多个小算子(如 ReLU + Conv2d)合并成一个大算子,避免中间结果写回内存的开销,大幅提升计算效率。

昇腾 Inductor 的两套实现

后端路径说明
传统 Triton 后端torch_npu/_inductor/codegen/triton.py基于 Triton 生成内核代码,在 NPU 上模拟执行,过渡方案
新一代 MLIR 后端 ⭐torch_npu/_inductor/ascend_npu_ir/基于 MLIR 的代码生成,昇腾核心投入方向

MLIR 科普

🗼MLIR(Multi-Level Intermediate Representation,多层级中间表示)是 Google 发起的编译器框架。它的特点是"多层分级"——可以从高层(接近算法描述)逐步降到低层(接近机器码),每层可以做特定优化。

类比建筑施工:MLIR 像一套从建筑设计图结构施工图钢筋水泥配料单的完整图纸系统,每层图纸都有专门的优化工具。

Inductor-MLIR 三级架构

组件层级作用
Dynamo前端编译器将 PyTorch 动态图代码捕获为 FX Graph
Inductor-MLIR核心编译器将 FX Graph 转为 MLIR 多层级 IR,进行算子融合、类型优化、图化简
MLIR CodeGen代码生成器针对昇腾硬件生成专属高性能底层代码

三种等效使用方式:

# 方式1:config 配置
import torch_npu._inductor
torch._inductor.config.npu_backend = "mlir"
torch.compile(model)(x)

# 方式2:环境变量
import os
os.environ['TORCHINDUCTOR_NPU_BACKEND'] = 'mlir'
torch.compile(model)(x)

# 方式3:compile options
torch.compile(model, options={"npu_backend": "mlir"})(x)

3.4 torch_npu.npu/ —— NPU 底层实现

这是最接近 CANN / ACL 的层,提供 NPU 的核心能力:

子模块功能
amp/混合精度训练——FP16/BF16 自动转换,配合 GradScaler 防止下溢
graphs/NPU 图模式——torch.npu.Graph 用于批量执行优化
streams/计算流——torch.npu.Stream 类似于 CUDA Stream,用于异步并行
memory/内存管理——NPU 显存分配和复用策略
aclnn/ACLNN 算子 API——昇腾新一代算子接口库
npugraph_ex/NPUGraph 推理优化——用于生产级推理部署

3.5 torch_npu.contrib/ —— 自定义融合算子

PyTorch 原生算子不能满足所有需求,昇腾提供了一套高度优化的自定义算子,分两类:

自定义函数(Function):

自定义模块(Module):

💡 为什么需要这些融合算子?
算子融合(Operator Fusion)是现代 AI 编译器提升性能的核心手段。在 GPU/NPU 上,每一次"小算子之间的内存读写"都是巨大的性能开销。把多个相邻算子融合成一个大算子,可以减少 80%~90% 的内存访问次数,性能提升显著。

3.6 torchnpugen/ —— 代码生成工具

这个工具是给插件开发者用的——它能自动生成大量模板化的代码,减少人工维护成本。

简单来说,torchnpugen 是"用代码生成代码"的工具链,让插件开发者不需要手动编写大量重复性的算子注册逻辑。

算子融合技术详解

本章节专门拆解"算子融合"技术——这是现代 AI 编译器提升计算性能的核心手段。

4.1 为什么要融合?——性能瓶颈的根源

在深度学习模型中,计算不是唯一的瓶颈,内存访问往往才是真正的性能天花板。

举个例子,一个经典的 ResNet Block 包含以下操作序列:

输入数据 → Conv2d → BatchNorm → ReLU → Conv2d → BatchNorm → Add → ReLU → 输出

如果把每个算子都独立执行,会发生什么?

内存读取 → Conv2d计算 → 内存写入(中间结果) 内存读取 → BatchNorm计算 → 内存写入(中间结果) 内存读取 → ReLU计算 → 内存写入(中间结果) ...(重复 N 次)

每一次"内存写入 + 内存读取"(即中间结果写回)都是一次显存的读写操作。HBM 的带宽虽然很高,但和算力相比,内存访问速度远跟不上计算速度——这就好比工厂流水线做得很快,但原材料配送跟不上。

4.2 算子融合如何提升 NPU 性能

昇腾 NPU 的算力(TFLOPS)和内存带宽(HBM)之间存在"算力/带宽比"瓶颈。融合策略通过以下三个维度提升性能:

4.2.1 减少内存访问次数

融合后,中间结果不需要写回 HBM,可以在片上缓存(On-Chip Cache)中直接流转。以 Conv+Bias+ReLU 为例:

4.2.2 提高指令并行度

昇腾 NPU 有专门的张量计算单元和向量计算单元,可以同时工作。融合后,编译器可以更聪明地安排指令流水线(Instruction Pipelining),让"上一个算子的尾部"和"下一个算子的头部"并行执行,最大化硬件利用率。

4.2.3 减少 kernel 启动开销

每次调用一个 NPU kernel(核函数),都有固定的启动开销(kernel launch overhead),包括参数传递、线程块调度等。融合后,原本 N 个 kernel 的启动变成 1 个,启动开销降低 N 倍

4.3 典型融合模式

卷积系列融合

融合模式包含算子适用场景性能收益
Conv + Bias + ReLU卷积 → 偏置加 → 激活几乎所有 CNN 基本单元50%+
Conv + BatchNorm卷积 → 批归一化训练阶段推理加速可融合为单个 Conv
Conv + Add + ReLU两分支卷积 → 加法 → 激活ResNet 残差连接40%+
Conv + Sigmoid卷积 → SigmoidSegmentation 输出层减少 2 次显存读写

矩阵运算融合

融合模式包含算子适用场景性能收益
MatMul + Add + ReLU/GELU矩阵乘 → 偏置加 → 激活MLP/FFN 层(大模型核心)60%+
MatMul + Transpose矩阵乘 → 转置Transformer Q/K/V 投影显著减少访存
Linear + Dropout线性层 → Dropout训练阶段减少 kernel 启动次数

Attention 融合

融合模式包含算子适用场景性能收益
QKV Projection Fusion三个独立 MatMul → 合并为一次大矩阵乘Transformer 标准实现减少 2/3 的内存访问
Scaled Dot-Product AttentionSoftmax(QK^T)V 全流程所有 Self-Attention性能提升 2~5 倍
Attention + Dropout + Add + FFN完整 Transformer Block 核心LLM 训练/推理巨大收益

元素级融合(Elementwise Fusion)

适用于没有数据依赖的"逐元素操作":

融合前:input → exp(x) → 归一化 → softmax → dropout → 输出 融合后:单次 kernel 完成所有计算,中间结果不写回显存

典型模式:Add + Softmax + DropoutLayerNorm + DropoutGELU + Add 等。

4.4 昇腾 NPU 的融合实现机制

4.4.1 Inductor-MLIR 融合优化流程

4.4 昇腾 NPU 的融合实现机制

4.4.1 Inductor-MLIR 融合优化流程

在昇腾的 Inductor-MLIR 框架中,融合发生在 MLIR 的多个层级:

PyTorch 模型(Python) ↓ AOTAutograd 分解 FX Graph(算子级别) ↓ [MLIR - 高层 IR(Linalg/Tosa level)] ↓ 算子融合通道(Fusion Pass) [MLIR - 中层 IR(LMHLO level)] ↓ 调度优化(Scheduling) [MLIR - 低层 IR(Air/AIE level)] ↓ 硬件代码生成 昇腾 NPU 指令

融合 Pass(Pass)是编译器中的一个优化步骤,它会遍历 MLIR 图,识别出可以融合的算子模式,然后用融合后的算子替换原有序列。

4.4.2 融合的数学前提

算子能融合,必须满足数据依赖约束

# ✅ 可以融合:b 仅仅依赖 a,没有其他分支
a = conv(x)
b = relu(a)

# ✅ 可以融合:残差连接,add 只依赖 conv 和 input,可融合
out = relu(conv(x) + x)

# ❌ 不能融合:c 依赖 b 和 a,必须等两者都完成
a = conv(x)
b = relu(a)
c = add(b, some_other_branch)  # 不能和前面的 relu 融合

编译器需要分析这个数据流图(Data Flow Graph),找到"没有分支逃逸"的算子序列,才能安全融合。

4.4.3 contrib 融合算子的手工注册

除了编译器自动融合,torch_npu.contrib 还提供了手工优化的高性能融合算子:

from torch_npu.contrib.module import multihead_attention

# 直接使用融合版 Multi-Head Attention
model = multihead_attention(embed_dim=512, num_heads=8)

这些手工融合算子经过专门优化,通常比编译器自动融合效果更好,适用于对性能敏感的关键路径。

HCCL 分布式训练详解

本章节深入剖析 HCCL 在多机多卡训练中的通信机制——这是大模型分布式训练的核心基础设施。

5.1 为什么分布式训练需要集合通信?

先理解一个基本矛盾:

  • 单卡算力有限:一块昇腾 NPU 的算力再强,也装不下千亿参数大模型的全部参数
  • 模型必须分布在多卡甚至多机上:参数、梯度、优化器状态需要分散存储
  • 训练是迭代的:每一步迭代都需要"所有卡上的梯度汇到一起求平均、更新参数,再分发下去"

这就产生了通信需求——多张卡之间必须频繁交换数据(梯度、参数)。

5.2 集合通信的四大基本算子

HCCL 提供了 4 种最基础的集合通信(Collective Communication)操作,理解它们是理解分布式训练的基础:

5.2.1 AllReduce —— 最核心的算子

作用:多卡上的数据分别求和,结果广播给所有卡(每个人都得到一份完整的和)

AllReduce 前(每张卡只有自己的部分数据): 卡0: [g0_0, g0_1, g0_2, g0_3] ← 只有卡0的梯度片段 卡1: [g1_0, g1_1, g1_2, g1_3] ← 只有卡1的梯度片段 卡2: [g2_0, g2_1, g2_2, g3_3] ← 只有卡2的梯度片段 卡3: [g3_0, g3_1, g3_2, g3_3] ← 只有卡3的梯度片段 AllReduce 后(所有卡都得到完整的全局和): 卡0: [g0_0+g1_0+g2_0+g3_0, g0_1+g1_1+g2_1+g3_1, ...] 卡1: [g0_0+g1_0+g2_0+g3_0, g0_1+g1_1+g2_1+g3_1, ...] 卡2: [g0_0+g1_0+g2_0+g3_0, ...] 卡3: [g0_0+g1_0+g2_0+g3_0, ...]

在大模型训练中的意义:梯度 AllReduce 是同步优化器(如 SGD)的核心步骤。想象成:每个人算出自己部分的梯度,然后所有人把梯度累加,再各自用同样的梯度更新参数——只有这样所有人的参数才能保持同步。

AllReduce 的实现算法:常见的有 Ring-AllReduce(环形算法)和 Tree-AllReduce(树形算法):

  • Ring-AllReduce:N 张卡排成一个环,每个卡只和邻居通信,N-1 轮完成。通信量和卡数无关,适合大带宽高延迟网络。
  • Tree-AllReduce:逻辑上是二叉树结构,O(log N) 轮完成,适合低延迟网络。

昇腾 HCCL 根据拓扑自动选择最优算法。

5.2.2 Broadcast —— 一发全收

作用:一张卡(root)上的数据复制到所有其他卡

Broadcast 前: 卡0(root): [param_0, param_1, param_2, ...] 卡1: [?, ?, ?, ...] 卡2: [?, ?, ?, ...] 卡3: [?, ?, ?, ...] Broadcast 后: 所有卡都有和卡0完全相同的参数副本

典型使用场景:参数初始化、主卡(rank 0)加载预训练模型后广播给所有卡。

5.2.3 AllGather —— 人人贡献拼成完整图

作用:每张卡贡献自己的数据片段,最终所有人都拿到完整的拼接结果

AllGather 前: 卡0: [part_0] 卡1: [part_1] 卡2: [part_2] 卡3: [part_3] AllGather 后: 所有卡都有 [part_0, part_1, part_2, part_3] ← 完整拼接

典型使用场景:流水线并行(Pipeline Parallelism)中,每个 stage 输出了自己部分的激活值,需要拼成完整的激活序列传给下一个 stage。

5.2.4 ReduceScatter —— 先求和再分散

作用:先把所有卡的数据求和,然后按块分散给不同卡(每张卡拿到总和中属于自己的那片)

ReduceScatter 前: 卡0: [a0, b0, c0, d0] 卡1: [a1, b1, c1, d1] 卡2: [a2, b2, c2, d2] 卡3: [a3, b3, c3, d3] ReduceScatter 后(4张卡,每卡拿结果的一个元素): 卡0: [a0+a1+a2+a3] 卡1: [b0+b1+b2+b3] 卡2: [c0+c1+c2+c3] 卡3: [d0+d1+d2+d3]

典型使用场景:和 AllGather 配对使用,构成完整的数据并行梯度同步流程。

5.3 多机多卡通信拓扑

5.3.1 单机多卡(Same-Host Multi-Card)

主机内部(PCIe/NVLink 互联): ┌─────────────────────────────────┐ │ CPU │ │ ┌────┐ ┌────┐ ┌────┐ ┌────┐ │ │ │ NPU│ │ NPU│ │ NPU│ │ NPU│ │ │ │ 0 │ │ 1 │ │ 2 │ │ 3 │ │ │ └────┘ └────┘ └────┘ └────┘ │ └─────────────────────────────────┘ 通信方式:同机器内通过 PCIe 或 HCCS 互联,延迟低、带宽高(最高可达 392 GB/s)

5.3.2 多机多卡(Multi-Host)

交换机(RoCEv2 / IB) ┌─────┬─────┬─────┬─────┐ │ │ │ │ │ Host0 Host1 Host2 Host3 ┌────┐ ┌────┐ ┌────┐ ┌────┐ │NPUs│ │NPUs│ │NPUs│ │NPUs│ └────┘ └────┘ └────┘ └────┘ 通信方式:跨主机通过 RoCEv2(RDMA over Converged Ethernet)或 InfiniBand 网络

HCCL 会自动感知拓扑:在初始化时探测网卡、交换机拓扑,选择最优的路由策略。

5.4 分布式训练中的 HCCL 调用流程

5.4.1 初始化

import torch
import torch.distributed as dist
import torch_npu  # 自动加载 HCCL

# 初始化分布式环境
dist.init_process_group(
    backend="nccl",  # 在昇腾上实际是 HCCL,但兼容 NCCL 接口
    init_method="env://",
    world_size=8,    # 总卡数
    rank=0           # 当前卡的编号(0~7)
)

# 设置当前设备
torch.cuda.set_device(rank)  # 在昇腾上等效于 torch.npu.set_device()
💡 小知识
torch.distributedbackend 参数在昇腾上写 "nccl" 实际会路由到 HCCL,因为昇腾实现了与 NCCL 兼容的接口,PyTorch 分布式训练的代码几乎不需要修改就能跑在昇腾上。

5.4.2 数据并行训练(最常见的场景)

数据并行是最简单粗暴的并行策略——每个卡有完整的模型副本,各自处理不同的数据 batch,然后在梯度更新前通过 AllReduce 同步梯度

for data, target in dataloader:
    # 1. 前向传播(每卡独立)
    output = model(data)
    loss = loss_fn(output, target)

    # 2. 反向传播(每卡独立算出本地梯度)
    loss.backward()  # 此时每卡的梯度只是本地 batch 的,不是全局的!

    # 3. 梯度 AllReduce —— 🎯 HCCL 的核心时刻
    for param in model.parameters():
        dist.all_reduce(param.grad, op=dist.ReduceOp.SUM)
        param.grad /= world_size

    # 4. 参数更新(每卡独立,但梯度相同 → 参数同步)
    optimizer.step()

5.4.3 集合通信的异步执行

HCCL 支持异步启动——通信可以和其他计算并行执行(overlap):

# 异步 AllReduce,不阻塞等待结果
handle = dist.all_reduce(param.grad, op=dist.ReduceOp.SUM, async_op=True)

# 立即开始下一个计算(通信和计算 overlap)
loss2 = model2(input)

handle.wait()  # 等通信完成后再使用结果
param.grad /= world_size
optimizer.step()

这叫通信与计算重叠(Computation-Communication Overlap),是分布式训练性能调优的核心手段。

5.5 HCCL 性能优化技巧

5.5.1 梯度通信与计算重叠

最有效的优化手段之一。在反向传播的同时,启动上一次迭代的梯度通信:

# 伪代码示意
for i, (data, target) in enumerate(dataloader):
    output = model(data)
    loss = loss_fn(output, target)

    # 🎯 关键:反向的同时启动通信
    # 反向传播从最后一层往前算,算完最后一层的梯度时,
    # 最后一层的 AllReduce 可以和更早层的计算并行
    loss.backward()

PyTorch 的 DistributedDataParallel(DDP)自动做了这个优化——它在反向传播时将梯度同步启动,极大减少了通信开销。

5.5.2 通信算子融合(Gradient Bucketing)

如果每次通信单个梯度张量,开销很大。DDP 会把多个小梯度张量打包成一个 bucket,一次通信搞定:

传统方式(8次通信): grad0 → AllReduce grad1 → AllReduce grad2 → AllReduce ... (重复8次,每次都有通信延迟) Bucket 方式(1次通信): [grad0, grad1, grad2, ..., grad7] → 打包 → AllReduce(一次搞定)

昇腾 HCCL 配合 PyTorch DDP 自动做 bucket 优化。

5.5.3 通信带宽优化

优化方向具体做法效果
使用高速网络部署 RoCEv2 或 IB 网络,比 TCP 快 5~10 倍跨机通信延迟大幅降低
调整卡间拓扑同机器内卡数最大化,减少跨机通信减少跨机带宽竞争
梯度压缩FP16 梯度通信(天然压缩一半)通信量减半
自适应路由HCCL 自动选择最优路径平均带宽利用率提升 20%+

第三方依赖(third_party/)

6.1 ACL(Ascend CL)——昇腾计算库

ACL(Ascend Caffe Library,后来改叫 Ascend CL)是昇腾的运行时库,提供了:

  • 张量操作(aclTensor
  • 算子执行(aclOp
  • 内存管理(aclrt
  • 图编译(ge — Graph Engine)

6.2 HCCL —— 集合通信库

HCCL 是昇腾的多卡通信库,相当于 NVIDIA 的 NCCL,提供:

  • AllReduce(多卡梯度求和)
  • Broadcast(广播)
  • AllGather(收集)
  • ReduceScatter(分散求和)

在大模型分布式训练中,HCCL 是多 NPU 卡间数据同步的关键。

6.3 DCMI —— 设备管理

DCMI 是昇腾的设备管理接口,负责 NPU 设备的发现、初始化、状态查询等底层操作。

关键设计思想

7.1 零入侵接入(Zero-Invasive Integration)

torch_npu 设计的核心原则是:最小化对用户代码的修改。理想情况下,用户只需:

import torch
import torch_npu  # 这一行就够了

device = torch.device("npu")
model = MyModel().to(device)  # 正常写法,torch_npu 自动处理

7.2 猴子补丁(Monkey Patch)

PyTorch 的扩展机制决定了插件需要"修补"一些关键类。torch_npu 通过 _add_tensor_methods()_apply_module_patch() 等函数为 PyTorch 的:

  • torch.Tensor — 添加 .npu() 等方法
  • torch.nn.Module — 修改 forward() 以支持 NPU 特定优化
  • torch.Storage — 支持 NPU 显存管理
💡 设计思想
这本质上是一种AOP(面向切面编程)思想——在不修改核心代码的情况下注入新功能。

7.3 版本匹配策略

PyTorch 版本演进很快,CANN 版本也在迭代,torch_npu 采用了严格的版本对齐策略:

  • 分支命名:{PyTorch版本}-{CANN版本},如 v2.7.1-7.3.0
  • PyTorch 2.1.0 ~ 2.8.0 都有对应的插件版本
  • 长期支持(LTS)分支维护 3.5 年,常规分支维护 1 年

快速入门示例

8.1 最简验证(确认安装成功)

import torch
import torch_npu  # 激活插件

x = torch.randn(2, 2).npu()  # 在 NPU 上创建张量
y = torch.randn(2, 2).npu()
z = x @ y                     # 矩阵乘法
print(z)

8.2 混合精度训练

from torch_npu.npu.amp import GradScaler, autocast

scaler = GradScaler()

for data, target in dataloader:
    with autocast():
        output = model(data)
        loss = loss_fn(output, target)

    scaler.scale(loss).backward()
    scaler.step(optimizer)
    scaler.update()

8.3 torch.compile 编译加速(MLIR 后端)

import os
os.environ['TORCHINDUCTOR_NPU_BACKEND'] = 'mlir'

import torch
import torch_npu

model = MyModel().npu()
model = torch.compile(model, options={"npu_backend": "mlir"})
output = model(input_npu)

8.4 分布式数据并行(DDP)训练

import os
import torch
import torch.distributed as dist
import torch_npu

# 启动方式(2机8卡示例)
# torchrun --nnodes=2 --nproc_per_node=4 --node_rank=0 --master_addr=10.0.0.1 train.py

dist.init_process_group(backend="nccl", init_method="env://")
torch.cuda.set_device(dist.get_rank())

model = MyModel().npu()
model = torch.nn.parallel.DistributedDataParallel(model)

for data, target in dataloader:
    output = model(data)
    loss = loss_fn(output, target)
    loss.backward()  # DDP 自动做 AllReduce
    optimizer.step()

支持的硬件(Atlas 全系列)

9.1 Atlas 训练系列产品

产品系列型号芯片显存功耗架构特点
Atlas 900Atlas 900 PoD(集群)Ascend 910HBM50kW+(集群级)超大规模训练集群,支持千卡互联,液冷散热
Atlas 900Atlas 900 A2Ascend 910BHBM机柜级企业级训练集群,液冷设计
Atlas 800Atlas 800 (910B)Ascend 910B64GB HBM2e400W4U 4卡,单机训练主力
Atlas A2 训练系列Atlas 800T A2Ascend 910B64GB400W训练推理兼顾
Atlas A2 训练系列Atlas 900I A2Ascend 910B64GB300W2U 设计,高密度训练

9.2 Atlas 推理系列产品

产品系列型号芯片显存功耗架构特点
Atlas A2 推理系列Atlas 800I A2Ascend 310B大模型优化300W企业级推理服务器,支持 Llama/ChatGLM 等大模型
Atlas A3 推理系列Atlas 800I A3Ascend 310B大模型支持300W新一代推理卡,LLM 推理优化
Atlas A3 推理系列Atlas 300I A3Ascend 310B大模型支持300W推理模块卡,适用于服务器集成
Atlas A2 DCAtlas 800 A2 DCAscend 910B训练/推理兼顾400W数据中心通用,A2 代

9.3 Atlas 加速卡(Module / Card 形态)

产品形态型号芯片显存说明
PCIe 加速卡Atlas 300IAscend 31015GB推理卡,单槽位
PCIe 加速卡Atlas 300TAscend 31015GB训练推理双用途
PCIe 加速卡Atlas 300I A2Ascend 310B大模型优化A2 代推理卡
OAM 加速模块Atlas 300T A2Ascend 910B64GB HBMOAM 标准形态,高带宽
OAM 加速模块Atlas 300T A3Ascend 910B64GB HBMA3 代 OAM 模块

9.4 芯片代际对照表

芯片名称代际定位主要应用
Ascend 310第1代推理推理加速,边缘计算
Ascend 310B第1.5代推理优化大模型推理优化,A2/A3 推理卡
Ascend 910第1代训练大规模训练
Ascend 910B第2代训练旗舰主力训练芯片,A2/A3 全系列
Ascend 910C第3代超大规模训练新一代训练芯片(规划中)

技术总结

技术栈全景图

  • 前端框架:PyTorch 1.11+
  • 编译器后端:Inductor(Triton + MLIR)
  • 中间表示:MLIR(多层级 IR)
  • 通信库:HCCL(多卡集合通信)
  • 运行时:ACL(Ascend CL)+ CANN
  • 代码生成:torchnpugen(自动生成)
  • 混合精度:AMP(FP16/BF16)
  • 算子融合:Inductor-MLIR 自动融合 + contrib 手工融合
  • 分布式训练:PyTorch DDP + HCCL(全套集合通信)

十一参考资料