Orange Pi AIpro (310B) NPU 开发环境搭建

适用硬件: Orange Pi AIpro (20T)

核心芯片: 华为昇腾 Ascend 310B

目标: 从零开始烧写系统,配置环境,并跑通 NPU 推理。

第一步:系统烧写与基础配置

注意:昇腾 NPU 对内核版本要求极高,严禁随意升级 Linux 内核或使用非官方镜像,否则 NPU 驱动会直接失效。

1.1 准备工作

  • TF 卡: 建议 32GB 以上(推荐 SanDisk Class 10 高速卡)。

  • 读卡器: USB 3.0 读卡器。

  • 镜像: Orange Pi 官方 Ubuntu 镜像 (推荐 Desktop 版本,方便调试)。

  • 烧写工具: BalenaEtcher

1.2 镜像烧写

  1. 解压下载的 .img.xz.img 镜像文件。

  2. 打开 BalenaEtcher,选择镜像文件,选择 TF 卡,点击 Flash

  3. 烧写完成后,将卡插入开发板,连接电源(Type-C PD 65W)和 HDMI 显示image

1.3 首次启动与登录

  • 默认用户/密码: HwHiAiUser / Mind@123

  • Root 用户/密码: root / Mind@123

  • 网络连接: 插入网线或点击桌面右上角连接 Wi-Fi,连接网络之后可以提供ssh远程连接或者安装vnc之后实现远程桌面,可不用显示屏了。

第二步:安装 CANN 开发套件与算子包 (核心)

这是最关键的一步。NPU 要工作,必须安装 Toolkit (开发工具集)Kernels (算子二进制包)注意:官方镜像通常预置了基础驱动,但如果你需要升级或重新配置,请按以下步骤操作。

2.1. 下载软件包

前往昇腾开发资源下载中心,下载适配 AArch64 (ARM64) 架构的 run 包:

image

  • Toolkit: Ascend-cann-toolkit_8.0.0.alpha001_linux-aarch64.run (版本号可能不同,以实际为准)

image

  • Kernels: Ascend-cann-kernels-310b_8.0.0.alpha001_linux-aarch64.run (310B 专用算子包,加速编译)

image

2.2. 安装 Toolkit (开发套件)

在终端中进入下载目录,执行安装:

# 1. 赋予执行权限
chmod +x Ascend-cann-toolkit_8.0.0.alpha001_linux-aarch64.run

# 2. 校验软件包
./Ascend-cann-toolkit_8.0.0.alpha001_linux-aarch64.run –check

# 3. 安装软件包
./Ascend-cann-toolkit_8.0.0.alpha001_linux-aarch64.run –install

  • 成功标志:终端显示 Ascend-cann-toolkit_8.0.0.alpha001_linux-aarch64.run install success

2.3. 安装 Kernels (算子包)

这一步是为了让 NPU 在运行推理时,直接调用预编译好的二进制算子,避免现场编译(解决“慢”和“卡”的问题)。

# 1. 赋予执行权限
chmod +x Ascend-cann-kernels-310b_8.0.0.alpha001_linux-aarch64.run

# 2. 校验软件包
./Ascend-cann-kernels-310b_8.0.0.alpha001_linux-aarch64.run –check

# 3. 安装软件包
./Ascend-cann-kernels-310b_8.0.0.alpha001_linux-aarch64.run –install

  • 成功标志:终端显示 Ascend-cann-kernels-310b_8.0.0.alpha001_linux-aarch64.run install sucess

2.4. 配置环境变量 (必做!)

安装完后,必须告诉系统 NPU 库在哪里。

# 编辑配置文件
nano ~/.bashrc

# 在文件末尾添加以下内容:
# (注意:路径中的 ascend-toolkit 可能是 actual 路径,建议去 /usr/local/Ascend 下确认一下)
source /usr/local/Ascend/ascend-toolkit/set_env.sh
export LD_LIBRARY_PATH=/usr/local/Ascend/ascend-toolkit/latest/lib64:$LD_LIBRARY_PATH

# 保存退出,并使其生效
source ~/.bashrc

2.5. 验证安装

输入以下命令,确认 NPU 驱动和软件栈正常:

npu-smi info

看到 Health: OKAlarm,且能看到 Chip ID 为 310B1,说明地基打好。

image

第三步:搭建 Python 与 Conda 环境

为了不把系统自带的 Python 搞乱,我们使用 Conda 来管理环境。

3.1. 安装 Miniforge (ARM64版 Conda)

wget https://github.com/conda-forge/miniforge/releases/latest/download/Miniforge3-Linux-aarch64.sh
bash Miniforge3-Linux-aarch64.sh

# 安装完后重启终端或刷新环境变量
source ~/.bashrc

3.2. 创建专用虚拟环境

# 创建一个名为 npu_env 的环境,使用 Python 3.9 (兼容性最佳)
conda create -n npu_env python=3.9 -y

# 激活环境
conda activate npu_env

第四步:安装 PyTorch 与 NPU 插件

昇腾 NPU 需要专用的 torch_npu 插件才能工作。

4.1. 安装依赖

pip install pyyaml numpy attrs decorator sympy requests

4.2. 安装 PyTorch 和 Torch-NPU

注意版本对应! (例如 Torch 2.1.0 必须配 Torch-NPU 2.1.0)。

  • 方式一:下载 whl 包本地安装 (推荐) 前往华为昇腾官网下载对应版本的 whl 包。

# 示例命令,文件名以实际下载为准
# pip install torch-2.1.0-cp39-cp39-linux_aarch64.whl
# pip install torch_npu-2.1.0.postxxxx-cp39-cp39-linux_aarch64.whl

  • 方式二:在线安装 (需清华源支持)

