昇腾学院 | Atlas性能调优之模型优化
鉴于广大开发者在模型迁移到Ascend 310处理器过程中遇到诸多模型性能瓶颈,导致应用受限。本文主要内容涉及模型性能分析工具、分析思路、提升模型性能的解决方案,旨在帮助大家更好的利用我司产品,将模型性能调到最优,提高产品竞争力。由于能力及资源有限,文中不妥之处恳请广大读者批评指正及补充。
昇腾310处理器由DVPP、Ctrl CPU、AI CPU、AI Core等组成。AI Core包含Cube、Vector、Scalar和多个buffer/Cache。Cube主要提供矩阵乘的核心算力:卷积、反卷积、全连接、色域转换等;Vector计算单元提供大多数向量运算操作:Pooling, Relu, BatchNorm, Softmax, RPN等;Scalar计算单元来完成小的控制和基础的标量运算,更复杂的标量运算通过集成专门的AI CPU来完成。
模型是由一个个算子组成,当一个模型性能达不到预期的时候,需要对该模型进行分析,具体思路分为三步:第一步先找出低性能算子;第二步分析下该算子性能差的原因;第三步分析算子优化空间。
查找低性能算子
Mind Studio提供Profiling工具,帮助大家进行模型数据统计,方便分析模型,详细操作步骤请扫码参考:
选择Summary,查看Op Statistic,在Op Names中找到你要查看的算子名字,然后记录其Task IDs
仍然在Summary中,如果我们在AI Core中的AI Core Metrics中的Task列找到对应的id(如图下图所示),则说明该算子运行在了AI core上。
分析算子约束条件
算子优化
TBE中常用的算子融合(info级别的日志可以打印出规则)类别可以分为UB融合、L2融合、L1融合。融合一般思路:我们要确定单算子之间有没有融合,能不能融合,怎么去融合,通过分析TBE算子的融合能力从而制定融合策略, TBE算子融合动作的执行我们不需要关注,下面重点分析前两者。
UB融合
UB自动融合是TBE提供的一个能力。FE内置了TBE UB自动融合的规则,当FE在进行图编译的时候,遇到匹配的子图结构,就会进行融合,然后调用TBE进行融合算子的编译生成算子.o。UB 融合就是执行一个task时计算的数据在UB里,不出来,减少数据搬运,但用Netron看到的模型还是分开的,只是在执行时通过变换计算公式,从而减少数据搬运。具体的接口定义可查看DDK安装路径下site-packages/te.egg/te/platform/fusion_manager.py文件中fusion_manager函数的定义。UB融合分为以下4类:
•Conv+elementWise:首节点必须是以卷积开始,最多支持和3个elementWise算子融合,elementWise算子只能是单输入、输出。
•ElementWise+ elementWise:融合首节点可以是单输入或者多输入、单输出,其余算子都是单输入、单输出,最多支持5个elementWise融合
•Reduce+elementWise:reduce算子有且只有一个,最多只支持和4个elementWise做融合,caffe reduce不可融合,TF reduce可以融合。
•Segment+elementWise:和Reduce+elementWise类似。
例如我们利用UB融合中的Conv+elementWise类型,在MirrorPad后面增加一层使输出与输入数据相等的conv2d(如下图所示),从而减少了计算Mul时的两次数据搬运(transdatafornd)耗时。
L2融合
算子之间的数据在L2中进行中转,本质上还是两个独立的算子,它改变的只是算子输入数据和输出数据存放的位置,由之前与DDR交互变成与L2存储空间交互,内部实现。支持L2融合场景有以下两类:
•TBE AI Core算子与TBE AI core算子(reduce算子+segmentWise算子之间的融合);
•TBE AI Core算子与CCE算子。 例如在多batch的场景下,会拆分成多个小的batch来执行task,如ResNet50中的8batch,会将模型中的一块拆成4个2batch来运行。
2 、算子拆分
对于本应该在AI CORE上计算的算子并没有在其上计算。我们可以进行算子拆分。通过重新设计模型参数并通过计算满足算子约束条件,从代码层面直接更改模型结构和参数,重新训练出新的模型。例如卷积的通道数是16的倍数,性能会提高20%。另外,对于部分已经训练好的caffe或者tensorflow模型,可以通过修改图的方式来进行算子拆分。
3 、算子替换
由于硬件条件限制,可以通过算子替换来提升性能,例如:将跑在AI CPU上的算子tf.Pow()替换成tf.mul(),跑在了AI CORE上性能会提高很多。
4 、参数修改
另外,通过修改模型参数,满足特定算子限制条件。例如,caffe平台的interp算子如果将输入和输出的宽高满足整除约束条件(dstw-1)/(srcw-1)、(dsth-1)/(srch-1),性能会提高很多(其中dst*为输出,src*为输入),将输入数据的shape=[1,18,175,175] 变为 [1,18,176,176],输出数据的shape=[1,18,350,350] 变为 [1,18,351,351],整体耗时会从20ms优化为1.6ms。
其他算子的详细建议可以参考《 Atlas应用软件开发指南 》中高性能编程章节。
更多精彩内容请访问昇腾开发者社区:ascend.huawei.com
- 点赞
- 收藏
- 关注作者
评论(0)