自定义pass
具体案例
案例一:bmm + tile
Bmm算子内部本身有广播逻辑,如果周围有算子实现的正好是广播逻辑,则可以将其消除以提高性能。如下图,删掉Tile算子之后,能得到几个性能提升点:
案例二:同源concat
该场景构图时使用concat实际上与Tile算子实现的相同功能,但是tile算子的搬入数据量,只有concat的1/240, 同时,如果尾轴非对齐,concat算子还会有不少性能损失。

案例三:广播BMM算子
可以观察到原始的BMM,做的是 1,32 300, 32的 matmul计算,在npu硬件单元上,只能利用cube矩阵单元1/16的算子,有很大的算力浪费,这里因为首轴有广播,所以通过将广播轴缩到k轴上,将128 8 次 1,32 300, 32 替换为8 次 128, 32 300, 32的矩阵运算,提高整体的Cube利用率. 这里引入的Reshape算子不在NPU上执行,引入的transpose算子影响比不上计算效率带来的提升,整体而言收益非常明显。

案例四:Tile+Concat
通过交换tile/concat的执行顺序,将读访存量,从1*32*3+128*32*3 降到了 1*32*3+1*96, 下降98.5%, 写访存量从128*32*3+128*96下降到1*96+128*96, 下降50%。

父主题: 性能调优方法
