性能優(yōu)化問題定界
在通過分析 profiling 文件找出性能瓶頸后,接下來將介紹相關的優(yōu)化方法。算子時長主要由計算時間和調度時間兩部分構成,下面將分別對計算時間長和調度時間長這兩種情況進行探討。

計算時間長的情況分析與優(yōu)化
計算時間長可能由以下三種情況導致:
算子運行于 AI_CPU
- 若底層未對 AI_CORE 提供支持,就必須開發(fā)新的算子;
- 若已有相關支持,計算時間長大概率是由 64 位數據類型所致。此時,可通過在適配層添加 cast 操作來轉換數據類型,使算子能在 AI_CORE 上運行。
算子使用 aclop
大部分 aclop 算子的計算速度慢于 aclnn。在此情況下,可使用 aclnn_scale 和 aclnn_split 環(huán)境變量切換至 aclnn 算子。在大模型場景設置False性能更好,小模型場景設置True性能更好。
# 大模型場景
export FLAGS_npu_scale_aclnn=False
export FLAGS_npu_split_aclnn=False
# 小模型場景
export FLAGS_npu_scale_aclnn=True
export FLAGS_npu_split_aclnn=True
以 Power 算子為例,在未開啟 aclnn_scale 和 aclnn_split 環(huán)境變量時,該算子運行于 aclop 上,整體 Task Wait Time (us) 較長;開啟環(huán)境變量后,算子運行于 aclnn 上,整體等待時間明顯減少。

使用 aclnn 算子
若已使用 aclnn 算子,可考慮提升底層算子的性能以優(yōu)化計算時間。
調度時間長的情況分析與優(yōu)化
調度時間長的問題相對更容易在適配層解決,可能由以下三種情況導致:
算子運行于 CPU
- 若算子未進行適配,需先完成適配工作;
- 當 Paddle API 所需能力超出 NPU 算子的能力范圍,部分功能只能由 CPU 實現時,就需要開發(fā)新的 NPU 算子來提供支持。
算子重復編譯
這是調度時間長最常見的情況,一般可通過切換至 aclnn 算子來解決。
通訊時間長
需檢查在算子適配過程中是否添加了過多不必要的 copy 操作。
適配層性能優(yōu)化手段
以下將簡要闡述在適配層可實施的性能優(yōu)化策略。
算子 CPU 計算耗時優(yōu)化
未注冊算子
對于未注冊而運行在 CPU 上的算子(部分算子因 NPU 不支持或未適配,會回退到 CPU 進行運算),可借助 glog 進行排查,方法如下:
# 設置日志級別
export GLOG_v=3
# 查找回退算子:完成推理后保存日志,在日志中搜索關鍵字 “fallbacking to CPU”,即可找到運行在 CPU 的算子。
已注冊算子
在適配層中,存在極少數原生注冊為在 CPU 上運行的算子。這種情況通常是由于在適配這些算子時,NPU 不支持算子的部分模式,或者隨機算子存在精度問題,致使部分模式只能轉換為 CPU 計算。
可依據該算子前后的算子名稱以及網絡模型結構,定位出這些純 CPU 運行的算子。
解決此類問題的常規(guī)方法,是在適配層將其替換為 NPU 算子。但如果涉及到重要模型缺失算子的部分運行模式,那么就需要算子開發(fā)團隊先開發(fā)出對應的算子,再進行適配。
算子重復編譯耗時優(yōu)化
aclnn 算子不存在重復編譯問題,但部分算子僅有 aclop 實現;部分 NPU 算子在啟動時進行圖編譯屬于正?,F象,但存在個別算子因屬性變化而持續(xù)重復編譯的情況。
切換算子類型
優(yōu)先將重復編譯的 aclop 算子切換為 aclnn 算子。
環(huán)境變量優(yōu)化
若對應的 aclnn 算子存在問題,只能采用 aclop ,可通過以下環(huán)境變量進行優(yōu)化(來不及進行算子開發(fā),開啟以下兩個環(huán)境變量可做為臨時緩解措施):
# 關閉在線編譯,使用二進制算子復用
export FLAGS_npu_jit_compile=0
# 增加緩存區(qū)容量,提高緩存命中率,此處 5000 的單位為 MB
export ASCEND_MAX_OP_CACHE_SIZE=5000
算子適配優(yōu)化與替換
適配本質上是一種映射,適配層 API 對于底層算子的選擇并非固定不變,很多 API 可通過多種算子組合來實現;若某些算子性能欠佳,可考慮替換為等價算子或更改數據類型;大模型相關的算子適配中,引入融合算子可顯著提升性能。
更換底層算子
針對存在性能瓶頸的部分算子,可嘗試在適配層更換為其它等價的底層算子。
調整數據類型
對于運行速度較慢的數據類型(如 64 位數據類型會運行在 AI_CPU 上),若實際運算無高精度需求,可通過 CAST 操作轉換成 32 位數據類型以提高運行速度。
采用融合算子
部分算子可合并為融合算子,從而大幅提升性能。