昇腾 NPU 入门:5 分钟跑通 ResNet-50 推理

已有昇腾开发者账号?本文给出最短路径——从拿到云上 NPU 实例,到 10 个必学 API,再到 5 分钟跑通 ResNet-50 推理。读完后你应该能独立在新机器上启动 NPU 任务。

环境准备:3 条路径

1. 华为云 ModelArts(推荐,最快)

ModelArts 是华为云的 AI 开发平台,开箱即用——预装 CANN、torch_npu、MindSpore,无需手动装驱动。流程:

  1. 登录 https://console.huaweicloud.com/modelarts
  2. 创建 Notebook 实例,选 Ascend 910B 规格(如 modelarts.bm.ascend910b.8x
  3. 等 1-3 分钟开机,浏览器内 JupyterLab 即开即用
# Notebook 启动后立即验证
import torch_npu.npu as npu
print(npu.is_available(), npu.device_count())
# 输出: True 8(8 卡实例)

适合场景:PoC、学习、临时实验。按小时计费,关机即停。

2. 华为云 ECS 910B 规格(生产训练)

如果要做长期训练任务(几小时到几天),ECS 比 ModelArts Notebook 更经济:

  1. 登录 ECS 控制台,创建实例选 Ascend 910B 规格(如 ecs.ebmgn7.16xlarge
  2. Huawei Cloud EulerOS 2.0Ubuntu 20.04 镜像
  3. 系统启动后,按下方"装 CANN 工具链"步骤继续

适合场景:模型训练、超参搜索、批量推理。

3. 本地 NPU 物理机(自建机房)

公司或实验室自建昇腾服务器,按官方文档分驱动、固件、CANN三步装。本节步骤来自华为官方文档 安装 NPU 驱动和固件安装 CANN(Conda 在线安装),请以官方文档为准。

步骤 1:创建运行用户(root 操作)

驱动/固件默认运行用户是 HwHiAiUser,必须先创建:

groupadd HwHiAiUser
useradd -g HwHiAiUser -d /home/HwHiAiUser -m HwHiAiUser -s /bin/bash
步骤 2:装依赖(root 操作)
apt-get update
apt-get install -y make dkms gcc linux-headers-$(uname -r)
步骤 3:装驱动(root 操作)

驱动和固件是两个独立的 .run 包,首次安装顺序:驱动 → 固件

chmod +x Ascend-hdk-<chip_type>-npu-driver_<version>_linux-<arch>.run
./Ascend-hdk-<chip_type>-npu-driver_<version>_linux-<arch>.run --full --install-for-all

成功回显:Driver package installed successfully!

步骤 4:装固件(root 操作)
chmod +x Ascend-hdk-<chip_type>-npu-firmware_<version>.run
./Ascend-hdk-<chip_type>-npu-firmware_<version>.run --full

成功回显:Firmware package installed successfully! Reboot now or after driver installation for the installation/upgrade to take effect.

步骤 5:重启(如提示需要)
reboot
步骤 6:验证驱动
npu-smi info
# 应看到 NPU 设备列表(型号、显存、温度、占用率)
步骤 7:装 CANN(Conda 方式)

官方推荐 conda 在线安装,而非 .run 包。先配昇腾源:

conda config --add channels https://repo.huaweicloud.com/ascend/repos/conda/
conda install ascend::cann-toolkit==9.1.0.beta.1

按芯片系列装 ops 算子包(910B 选 910b-ops):

conda install ascend::cann-910b-ops==9.1.0.beta.1

配置环境变量(按实际安装路径替换):

source /home/miniconda3/Ascend/cann/set_env.sh

验证:

conda list | grep cann
步骤 8:装 torch_npu(pip)

文档中 torch_npu 的具体 wheel 来源因 CANN 版本而异,建议按你安装的 CANN 版本查 官方文档 或 torch_npu 仓库 README 选择对应 wheel。通用做法:

pip install torch torch_npu
python -c "import torch_npu; print(torch_npu.npu.device_count())"
# 应输出 >= 1

适合场景:内网合规、数据不出域、长期稳定负载。

选哪条路径?

需求 推荐路径
5 分钟内跑通 sample ModelArts
训练大模型(小时~天级) ECS 910B
内网/合规/长期 本地 NPU

必学 API:10 个核心调用

# API 用途 类比 NVIDIA
1 import torch, torch_npu 加载 PyTorch + NPU 后端 -
2 import torch_npu.npu as npu NPU 函数命名空间 import torch.cuda as cuda
3 torch.randn(3, 4).npu() tensor 转到 NPU .cuda()
4 tensor + 1 基本运算(GPU 透明) -
5 tensor.device 查看设备 'cuda:0'
6 npu.synchronize() 同步等待 cuda.synchronize()
7 npu.set_device(0) 选卡(多卡场景) cuda.set_device(0)
8 torch.zeros(2, 3, device='npu') 直接在 NPU 上创建 tensor device='cuda'
9 tensor.cpu().numpy() 转回 CPU -
10 npu.is_available() 检查 NPU 是否可用 cuda.is_available()

完整最小脚本(验证环境):

import torch
import torch_npu
import torch_npu.npu as npu

# 1. 检查 NPU
print(f"NPU available: {npu.is_available()}")
print(f"NPU device count: {npu.device_count()}")

# 2. tensor 转到 NPU
x = torch.randn(3, 4).npu()
y = torch.ones(3, 4).npu()
z = x + y

# 3. 查看设备
print(f"x.device = {x.device}")   # npu:0

# 4. 同步 + 选卡
npu.set_device(0)
npu.synchronize()

# 5. 转回 CPU
z_cpu = z.cpu().numpy()
print(z_cpu)

跑通这个脚本,环境就 OK 了。

ResNet-50 推理:5 分钟流程

目标:在 NPU 上跑一次 ResNet-50 推理,看输出。完整脚本:

import torch
import torch_npu
import torch_npu.npu as npu
from torchvision.models import resnet50
import time

# 检查 NPU
assert npu.is_available(), "NPU 不可用,请检查驱动/CANN 安装"
print(f"✓ NPU device count: {npu.device_count()}")

# 模型加载到 NPU
model = resnet50(weights="IMAGENET1K_V1").eval().npu()

# 准备输入(生产环境用真实图像 + 预处理)
dummy_input = torch.randn(1, 3, 224, 224).npu()

# warmup(首次编译算子)
with torch.no_grad():
    _ = model(dummy_input)
npu.synchronize()

# 推理 + 计时
t0 = time.time()
with torch.no_grad():
    output = model(dummy_input)
npu.synchronize()
elapsed = (time.time() - t0) * 1000

# 输出
print(f"✓ Output shape: {tuple(output.shape)}")
print(f"✓ Predicted class: {output.argmax(dim=1).item()}")
print(f"✓ Inference time: {elapsed:.1f} ms (910B3)")

预期输出(910B3 单卡):

✓ NPU device count: 1
✓ Output shape: (1, 1000)
✓ Predicted class: <随机 0-999>
✓ Inference time: <50 ms

跑通这个就完成了入门目标——NPU 上能加载模型、能跑推理、能同步输出。

常见问题排查

问题 原因 解决
npu.is_available() 返回 False 驱动未装 / CANN 路径不对 重装驱动;echo $LD_LIBRARY_PATH 应包含 /usr/local/Ascend/...
RuntimeError: No NPU device found PCIe 槽位未识别 检查 `lspci
ImportError: libhccl.so: cannot open shared object file CANN 是 .run 全局装在 /usr/local/Ascend/,conda env 没把 lib 目录加到 LD_LIBRARY_PATH 见下方「libhccl.so 排查」详细说明
模型加载慢(首次 30s+) 第一次 JIT 编译算子 第二次会快得多,属正常现象
tensor.npu() OOM batch size 太大 减小 batch;用 npu.memory_summary() 查看显存
推理结果与 NVIDIA 偏差大 用了 FP16 但未做 loss scaling 改回 FP32 验证;或加 GradScaler
ModelArts Notebook 找不到 NPU 实例规格不是 Ascend 创建时选 modelarts.bm.ascend910b.* 规格

libhccl.so 找不到(最常见的混合安装坑)

症状

import torch_npu
# ImportError: libhccl.so: cannot open shared object file: No such file or directory

根因:当 CANN 用 .run 包全局装在 /usr/local/Ascend/,而 torch_npupip 装在 conda env 时,torch_npu._C 扩展需要 link 到 libhccl.so,但当前 conda env 没有 source CANN 的环境变量,LD_LIBRARY_PATH 没指向 CANN 的 lib 目录。

排查

# 确认 libhccl.so 实际存在
find /usr/local/Ascend -name "libhccl.so" 2>/dev/null
# 应输出多个路径,例如:
# /usr/local/Ascend/cann-<version>/lib64/libhccl.so

# 确认当前 conda env 是否 link 到
conda run -n <env> bash -c "ldd \$(python -c 'import torch_npu._C; print(torch_npu._C.__file__)' 2>/dev/null) | grep hccl"
# 修复前:找不到
# 修复后:libhccl.so => /usr/local/Ascend/.../lib64/libhccl.so

修复(推荐永久方案):在 conda env 的 activate.d 写脚本,自动 source CANN:

# 假设 CANN 装在 /usr/local/Ascend/cann-<version>
mkdir -p $CONDA_PREFIX/etc/conda/activate.d
cat > $CONDA_PREFIX/etc/conda/activate.d/cann.sh << 'EOF'
#!/bin/bash
source /usr/local/Ascend/cann-<version>/set_env.sh
EOF
chmod +x $CONDA_PREFIX/etc/conda/activate.d/cann.sh

之后 conda activate <env> 会自动 source CANN 环境变量,python 直接能找到 libhccl.so

临时方案(不持久):

conda run -n <env> bash -c "source /usr/local/Ascend/cann-<version>/set_env.sh && python your_script.py"

验证脚本(5 行):

import torch_npu.npu as npu
print(f"NPU available: {npu.is_available()}")
print(f"NPU device count: {npu.device_count()}")

预期输出:True 和大于等于 1。

附加警告(功能不受影响):

  • owner does not match the current owner:CANN 是 root 装的,当前用户非 root。如要消除:sudo chown -R $USER:$USER /usr/local/Ascend/...(生产机器慎用)
  • Version: X.Y.Z is invalid:torch_npu wheel 与 CANN 版本不完全匹配。查官方文档装对应版本的 wheel

资源与进阶路径

推荐资源

  • 昇腾官方文档:https://www.hiascend.com/document
  • 官方 samples 仓:https://gitee.com/ascend/samples(notebooks/0_basic/ 是入门起点)
  • 启智社区:大量中文 notebook 与案例(搜索"昇腾")
  • MindSpore 文档:https://www.mindspore.cn/
  • 昇腾开发者社区:https://www.hiascend.com/forum

跑通 sample 后的进阶路径

  1. notebooks/1_advanced/:混合精度 + 性能调优
  2. msprof profile 推理瓶颈
  3. 试 vLLM-Ascend 跑大模型推理
  4. 读 AscendC 文档开始写自定义算子
  5. 跑 MindSpeed 训练大模型(参考 Qwen/DeepSeek 昇腾版)

一句话:跑通第一个 sample 比读 10 篇文档有用——去 gitee.com/ascend/samples clone 下来,按本文 5 分钟流程跑通 ResNet-50,然后才有后续的优化空间。

Logo

鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。

更多推荐