MindInsight Profiler是系统化的性能分析工具,能够帮助理解、分析、调试MindSpore程序性能。当前,只支持调试运行在Ascend芯片上的程序。
使用MindInsight Profiler,用户可以:
为了收集神经网络的性能数据,需要在训练脚本中添加Profiler接口。
Profiler模块。set context之后,初始化网络和HCCL之前,需要初始化Profiler对象。Profiler.analyse()停止性能数据收集并生成性能分析结果。样例代码如下:
from mindspore.profiler import Profiler
from mindspore import Model, nn, context
def test_profiler():
# Init context env
context.set_context(mode=context.GRAPH_MODE, device_target='Ascend', device_id=int(os.environ["DEVICE_ID"]))
# Init Profiler
profiler = Profiler(output_path='./data', is_detail=True, is_show_op_path=False, subgraph='all')
# Init hyperparameter
epoch = 2
# Init network and Model
net = Net()
loss_fn = CrossEntropyLoss()
optim = MyOptimizer(learning_rate=0.01, params=network.trainable_params())
model = Model(net, loss_fn=loss_fn, optimizer=optim, metrics=None)
# Prepare mindrecord_dataset for training
train_ds = create_mindrecord_dataset_for_training()
# Model Train
model.train(epoch, train_ds)
# Profiler end
profiler.analyse()
其中, Profiler对象的参数配置包括:
训练结束后,可以通过MindInsight UI从多个维度进行性能分析。
用户从训练列表中选择指定的训练,点击性能调试,可以查看该次训练的性能数据。
图1: 性能数据总览
图1展示了性能数据总览页面,包含了迭代轨迹(Step Trace)、算子性能、MindData性能和Timeline等组件的数据总体呈现。各组件展示的数据如下:
用户可以点击“查看详情”链接,进入某个组件页面进行详细分析。MindInsight也会对性能数据进行分析,在左侧的智能小助手中给出性能调试的建议。
使用迭代轨迹分析组件可以快速了解训练各阶段在总时长中的占比情况。迭代轨迹将训练的一个step划分为迭代间隙 (两次step执行的间隔时间)、前向与反向执行、all reduce等几个阶段,
并显示出每个阶段的时长,帮助用户定界出性能瓶颈所在的执行阶段。
图2: 迭代轨迹分析
图2展示了迭代轨迹分析页面。在迭代轨迹详情中,会展示各阶段在训练step中的起止时间,默认显示的是各step的平均值,用户也可以在下拉菜单选择某个step查看该step的迭代轨迹情况。
在页面下方显示了迭代间隙、前后向计算、迭代拖尾时间(前后向计算结束到参数更新完成的时间)随着step的变化曲线等,用户可以据此判断某个阶段是否存在性能优化空间。
迭代轨分析时需要识别前向第一个算子和后向最后一个算子。
前向第一个节点和后向结束的节点由MindSpore自动进行识别,识别方法是:
前向第一个节点默认为get_next之后连接的算子,后向结束的节点默认为最后一次allreduce之前的算子。
Profiler不保证在所有情况下自动识别的结果和用户的预期一致,用户可以根据网络的特点自行调整,调整方法如下:
FP_POINT环境变量指定前向计算开始的算子,如export FP_POINT=fp32_vars/conv2d/BatchNorm。BP_POINT环境变量指定反向计算结束的算子,如export BP_POINT=loss_scale/gradients/AddN_70。使用算子性能分析组件可以对MindSpore运行过程中的各个算子的执行时间进行统计展示。
图3: 算子类别统计分析
图3展示了按算子类别进行统计分析的结果,包含以下内容:
图4: 算子统计分析
图4展示了算子性能统计表,包含以下内容:
使用MindData性能分析组件可以对训练数据准备过程进行性能分析。数据准备过程可以分为三个阶段:数据处理pipeline、数据发送至device以及device侧读取训练数据,MindData性能分析组件会对每个阶段的处理性能进行详细分析,并将分析结果进行展示。
图5: MindData性能分析
图5展示了MindData性能分析页面,包含迭代间隙和数据处理两个TAB页面。
迭代间隙TAB页主要用来分析数据准备三个阶段是否存在性能瓶颈,数据队列图是分析判断的重要依据:
图6: 数据处理pipeline分析
图6展示了数据处理TAB页面,可以对数据处理pipeline做进一步分析。不同的数据算子之间使用队列进行数据交换,队列的长度可以反映出算子处理数据的快慢,进而推断出pipeline中的瓶颈算子所在。
算子队列的平均使用率代表队列中已有数据Size除以队列最大数据Size的平均值,使用率越高说明队列中数据积累越多。算子队列关系展示了数据处理pipeline中的算子以及它们之间的连接情况,点击某个
队列可以在下方查看该队列中数据Size随着时间的变化曲线,以及与数据队列连接的算子信息等。对数据处理pipeline的分析有如下建议:
对于不同的类型的MindData算子,有如下优化建议:
Timeline组件可以展示:
通过分析Timeline,用户可以对训练过程进行细粒度分析:从High Level层面,可以分析流切分方法是否合理、迭代间隙和拖尾时间是否过长等;从Low Level层面,可以分析
算子执行时间等。
用户可以点击总览页面Timeline部分的下载按钮,将Timeline数据文件 (json格式) 保存至本地,再通过工具查看Timeline的详细信息。推荐使用 chrome://tracing 或者 Perfetto 做Timeline展示。
图7: Timeline分析
Timeline主要包含如下几个部分:
可以使用W/A/S/D来放大、缩小地查看timline图信息。
目前Profiler具有以下限制: