张大妈

华为NPU性能调优:在910上把UNIAD从48秒优化到2秒

源自知乎:xchencehn

01-22 19:08

本文详述了在华为昇腾910C上,将UNIAD自动驾驶模型的单步训练耗时从48秒优化至2秒的全过程。通过深度剖析底层算子瓶颈、调整数据类型和重构计算同步逻辑,实现了24倍的性能飞跃,为同类型的NPU性能调优提供了极具参考价值的实战经验。

华为NPU性能调优:在910上把UNIAD从48秒优化到2秒智能速览

  • 利用性能分析工具精准定位到`unique_dim`算子是首要瓶颈。

  • 重写底层算子,将单算子耗时从54秒优化至0.019秒。

  • 将`double`类型转为`float`,让计算任务回归AI Core加速。

  • 重构循环逻辑,避免因`.item()`调用产生频繁的CPU-NPU同步。

  • 最终实现单步训练从48秒降至2秒,综合性能提升24倍。

华为NPU性能调优:在910上把UNIAD从48秒优化到2秒精华内容

性能优化如同剥洋葱,每解决一个瓶颈,下一个问题才浮出水面。这次在昇腾910上的UNIAD模型调优,正是一场层层深入的攻坚战,从底层算子到上层代码,步步为营。

首战:算子瓶颈

最初的单步训练耗时长达48秒,远超预期。通过Ascend PyTorch Profiler工具分析,发现名为`unique_dim`的算子占据了绝大部分执行时间。深入调查发现,该算子在NPU的AI CPU上运行,且其底层实现采用了复杂度高达O(n²)的排序算法,导致处理6万多行数据时耗时超过54秒。

针对此问题,着手重写了`unique_dim`算子。采用基于归并排序的高效算法,并利用NPU的向量计算单元进行加速。新算子测试结果令人振奋:单算子耗时从54秒骤降至0.019秒,性能提升超过3200倍。这一关键优化使模型整体单步耗时从48秒降至3.8秒,提升了13倍,为后续优化奠定了基础。

再战:数据类型

解决了最大的性能瓶颈后,新的问题出现:`aclnnInplaceCopy_Transpose`算子成为新的性能热点。分析发现,当输入数据为`double`(双精度浮点型)时,该算子会调度到AI CPU上执行,而`float`(单精度浮点型)则会运行在AI Core上。

优化方案非常直接:在代码中将相关`double`类型的张量通过`.float()`方法转换为`float`类型。修改后,通过对比模型输出,确认精度损失在1e-4以下,完全满足要求。此修改使模型单步耗时从3.8秒优化到3.2秒,提升了15%。随后在多处类似场景应用此方法,耗时进一步降至2.8秒,再次提升12.5%。

决战:同步开销

尽管性能已大幅提升,但距离目标仍有差距。性能时序图上出现了大量规律性的NPU空闲(free)区域,占比高达67%,这显然是巨大的优化空间。放大查看,这些空闲时间由大量的内存拷贝操作引发。

问题根源定位到代码中一个循环内的频繁`.item()`调用。该调用每次都会触发一次CPU-NPU之间的数据同步和内存拷贝,而在NPU上单次拷贝耗时约350微秒。一个训练步骤中累计调用2416次,造成了大量等待。

优化思路是改为批量处理:一次性将所需数据从NPU搬到CPU,在CPU上完成所有计算后,再将结果传回NPU。这一改动立竿见影,单步训练耗时从2.8秒降至2.1秒,性能提升34%,时序图上的空闲区块也随之消失。

这次优化成功将UNIAD模型在昇腾910上的训练效率提升了24倍。这不仅是一次针对特定模型的成功调优,更揭示了NPU性能调优的通用方法论:善用Profiling工具深究瓶颈、关注底层算子实现、留意数据类型对执行路径的影响、并极力减少不必要的CPU-NPU同步。随着AI硬件的持续发展,如何更高效地释放其潜能,将是一个值得持续探索的课题。

内容由AI生成
0
扫一下,分享更方便,购买更轻松
0评论

当前文章无评论,是时候发表评论了
提示信息

取消
确认
评论举报

最新文章 热门文章