skills/npu-adapter-reviewer/SKILL.md
GPU代码到昇腾NPU适配审查专家。当用户需要将GPU上的代码(特别是深度学习、模型推理相关)迁移到华为昇腾NPU时,必须使用此skill进行全面审查。此skill能识别GPU到NPU迁移的堵点、编写适配脚本、生成验证方案,并输出完整的Markdown审查报告。触发场景包括:用户提到"NPU适配"、"昇腾迁移"、"GPU转NPU"、"Ascend"、"CANN"、"模型迁移"、"算子适配"等关键词,或者用户要求对GPU代码仓库进行审查并迁移到NPU平台。
npx skillsauth add Ascend/agent-skills npu-adapter-reviewerInstall this skill globally with one command. Works with Claude Code, Cursor, and Windsurf.
3 of 9 scanners reported clean
Some scanners were skipped, did not run, or reported a non-clean status. Review each row below.
这是一个专门用于将GPU代码适配到华为昇腾NPU的Agent Skill。本技能覆盖完整的适配工作流:代码分析、堵点识别、适配脚本编写、验证方案设计、以及最终报告生成。
任务1.1:获取源代码
根据用户提供的输入(本地路径或GitHub链接),获取完整的代码仓库:
# 如果是GitHub链接,先克隆
git clone <repo_url> /tmp/gpu_code_base
cd /tmp/gpu_code_base
# 如果是本地路径,直接分析
ls -la <local_path>
任务1.2:全面代码扫描
使用并行探索的方式分析代码结构:
探索Agent 1 - 代码结构分析
探索Agent 2 - GPU依赖识别
cudaMalloc, cudaMemcpy, kernel<<<...>>>, torch.cuda等).cuda(), .to('cuda'), torch.device('cuda')等)探索Agent 3 - 外部库依赖
import和from ... import语句任务1.3:生成代码结构报告
输出以下信息:
任务2.1:算子兼容性分析
逐类识别GPU专用算子在NPU上的兼容性:
| 堵点类别 | GPU典型实现 | NPU替代方案 | 迁移难度 |
|---------|------------|------------|---------|
| CUDA核心算子 | __global__, __device__函数 | Ascend C算子 / ATB | 高 |
| 内存操作 | cudaMallocHost, cudaMallocManaged | aclrtMalloc, HI_MPI_MALLOC | 中 |
| 流和事件 | cudaStream_t, cudaEvent_t | aclrtStream, aclrtEvent | 中 |
| cuBLAS/cuDNN | cublasGemmEx, cudnnConvolutionForward | aclblasGemmEx, 算子融合 | 高 |
| Flash Attention | flash_attn_varlen_func | 昇腾Flash Attention算子 | 中 |
| 自定义算子 | PyTorch CUDA扩展 | ATC/ACL算子 | 高 |
| AMP/混合精度 | torch.cuda.amp | ascend_mixed_precision | 低 |
任务2.2:识别具体堵点
对每个GPU API调用,生成以下分析:
### 堵点编号: #001
- **文件位置**: `src/attention/cuda_impl.cu:142`
- **GPU API**: `cudaStreamCreate(&stream)`
- **NPU替代**: `aclrtCreateStream(&stream)`
- **迁移方案**:
1. 替换头文件 `aclrt.h`
2. 替换API调用
3. 处理错误码差异
- **预估工作量**: 0.5人天
- **影响范围**: 全局流管理
任务2.3:生成堵点清单
输出完整的堵点列表,按影响范围和迁移难度排序。
任务3.1:创建NPU适配层
根据识别的堵点,创建适配脚本:
创建 npu_compat.py - Python层兼容适配
# 自动检测运行设备
def get_device():
if is_npu_available():
return "npu"
elif is_cuda_available():
return "cuda"
else:
return "cpu"
# 替换torch.cuda调用
def to_device(tensor):
device = get_device()
if device == "npu":
return tensor.npu()
elif device == "cuda":
return tensor.cuda()
return tensor
创建 npu_ops.py - NPU算子封装
创建 build_npu.sh - 编译脚本
任务3.2:修改原有代码
生成修改后的代码文件,保留原文件并创建.npu版本:
任务4.1:创建验证脚本
根据适配内容,生成验证脚本 verify_npu.sh:
#!/bin/bash
# NPU适配验证脚本
echo "=== 1. 环境检查 ==="
check_npu_env() {
# 检查NPU驱动
ls -la /dev/*npu* 2>/dev/null || echo "Warning: NPU device not found"
# 检查CANN
echo $ASCEND_TOOLKIT_HOME
# 检查Python包
python3 -c "import torch; print('PyTorch version:', torch.__version__)"
python3 -c "import torch_npu; print('torch_npu installed')"
}
echo "=== 2. 模块导入测试 ==="
test_imports() {
cd <project_path>
python3 -c "import npu_compat; print('npu_compat OK')"
python3 -c "import npu_ops; print('npu_ops OK')"
}
echo "=== 3. 功能验证 ==="
test_functions() {
# 运行基础测试
python3 -m pytest tests/test_npu_*.py -v
# 验证算子精度
python3 scripts/verify_precision.py
}
echo "=== 4. 性能基准测试 ==="
benchmark() {
python3 scripts/benchmark.py --device npu --compare cuda
}
任务4.2:精度验证脚本
生成 verify_precision.py:
import numpy as np
def verify_npu_precision(cuda_result, npu_result, rtol=1e-3, atol=1e-3):
"""验证NPU与GPU输出精度差异"""
diff = np.abs(cuda_result - npu_result)
max_diff = np.max(diff)
mean_diff = np.mean(diff)
passed = np.allclose(cuda_result, npu_result, rtol=rtol, atol=atol)
return {
"passed": passed,
"max_diff": max_diff,
"mean_diff": mean_diff,
"rtol": rtol,
"atol": atol
}
任务5.1:生成Markdown报告
根据验证结果,生成完整的审查报告:
# GPU到昇腾NPU适配审查报告
# CodeReview_Results_YYYY-MM-DD.md
## 1. 执行摘要
| 项目 | 内容 |
|-----|------|
| 原始代码仓库 | `<repo_url>` 或 `<local_path>` |
| 审查日期 | YYYY-MM-DD |
| 适配状态 | ✅ 完全适配 / ⚠️ 部分适配 / ❌ 适配失败 |
| 识别堵点总数 | XX个 |
| 已适配堵点 | XX个 |
| 剩余堵点 | XX个 |
## 2. 原始代码分析
### 2.1 代码结构概览
- 总文件数:XX
- Python代码行数:XX
- CUDA/C++代码行数:XX
- 核心模块:...
### 2.2 依赖分析
| 库名 | 版本 | NPU兼容性 | 替代方案 |
|-----|------|----------|---------|
| torch | 2.x | ✅ 兼容 | torch_npu |
| flash-attn | 2.x | ⚠️ 部分 | 昇顿Flash Attention |
## 3. 迁移堵点详细分析
### 3.1 算子兼容性问题
#### 问题 #001: CUDA Stream管理
- **文件**: `src/utils/stream_manager.py:45`
- **GPU API**: `cudaStreamCreate`
- **问题描述**: 使用CUDA流管理异步执行
- **NPU替代**: `aclrtCreateStream`
- **影响范围**: 全局,影响所有异步操作
- **迁移建议**:
```python
# 修改前
import torch.cuda
stream = torch.cuda.Stream()
# 修改后
import torch_npu
stream = torch.npu.Stream()
src/attention/flash_attn_impl.py:78flash_attn_varlen_func# 修改前
from flash_attn import flash_attn_func
output = flash_attn_func(q, k, v)
# 修改后
# 方案1: 使用torch_npu的算子
import torch_npu
output = torch_npu.npu_flash_attention(q, k, v)
# 方案2: 使用ATB库
from ascend_toolkit import flash_attention
output = flash_attention(q, k, v)
src/model/loader.py:112# 修改前
state_dict = torch.load(weights_path)
model.load_state_dict(state_dict)
# 修改后
state_dict = torch.load(weights_path, map_location='cpu')
# 转换权重
for k, v in state_dict.items():
if isinstance(v, torch.Tensor):
state_dict[k] = v.npu()
model.load_state_dict(state_dict)
src/model/inference.py:89src/cache/kv_cache.py:56src/utils/gpu_ext.cpp:145src/server/request_handler.py:78src/config.py:23cuda:0| 文件名 | 功能 | 状态 |
|-------|------|------|
| npu_compat.py | 设备检测与兼容层 | ✅ |
| npu_ops.py | NPU算子封装 | ✅ |
| build_npu.sh | 编译脚本 | ✅ |
| verify_npu.sh | 验证脚本 | ✅ |
| 文件名 | 修改内容 | 状态 |
|-------|---------|------|
| src/attention/flash_attn.py | 替换为NPU算子 | ✅ |
| src/model/loader.py | 添加权重转换 | ✅ |
| src/utils/stream_manager.py | Stream适配 | ✅ |
| 问题类型 | 数量 | 严重程度 | |---------|------|---------| | 已解决 | XX | - | | 待解决 | XX | 高/中/低 |
# 1. 安装CANN Toolkit
# 下载地址: https://www.hiascend.com/software/aiengine
# 2. 安装torch_npu
pip install torch torch_npu
# 3. 验证安装
python3 -c "import torch; import torch_npu; print('NPU available:', torch_npu.is_npu_available())"
步骤1: 克隆并进入项目
git clone <repo_url>
cd <project_name>
步骤2: 安装依赖
pip install -r requirements-npu.txt
步骤3: 运行验证
bash verify_npu.sh
步骤4: 执行推理
python3 run_npu.py --model <model_path> --input <input_data>
| 问题 | 原因 | 解决方案 | |-----|------|---------| | 导入失败 | CANN未正确安装 | 重新配置环境变量 | | 算子不支持 | NPU不支持该算子 | 使用ATB替代或自研算子 | | 内存溢出 | 批处理过大 | 减小batch_size | | 精度不达标 | 混合精度配置问题 | 检查AMP配置 |
报告生成时间: YYYY-MM-DD HH:mm:ss 适配工程师: AI Agent (NPU Adapter Reviewer) 报告版本: v1.0
**任务5.2:输出报告**
将报告保存到当前目录:
CodeReview_Results_YYYY-MM-DD.md
## 输出要求
1. **报告格式**: 必须是Markdown格式
2. **文件命名**: `CodeReview_Results_运行当天的日期.md`(格式:YYYY-MM-DD)
3. **保存位置**: 当前工作目录
4. **内容完整性**: 必须包含上述所有章节
## 特殊处理规则
### 如果验证完全通过
- 输出"适配成功"的状态
- 提供完整的适配指南
- 包含端到端运行说明
### 如果验证未完全通过
- 详细说明每个失败项
- 提供具体的修复建议
- 给出修改后的代码
- 标注需要人工介入的部分
## 知识参考
在执行过程中,可参考以下资料(按需加载):
- `references/ascend_npu_best_practices.md` - 昇腾NPU最佳实践
- `references/cann_migration_guide.md` - CANN迁移指南
- `references/npu_python_api.md` - NPU Python API参考
请使用此skill完成GPU到昇腾NPU的完整适配审查工作。
testing
Kubernetes 集群健康检查与安全修复 — 诊断问题,用户确认后执行修复
tools
昇腾NPU CANN Toolkit+Kernels+NNAL安装部署技能。支持从官网下载run包安装和从Docker镜像提取两种方式,覆盖驱动检查、包下载、安装、环境变量配置与验证全流程。当用户需要安装CANN全套组件或指定版本CANN到自定义路径时调用。
development
编译 ATB (Ascend Transformer Boost) 测试框架。当用户需要编译 ATB 测试框架、 运行 CSV 测试、或构建 atb_test_framework 时调用。支持全量编译(含第三方依赖克隆与源替换) 和增量编译两种模式。需在 Docker 容器内配合 CANN 环境执行。
databases
ATB OPS→ACLNN 迁移标准化工作流主模板。整合前置学习、设计文档生成、CSV用例设计、 实际迁移、编译验证、测试验证全流程,提供明确的阶段 Gates 和用户确认机制。