pip install torch==2.1.0 torch_npu==2.1.0 -i https://pypi.tuna.tsinghua.edu.cn/simple

4.3. 简单验证

安装完成后,直接在终端执行以下命令,验证 NPU 是否被 PyTorch 成功接管:

python -c “import torch; import torch_npu; print(f’NPU状态: {torch.npu.is_available()}, 设备型号: {torch.npu.get_device_name(0)}’)”

预期输出:NPU状态: True, 设备型号: Ascend310B1

image

第五步:运行 NPU 最小工作示例(矩阵运算)

环境搭好了,我们写一个脚本来验证 NPU 是否真的在进行矩阵计算,并与CPU运算结果进行对比。

5.1.创建测试脚本

新建文件 test_npu.py,写入以下代码:

import torch
import torch_npu
import time

# 定义矩阵大小
N = 2048
LOOP_TIMES = 10

print(f"=== 开始性能对比测试 (矩阵大小: {N}x{N}) ===")

# 1. CPU 测试部分
print("\n[1/2] 正在进行 CPU 测试...")
device_cpu = torch.device("cpu")

#生成数据
a_cpu = torch.randn(N, N, device=device_cpu)
b_cpu = torch.randn(N, N, device=device_cpu)

# CPU 预热 (Warm-up)
c_cpu = torch.matmul(a_cpu, b_cpu)

cpu_times = []
for i in range(1, LOOP_TIMES + 1):
    t_start = time.time()
    
    # 计算
    c_cpu = torch.matmul(a_cpu, b_cpu)
    
    t_end = time.time()
    cost = t_end - t_start
    cpu_times.append(cost)
    print(f"  CPU 第 {i} 次耗时: {cost:.6f} 秒")

avg_cpu_time = sum(cpu_times) / len(cpu_times)
print(f"  >>> CPU 平均耗时: {avg_cpu_time:.6f} 秒")

# 2. NPU 测试部分
print("\n[2/2] 正在进行 NPU 测试...")
device_npu = torch.device("npu:0")

# 生成数据 (直接在NPU上生成,或者从CPU搬运)
# 为了纯粹测试计算能力,我们先将数据搬运好,不把搬运时间算在计算耗时里
a_npu = a_cpu.to(device_npu)
b_npu = b_cpu.to(device_npu)

# NPU 预热 (Warm-up) - 这一点对 NPU/GPU 非常重要
c_npu = torch.matmul(a_npu, b_npu)
torch.npu.synchronize() # 确保预热完成

npu_times = []
for i in range(1, LOOP_TIMES + 1):
    # NPU 是异步执行的,必须同步后开始计时
    torch.npu.synchronize()
    t_start = time.time()
    
    # 计算
    c_npu = torch.matmul(a_npu, b_npu)
    
    # 再次同步,确保计算真正结束
    torch.npu.synchronize()
    t_end = time.time()
    
    cost = t_end - t_start
    npu_times.append(cost)
    print(f"  NPU 第 {i} 次耗时: {cost:.6f} 秒")

avg_npu_time = sum(npu_times) / len(npu_times)
print(f"  >>> NPU 平均耗时: {avg_npu_time:.6f} 秒")

# 3. 结果汇总
print("\n" + "=" * 40)
print("测试结果汇总:")
print(f"矩阵规模: {N} x {N}")
print(f"CPU 平均耗时: {avg_cpu_time:.6f} s")
print(f"NPU 平均耗时: {avg_npu_time:.6f} s")

if avg_npu_time > 0:
    speedup = avg_cpu_time / avg_npu_time
    print(f"NPU 相比 CPU 加速比: {speedup:.2f} 倍")
else:
    print("NPU 耗时过短,无法计算准确加速比")
print("=" * 40)

5.2. 运行脚本

在运行脚本之前,必须确保 CANN 环境变量 已加载,且 Conda 虚拟环境 已激活。

请严格按照以下顺序执行命令:

# 1. 加载 CANN 系统变量 (确保 NPU 驱动被识别)
source ~/.bashrc
# 2. 激活 Python 虚拟环境 (确保能找到 torch_npu 库)
conda activate npu_env
# 3. 运行脚本
python test_npu.py

为什么要这么做?

  1. source ~/.bashrc: 你的 .bashrc 里记录了昇腾 Toolkit 的路径(如 LD_LIBRARY_PATH)。如果不运行这一步,Python 找不到 NPU 的底层驱动文件(.so库)。

  2. conda activate npu_env: 你的 PyTorch 和 torch_npu 是装在这个虚拟环境里的。如果不激活,系统默认使用基础 Python,它是没有 NPU 插件的。

5.3. 运行结果

image

  • CPU 跑分(基准线)
  1. 耗时稳定在 0.31 秒 左右。
  2. 这是通用 CPU 处理 2048×2048 矩阵乘法的正常物理极限,代表了“未加速”的状态。
  • NPU 跑分(加速后)
  1. 耗时稳定在 0.03 秒 左右。
  2. 关键点:NPU 的耗时仅为 CPU 的 1/10。这种数量级的差异(10倍或更高)是软件优化无法做到的,只能是硬件加速的结果。

这里NPU的远行时间会很长,主要是因为:

  1. 首次运行 NPU 需要“预热”,包括算子编译,内存分配和Stream的建立。
  2. 数据搬运耗时。
  3. 任务量太小,NPU 适合干重活(如深度学习模型),不适合干琐碎的小活。

结论:只要看到 NPU 平均耗时 远低于 CPU 平均耗时(并在结尾看到 加速比 > 1,例如你的 10.02 倍),即证明 Ascend 310B NPU 已经成功被唤醒并完美接管了计算任务!

请登录后发表评论

    没有回复内容