昇腾 NPU 入门
昇腾 NPU 入门:5 分钟跑通 ResNet-50 推理
已有昇腾开发者账号?本文给出最短路径——从拿到云上 NPU 实例,到 10 个必学 API,再到 5 分钟跑通 ResNet-50 推理。读完后你应该能独立在新机器上启动 NPU 任务。
环境准备:3 条路径
1. 华为云 ModelArts(推荐,最快)
ModelArts 是华为云的 AI 开发平台,开箱即用——预装 CANN、torch_npu、MindSpore,无需手动装驱动。流程:
- 登录 https://console.huaweicloud.com/modelarts
- 创建 Notebook 实例,选 Ascend 910B 规格(如
modelarts.bm.ascend910b.8x) - 等 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 更经济:
- 登录 ECS 控制台,创建实例选 Ascend 910B 规格(如
ecs.ebmgn7.16xlarge) - 选 Huawei Cloud EulerOS 2.0 或 Ubuntu 20.04 镜像
- 系统启动后,按下方"装 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_npu 用 pip 装在 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 后的进阶路径
notebooks/1_advanced/:混合精度 + 性能调优- 用
msprofprofile 推理瓶颈 - 试 vLLM-Ascend 跑大模型推理
- 读 AscendC 文档开始写自定义算子
- 跑 MindSpeed 训练大模型(参考 Qwen/DeepSeek 昇腾版)
一句话:跑通第一个 sample 比读 10 篇文档有用——去 gitee.com/ascend/samples clone 下来,按本文 5 分钟流程跑通 ResNet-50,然后才有后续的优化空间。
鲲鹏昇腾开发者社区是面向全社会开放的“联接全球计算开发者,聚合华为+生态”的社区,内容涵盖鲲鹏、昇腾资源,帮助开发者快速获取所需的知识、经验、软件、工具、算力,支撑开发者易学、好用、成功,成为核心开发者。
更多推荐



所有评论(0)