原始仓库:https://github.com/decisionintelligence/Aurora
目标硬件:华为昇腾 910B / Atlas 800T A2
CANN 版本:8.2.RC1
PyTorch:2.5.1
torchvision:0.20.1
torch_npu:2.5.1
关于 PyTorch 版本
Aurora 原始
requirements.txt声明torch==2.4.0,但昇腾官方对 CANN 8.2.RC1 不再发布 torch 2.4.0 配套的 torch_npu(torch 2.4.0 的 torch_npu 配套版本最高仅到 CANN 8.0.0)。 因此必须把 PyTorch 一并升级到 2.5.1。torch 2.5 对 Aurora 用到的nn.Linear / nn.TransformerEncoderLayer / torch.fft / torch.linalg.pinv / F.scaled_dot_product_attention等 API 完全向后兼容,无破坏性改动。
| 文件 | GPU 依赖点 | 适配难度 |
|---|---|---|
runner.py | model.cuda(), torch.cuda.device_count() | |
aurora/modeling_aurora.py | torch.fft.rfft/irfft, 0.5 ** torch.arange(...)(缺 device) | |
aurora/util_functions.py | torch.linalg.pinv, causal_attention_mask().to(device) 拷贝 | |
aurora/modality_connector.py | ViT/BERT,已用 .to(device) — 无需改 | |
aurora/prototype_retriever.py | 已用 device=x.device — 无需改 | |
trainer/hf_trainer.py | 继承 HF Trainer,自动支持 NPU | |
deepspeed.json | "device": "cuda" |
策略:torch_npu transfer_to_npu 全局重定向
+ 运行时小粒度 monkey-patch(apply_all_patches)
+ launcher 入口包装(无需修改 runner.py)核心原理:
torch_npu.contrib.transfer_to_npu 把 tensor.cuda() / torch.cuda.* 重定向到 NPU。apply_all_patches() 在运行时替换 aurora.util_functions.resample / causal_attention_mask,并在 NPU 不支持 FFT 时全局替换 torch.fft.rfft/irfft。aurora_launcher.py 在 runner.py 之前完成所有上述初始化,不需要修改任何 Aurora 上游代码。| 组件 | 推荐 |
|---|---|
| NPU | 昇腾 910B |
| 主机 | Atlas 800T A2 |
| 内存 | ≥ 64 GB |
| 操作系统 | EulerOS 2.10 / Ubuntu 22.04 ARM64 |
| 组件 | 版本 | 说明 |
|---|---|---|
| 驱动(HDK) | 24.1.0 及以上 | 与 CANN 8.2 配套,需先于 CANN 安装 |
| CANN Toolkit | 8.2.RC1 | NPU 底层算子库 |
| Python | 3.10 | 也支持 3.9 / 3.11 |
| PyTorch | 2.5.1 | 从 Aurora 原 2.4.0 升级;torch 2.4 在 CANN 8.2 已无配套 |
| torchvision | 0.20.1 | 必须与 torch 2.5.1 严格匹配 |
| torch_npu | 2.5.1 | 昇腾官方 CANN 8.2.RC1 推荐版本 |
| 昇腾 DeepSpeed | gitee.com/ascend/DeepSpeed master | HCCL 后端必需 |
| transformers | 4.46.0 | HF Trainer 已自动识别 NPU |
三者版本必须严格对应:CANN 8.2.RC1 ↔ torch 2.5.1 ↔ torch_npu 2.5.1。
# 1) 安装 CANN 8.2
# https://www.hiascend.com/developer/download/community/result?module=cann
chmod +x Ascend-cann-toolkit_8.2.RC1_linux-aarch64.run
./Ascend-cann-toolkit_8.2.RC1_linux-aarch64.run --install
source /usr/local/Ascend/ascend-toolkit/set_env.sh
echo 'source /usr/local/Ascend/ascend-toolkit/set_env.sh' >> ~/.bashrc
# 2) 下载昇腾官方 whl(不在 PyPI 上)
mkdir -p aurora-npu-adaptation/whl_cache
# - torch 2.5.1 : https://www.hiascend.com/developer/download/community/result?module=pt
# - torchvision 0.20.1: 同上页面(若无 ARM 预编译包,install_env.sh 会自动 pip 安装)
# - torch_npu 2.5.1 : https://gitee.com/ascend/pytorch/releases → 选择 v2.5.1
# 把所有 whl 放进 whl_cache/
# 3) 一键安装
bash aurora-npu-adaptation/scripts/install_env.sh
# 4) 验证
source aurora-npu-adaptation/venv_npu/bin/activate
python aurora-npu-adaptation/scripts/verify_npu.py| 序号 | 文件 | 改动 |
|---|---|---|
| M1 | deepspeed.json | "device": "cuda" → "device": "npu";启用 bf16、禁用 fp16 |
用
configs/deepspeed_npu.json直接替换即可,无需修改其他文件。
| 改动点 | 实现方式 |
|---|---|
model.cuda() → 自动重定向到 NPU | transfer_to_npu(自动) |
nccl → hccl | 昇腾版 DeepSpeed + import torch_npu(自动) |
resample 中 pinv 加 CPU 回退 | patch_resample() |
causal_attention_mask 接受 device 参数 | patch_causal_attention_mask() |
torch.fft.rfft / irfft 在 NPU 不支持时走 CPU | patch_fft_to_cpu() |
decay_weights 缺 device 的告警 | apply_all_patches() 内部检测并打印警告 |
以下改动可消除运行时探测开销,但不是必需:
aurora/modeling_aurora.py 中将decay_weights = 0.5 ** torch.arange(predict_token_num)decay_weights = (0.5 ** torch.arange(predict_token_num, device=hidden_states.device)).to(hidden_states.dtype)aurora/util_functions.py 调用 causal_attention_mask 的地方,causal_attention_mask(n).to(x.device) 改为 causal_attention_mask(n, device=x.device)# 1) 安装环境(见 §2.3)
bash aurora-npu-adaptation/scripts/install_env.sh
# 2) 自检
python aurora-npu-adaptation/scripts/verify_npu.py
# 3) 启动训练 —— 不需要修改任何 Aurora 代码!
bash aurora-npu-adaptation/scripts/run_train_npu.shtorchrun runner ─┐
│
▼
aurora_launcher.py
│
├─ ① import npu_compat ← transfer_to_npu 注册 + 算子探测
├─ ② setup_device(local_rank) ← NPU 设备绑定(HCCL 前置)
├─ ③ apply_all_patches() ← 给 aurora.util_functions / torch.fft 打补丁
│
└─→ runpy.run_path("Aurora/runner.py") ← 跑上游代码关键保证:npu_compat 在 import aurora 之前完成加载,否则 aurora 内的 nn.Module 实例化(含 nn.Parameter)就已经在 CPU 上,后续 .cuda() 调用会触发 transfer_to_npu 但参数已存在 — 行为不再可控。
如果不想用 launcher,请参考 patches/runner_npu.py 在原 runner.py 顶部添加:
import os, sys
sys.path.insert(0, "/path/to/aurora-npu-adaptation")
import npu_compat
from patches.apply_all_patches import apply_all_patches
apply_all_patches()然后把 model.cuda() 改成 model.to(npu_compat.get_device(local_rank))。
runner.py改动方式 (推荐,零改动):使用 aurora_launcher.py。
aurora/util_functions.py上游文件含
RoPE_decoder、sinusoidal_position_embedding等被modeling_aurora.py直接 import 的函数,整体覆盖会触发ImportError。
正确做法:调用 patches/util_functions_npu.py 中的两个小粒度补丁函数:
from patches.util_functions_npu import patch_resample, patch_causal_attention_mask
patch_resample() # 仅替换 resample(pinv 加 CPU 回退)
patch_causal_attention_mask() # 仅替换 causal_attention_mask(接受 device 参数)这两个补丁已被 apply_all_patches() 自动调用。
aurora/modeling_aurora.py不要尝试包裹整个 AuroraPatchEmbedding.forward——这会把 NPU 上的 nn.Linear 权重与临时搬到 CPU 的输入混在一起,触发 device mismatch。
正确做法:CANN 8.2+ 已原生支持 torch.fft.rfft/irfft,无需任何 patch。
退一步:若使用更低版本 CANN,apply_all_patches() 会自动调用 patch_fft_to_cpu(),把 torch.fft.rfft/irfft 替换为「输入若在 NPU 则内部走 CPU、输出搬回原设备」的版本。由于 FFT 没有可学习参数,CPU↔NPU 拷贝不会引入 device mismatch。
aurora/flow_loss.py / prototype_retriever.py / modality_connector.py无需改动。这些文件已正确使用 tensor.device 进行设备传播。
trainer/hf_trainer.py无需改动。HuggingFace Trainer 在 transformers >= 4.40 中已通过 accelerate 支持 NPU。
| 算子 | CANN 8.0 | CANN 8.2+ | 处理方式 |
|---|---|---|---|
torch.fft.rfft / irfft | 部分支持 | ✓ 完整 | 8.0 时由 patch_fft_to_cpu 自动回退 |
torch.linalg.pinv | 不支持 | ✓ | 8.0 时由 safe_linalg_pinv 自动回退 |
F.interpolate(linear) | ✓ | ✓ | 无需处理(Aurora resample 必需) |
F.scaled_dot_product_attention | ✓ (FA) | ✓ (FA) | 无需处理 |
| BF16 矩阵运算 | ✓ (910B 原生) | ✓ | 推荐启用 |
torch.matmul / linear | ✓ | ✓ | 无需处理 |
| 策略 | 拷贝次数 | 风险 |
|---|---|---|
全局 patch torch.fft.rfft/irfft(本方案) | 4 | 无 — FFT 是无状态运算 |
⚠ 调用方手动改为 _fft_augment_npu_safe | 2 | 需改 modeling_aurora.py |
选择「全局 patch」是因为它不依赖对上游代码的认知,对 CANN 8.0 / 8.2 都安全。CANN 8.2+ 用户该 patch 不会触发。
WARNING [NPU] 检测到 FP16 精度。昇腾 910B 原生支持 BF16 且无需 loss scaling,
强烈建议改用 --precision bf16 以获得更好的稳定性与性能。如果非要用 FP16:amp_grad_scaler("fp16") 会返回 torch_npu.npu.amp.GradScaler(),与 CUDA 用法一致。
标准 PyPI 的 deepspeed 不识别 HCCL 后端。即使 JSON 中写了 "communication_backend": "hccl" 也会被忽略(这不是官方字段)。
正确做法:
git clone https://gitee.com/ascend/DeepSpeed.git
cd DeepSpeed
pip install -e .只改两处(其他字段保持上游不变):
{
"bf16": { "enabled": true },
"fp16": { "enabled": false }
}完整文件见 configs/deepspeed_npu.json,已删除上一版本中错误的 "communication_backend" 和误导性的 aio 段。
# launcher 中已自动完成以下三步:
import torch_npu # ① 注入 hccl backend
import torch.distributed as dist
dist.init_process_group(backend="hccl") # ② 显式 hccl
torch.npu.set_device(local_rank) # ③ 绑卡启动命令:
bash aurora-npu-adaptation/scripts/run_train_npu.sh \
--max_steps 1000 \
--logging_steps 10启动脚本中已自动设置:
export PYTHONPATH="${ADAPTATION_DIR}:${AURORA_DIR}:${PYTHONPATH}" # sitecustomize 自动加载 npu_compat
export AURORA_NPU_AUTOLOAD=1
export HCCL_TIMEOUT=1800
export PYTORCH_NPU_ALLOC_CONF="expandable_segments:True"python aurora-npu-adaptation/scripts/verify_npu.py新版输出包含 9 节:基础环境 / 设备状态 / 必需算子 / 可选算子 / safe_* 自检 / Aurora 级 smoke test / 分布式后端 / DeepSpeed / 汇总。
safe_* 自检会构造一个 mini patch embedding(nn.Linear 在 NPU + FFT 频域掩码),验证输入输出设备一致性 — 复现上一版本 _patched_forward 触发 device mismatch 的场景。
NPROC_PER_NODE=2 bash aurora-npu-adaptation/scripts/run_train_npu.sh \
--max_steps 5 --logging_steps 1昇腾 910B 强烈推荐 BF16:硬件原生支持、无需 GradScaler、数值范围与 FP32 一致。
export HCCL_BUFFSIZE=200 # MB
# DeepSpeed config: "overlap_comm": true (已默认)export PYTORCH_NPU_ALLOC_CONF="expandable_segments:True"import torch_npu
torch_npu.npu.set_compile_mode(jit_compile=False) # 二进制复用,首次后无编译开销npu_compat.set_npu_options() 已在导入时自动设置。
RuntimeError: Expected all tensors to be on the same devicenpu_compat 未在 import aurora 之前加载。
→ 改用 scripts/run_train_npu.sh,或检查 PYTHONPATH 是否包含 aurora-npu-adaptation 目录(让 sitecustomize.py 生效)。decay_weights)未显式指定 device。
→ 查看启动日志中是否有 [NPU-PATCH] 检测到 modeling_aurora.py 中 decay_weights ... 告警,按提示手改。HCCL backend not supportedgit clone https://gitee.com/ascend/DeepSpeed && pip install -e .import torch_npu → 用 aurora_launcher.py 启动。torch.fft.rfft is not implemented on NPUCANN < 8.2 才会出现。两种修复:
apply_all_patches() 在 import aurora 之前调用(launcher 默认会做)。ImportError: cannot import name 'RoPE_decoder' from 'aurora.util_functions'你把 patches/util_functions_npu.py 整文件复制覆盖了上游 aurora/util_functions.py。
→ 还原上游文件,改用 apply_all_patches() 做运行时补丁。
pip install torch-npu 失败 / 404PyPI 上没有昇腾版 torch_npu,必须从 Gitee Releases 下载 whl:
https://gitee.com/ascend/pytorch/releases → 选择 v2.5.1(CANN 8.2.RC1 配套)
OSError: libtorch_npu.so: version 'GLIBCXX_X.X' not found 或导入 torch_npu 段错误通常是 torch / torch_npu / CANN 三者版本错配 导致:
解决:严格按 §2.2 矩阵安装 — CANN 8.2.RC1 + torch 2.5.1 + torch_npu 2.5.1。
pip uninstall -y torch torch_npu torchvision
# 重新按 install_env.sh 流程从昇腾官方 whl 安装
bash aurora-npu-adaptation/scripts/install_env.sh