AI CPU算子消除
使用背景
因为SIMD原因,NPU上的AICPU算子普遍性能很差,对于该类算子,需要想办法消除,或将其切到CPU上执行。
使用约束
当前都是通过人眼识别,手动修改客户模型代码实现,需要客户配合。
具体案例
案例一:
针对topK算子,如果值为int32/int64类型,则只能在AICPU上执行,但如果为fp32类型,则有ai vector实现。基于用户实际场景,如果可以满足int32/int64fp32转换且不损失精度(值<2^24),则可以通过自定义pass将索引为int32/int64的topK转为cast(int32fp32/int64) + TopK(索引fp32) + cast(fp32int32/int64)去执行。
案例二:
针对部分在NPU上执行的AICPU算子,没有vector实现,同时上层有其他不好切到CPU侧的算子时,需要考虑通过改图,让AICPU算子不依赖其他NPU算子。如下图,Bucketize算子依赖的Gather算子,索引来源于一大块NPU子图,这张子图本身不可能全部切到CPU执行。如果想把Bucketize算子切到CPU,需要分析Bucketize算子实际只直接依赖Gather算子,而Gather算子作为索引类算子,实际上可以针对Gather的Table做Bucketize而不是对Gather的结果做Bucketize(这里需要有table size 不会远大于gather output size的先验结论),如果将Bucketize挪至Gather的table分支上方,则发现squeeze算子实际上和Bucketize无顺序依赖,故可以将Bucketize挪到input上方,在CPU侧执行。

父主题: 性能调优方法