昇腾学院 | Atlas性能调优之模型优化

举报
kourei 发表于 2020/06/02 19:58:08 2020/06/02
【摘要】 鉴于广大开发者在模型迁移到Ascend 310处理器过程中遇到诸多模型性能瓶颈,导致应用受限。本文主要内容涉及模型性能分析工具、分析思路、提升模型性能的解决方案,旨在帮助大家更好的利用我司产品,将模型性能调到最优,提高产品竞争力。由于能力及资源有限,文中不妥之处恳请广大读者批评指正及补充。 昇腾310处理器由DVPP、Ctrl CPU、AI CPU、AI Core等组成。AI ...

    鉴于广大开发者在模型迁移到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工具,帮助大家进行模型数据统计,方便分析模型,详细操作步骤请扫码参考:

image.png


在工程中打开profiling,运行工程,得到profiling数据,如下图所示:
image.png

选择Summary,查看Op Statistic,在Op Names中找到你要查看的算子名字,然后记录其Task IDs

image.png

仍然在Summary中,如果我们在AI Core中的AI Core Metrics中的Task列找到对应的id(如图下图所示),则说明该算子运行在了AI core上。




分析算子约束条件


参考《 Atlas应用软件开发指南 》中算子清单章节。找到对应的算子进行分析,看是否超出约束条件,如果超出,可以参考下面算子优化方法进行优化。


算子优化

1、算子融合 

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)耗时。

image.png

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。


    总结一下,基于昇腾310处理器的特点,要提升算法的性能,就要尽量提升Cube的使用效率,相应的需减小数据搬移和Vector运算的比例。模型转换的时候请尽量设置AIPP,因为 AIPP(AI Preprocessing)完成的计算,包括图像预处理,包括改变图像尺寸、色域转换(转换图像格式)、减均值/乘系数(改变图像像素)等,是在AI Core上完成的,比在Ctrl CPU上性能更高,能提升整体算法的效率。

其他算子的详细建议可以参考《 Atlas应用软件开发指南 》中高性能编程章节。

更多精彩内容请访问昇腾开发者社区:ascend.huawei.com




【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。