更新时间:2021-03-18 GMT+08:00
分享

算子使用建议

总体原则

基于Ascend 310芯片的特点,要提升算法的性能,就要尽量提升Cube的使用效率,相应的需减小数据搬移和Vector运算的比例。总体原则有以下几点。

  1. 网络结构
    • 推荐使用主流的网络拓扑,包括ResNet、MobileNet,性能已做过调优。
    • 不推荐使用早期的网络拓扑,包括VGG、AlexNet,网络模型偏大,带宽压力大。
    • 矩阵乘法的MKN,尽量取16的倍数。算法上可以考虑适当增加channel个数,而不是分group的方式减少channel数量。
    • 增加数据复用率:一个参数的利用次数越多带宽的瓶颈越小,所以算法上可以考虑增加filter的复用次数,比如增加feature map大小,避免过大的stride或dilation。
  2. Conv算子
    • 非量化模式下,Conv的输入和输出通道数建议采用16的整数倍。
    • 量化模式下,Conv的输入和输出通道数建议采用32的整数倍。
    • 量化模式下,多个Conv算子之间,建议少插入Pooling算子。
  3. FC(FullConnection)算子

    当网络存在FC算子,尽量使用多batch同时推理。

  4. Concat算子
    • 非量化模式下,Concat的输入通道建议采用16的整数倍。
    • 量化模式下,Concat的输入通道建议采用32的整数倍。
  5. Conv融合算子

    推荐使用Conv+BatchNorm+Scale+Relu/Relu6的组合,性能已做过调优。

  6. Norm算子
    • 推荐使用BatchNorm算子,使用预训练的Norm参数。
    • 不推荐使用需要在线计算Norm参数的算子,比如LRN等。
  7. 检测算子

    建议使用主流的检测网络拓扑,包括FasterRCNN、SSD,性能已做过调优。

部分算子使用技巧

  1. Conv+(BatchNorm+Scale)+Relu性能较Conv+(BatchNorm+Scale)+Tanh等激活算子好;尽量避免过于复杂的激活函数。
  2. Concat算子在C维度进行拼接时,输入Tensor的Channel数均为16倍数时,性能较好。
  3. FC算子在Batch数为16倍数时,性能较好。
  4. 连续卷积结构性能较好,如果卷积层间反复插入较多Vector算子(如Pooling),则性能较差;这点在INT8模型中较明显。
  5. 在早期AlexNet、 GoogleNet中使用了LRN作为normalization算子,该算子计算十分复杂,在算法演进过程中也逐渐被替换为BatchNorm等其他算子,在目前ResNet、Inception等主流网络结构中不再使用。针对Ascend310平台,推荐在网络中替换为BatchNorm等算子。
分享:

    相关文档

    相关产品