关于 huawei-cloud-ascendc-operator-performance-optim
为 AscendC 自定义算子开发与性能优化提供指导,面向使用 Ascend NPU 的开发者。涵盖性能分析、瓶颈定位、算子实现、优化和验证,重点针对 Ascend 910B。
主要功能
- 01使用性能分析定位瓶颈
- 02开发 AscendC 自定义算子
- 03优化内存、计算与数据布局
- 04验证算子正确性和性能
- 05提供 Ascend NPU 优化实践
适用场景
- 01优化 Ascend NPU 上的关键算子
- 02为特定工作负载开发自定义算子
- 03解决性能分析发现的算子瓶颈
- 04为 NPU 部署实现缺失算子
安装
复制下面的命令,在终端中运行。
$
npx skills add https:/ / github.com/ huaweicloud/ huaweicloud-skills --skill huawei-cloud-ascendc-operator-performance-optim安装后在 Claude Code 中输入/huawei-cloud-ascendc-operator-performance-optim确认已加载。
包含的文件
除 SKILL.md 外,安装时一起下载的参考资料和脚本。
references/acceptance-criteria.mdapi-usage-prof.mddata-copy-prof.mdmemory-prof.mdpipeline-prof.mdscalar-prof.mdtiling-prof.mdtroubleshooting.mdverification-method.mdreferences/ascendc-api/basic-data-structures-api.mddata-copy-api.mdGUIDE.mdkernel-constraints.mdresource-management-api.mdsync-control-api.mdvector-compute-api.mdscripts/e2e_compare.she2e_compile_run.she2e_profile_onboard.she2e_profile_simulator.sh详细介绍
Huawei Cloud AscendC 算子性能优化
概述
此技能为使用 AscendC 编程语言开发和优化自定义算子提供指导。
架构:性能分析 → 瓶颈识别 → 算子开发 → 优化 → 验证
相关技能:
huawei-cloud-ascend-profiler-db-explorer- 性能数据分析和瓶颈识别huawei-cloud-ascend-small-model-migrate- 可能需要算子优化的迁移工作流
架构组件
此技能涉及以下云服务和组件:
- AscendC:用于开发自定义算子的编程语言
- CANN:Huawei Cloud 的 NPU AI 计算平台
- Ascend 910B:用于部署算子的目标 NPU 硬件
- Ascend Profiler:用于验证的性能分析工具
架构图:
┌─────────────────────────────────────────────────────────────┐
│ AscendC Operator Optimization Skill │
├─────────────────────────────────────────────────────────────┤
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Performance │───▶│ Bottleneck │───▶│ Operator │ │
│ │ Analysis │ │ Identification│ │ Development │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
│ │ │ │ │
│ ▼ ▼ ▼ │
│ ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │
│ │ Profiling │ │ Optimization│ │ Validation │ │
│ │ Data │ │ Techniques │ │ & Testing │ │
│ └──────────────┘ └──────────────┘ └──────────────┘ │
└─────────────────────────────────────────────────────────────┘
使用场景
典型问题场景:
- 优化 Ascend NPU 上对性能要求较高的算子
- 为特定工作负载开发自定义算子
- 通过算子优化提升模型推理性能
- 修复分析过程中发现的算子瓶颈
- 为 NPU 部署实现缺失的算子
典型用户表述:
- “优化我的 Ascend 自定义算子”
- “为 GEMM 开发 AscendC 算子”
- “提升 NPU 上的推理性能”
- “修复瓶颈算子”
- “使用 AscendC 实现自定义算子”
- “AscendCOperator”
- “OptimizationAscendOperatorPerformance”
- “OperatorPerformance”
范围
支持:
- 使用 AscendC 开发自定义算子
- 优化现有算子的性能
- 算子验证和测试
不支持:
- 非 AscendC 算子开发
- 框架级优化
核心工作流
1. 性能分析
- 使用性能分析工具识别性能瓶颈
- 分析算子执行时间和资源利用率
2. 瓶颈识别
- 识别执行时间较长的算子
- 确定优化机会
3. 算子开发
- 使用 AscendC 实现自定义算子
- 遵循 AscendC 最佳实践
4. 优化技术
- 内存优化
- 计算优化
- 数据布局优化
5. 验证
- 验证功能正确性
- 验证性能提升
参考文档
| 文档 | 描述 |
|---|---|
| 验收标准 | 功能验收标准 |
| 验证方法 | 验证方法 |
| 故障排除 | 常见问题及解决方案 |
前提条件
- 已安装 CANN >= 7.0.0
- 已安装 AscendC >= 1.0.0
- 已安装 Ascend NPU 驱动,且运行正常
- 待优化的算子代码或性能数据
核心命令
# Analyze operator performance bottlenecks
msprof --output=/path/to/output ./my_operator
# Optimize operator using AscendC
# Refer to CANN development guide for operator development
参数确认
| 参数 | 描述 | 必填 |
|---|---|---|
| 算子代码路径 | 待优化的算子源代码 | 是 |
| 输出目录 | 性能分析结果的输出路径 | 是 |
| 优化策略 | 性能优化方案选择 | 否 |
输出格式
性能分析结果保存在指定的输出目录中:
output/
├── summary.json # Performance summary
├── operator_stats.csv # Operator execution statistics
├── timeline.json # Execution timeline data
└── recommendations.md # Optimization recommendations
摘要 JSON 结构:
{
"total_time_ms": 1234.56,
"operator_count": 42,
"top_operators": [
{"name": "CustomGEMM", "time_ms": 456.78, "percentage": 37.0},
{"name": "VectorAdd", "time_ms": 123.45, "percentage": 10.0}
],
"optimization_candidates": ["CustomGEMM", "DataTransfer"]
}
验证方法
功能验证
- 使用测试输入运行算子
- 将输出与参考实现进行比较
- 验证数值精度(FP32 容差:1e-5,FP16 容差:1e-3)
性能验证
- 测量优化前算子的基准性能
- 应用优化改动
- 测量优化后算子的基准性能
- 计算加速比:
speedup = time_before / time_after
验收标准
- 功能正确性:输出与参考结果的差异在容差范围内
- 性能提升:Speedup >= 1.2x(提升 20%)
- 无回归:其他算子不受影响
最佳实践
内存优化
- 大型张量使用 GM(全局内存)
- 矩阵运算的中间结果使用 L1/L0A/L0B
- 将内存访问对齐到 32 字节边界
- 尽可能复用内存缓冲区
计算优化
- 使用 AscendC 内建函数向量化运算
- 矩阵运算使用 MMA(矩阵乘加)
- 并行执行相互独立的运算
- 尽量减少同步点
数据布局优化
- 矩阵运算使用 NZ 格式
- 向量运算使用 ND 格式
- 避免不必要的格式转换
- 考虑数据访问时的内存合并
代码结构
- 将计算逻辑与内存操作分离
- 使用模板元编程提高灵活性
- 记录优化所依据的假设
- 每次优化前后都进行性能分析
注意事项
常见陷阱
- 内存 bank 冲突:确保数据分布在不同内存 bank 中
- 未对齐访问:检查所有缓冲区是否按 32 字节对齐
- 过度同步:尽量减少内核间的屏障使用
- 数据格式错误:根据运算类型匹配格式(矩阵乘法使用 NZ,向量运算使用 ND)
性能提示
- 先进行性能分析,找出真正的瓶颈
- 优先关注热点路径(总耗时超过 10% 的运算符)
- 与微优化相比,优先考虑算法层面的改进
- 使用符合实际情况的输入规模进行测试
- 每次优化后都验证正确性
调试提示
- 使用
ASCENDC_DEBUG=1输出详细日志 - 查看
/var/log/npu/中的 CANN 日志文件 - 与 CPU 参考实现进行比较
- 使用
msprof进行详细的性能分解
限制
- AscendC 运算符特定于硬件(910B)
- 并非所有 PyTorch 运算符都有对应的 AscendC 实现
- 自定义运算符需要重新编译 CANN 才能部署
评论
支持 Markdown