算子使用建议
总体原则
基于Ascend 310芯片的特点,要提升算法的性能,就要尽量提升Cube的使用效率,相应的需减小数据搬移和Vector运算的比例。总体原则有以下几点。
- 网络结构
- 推荐使用主流的网络拓扑,包括ResNet、MobileNet,性能已做过调优。
- 不推荐使用早期的网络拓扑,包括VGG、AlexNet,网络模型偏大,带宽压力大。
- 矩阵乘法的MKN,尽量取16的倍数。算法上可以考虑适当增加channel个数,而不是分group的方式减少channel数量。
- 增加数据复用率:一个参数的利用次数越多带宽的瓶颈越小,所以算法上可以考虑增加filter的复用次数,比如增加feature map大小,避免过大的stride或dilation。
- Conv算子
- 非量化模式下,Conv的输入和输出通道数建议采用16的整数倍。
- 量化模式下,Conv的输入和输出通道数建议采用32的整数倍。
- 量化模式下,多个Conv算子之间,建议少插入Pooling算子。
- FC(FullConnection)算子
当网络存在FC算子,尽量使用多batch同时推理。
- Concat算子
- 非量化模式下,Concat的输入通道建议采用16的整数倍。
- 量化模式下,Concat的输入通道建议采用32的整数倍。
- Conv融合算子
推荐使用Conv+BatchNorm+Scale+Relu/Relu6的组合,性能已做过调优。
- Norm算子
- 推荐使用BatchNorm算子,使用预训练的Norm参数。
- 不推荐使用需要在线计算Norm参数的算子,比如LRN等。
- 检测算子
建议使用主流的检测网络拓扑,包括FasterRCNN、SSD,性能已做过调优。
部分算子使用技巧
- Conv+(BatchNorm+Scale)+Relu性能较Conv+(BatchNorm+Scale)+Tanh等激活算子好;尽量避免过于复杂的激活函数。
- Concat算子在C维度进行拼接时,输入Tensor的Channel数均为16倍数时,性能较好。
- FC算子在Batch数为16倍数时,性能较好。
- 连续卷积结构性能较好,如果卷积层间反复插入较多Vector算子(如Pooling),则性能较差;这点在INT8模型中较明显。
- 在早期AlexNet、 GoogleNet中使用了LRN作为normalization算子,该算子计算十分复杂,在算法演进过程中也逐渐被替换为BatchNorm等其他算子,在目前ResNet、Inception等主流网络结构中不再使用。针对Ascend310平台,推荐在网络中替换为BatchNorm等算子。