MindInsight Profiler是系统化的性能分析工具,能够帮助理解、分析、调试MindSpore程序性能。当前,只支持调试运行在Ascend芯片上的程序。
使用MindInsight Profiler,用户可以:
http://127.0.0.1:8080
。使用Profiler前,用户需要首先安装Ascend芯片的run包,以及与run包匹配的MindSpore和MindInsight版本。MindInsight使用pip install命令安装whl包。
然后,按照如下顺序检查Profiler的使用环境:
Ada服务用来收集profile相关的数据,首先检查系统ada服务是否正常,确认ada服务的启动用户是否与执行训练的用户一致(如root)。 有root权限的用户建议直接使用root登录,否则使用HwHiAiUser(Ada服务的默认启动用户)登录。 Run包刷新或者OS重启后,建议进行检查,如果ada服务启动用户与MindSpore训练时的用户不一致,profiling数据可能无法生成。
如果Ada服务异常或用户不一致,可按照如下步骤配置:
mkdir -p /root/ide_daemon; cp -rf /home/HwHiAiUser/ide_daemon/* /root/ide_daemon
pkill ada; /usr/local/HiAI/driver/tools/ada
vi /var/log/npu/conf/slog/ziplog.conf
Ada进程启动的tips:
为了收集神经网络的性能数据,需要在训练脚本中添加Profiler接口。首先,在set context之后, 初始化网络和HCCL之前,需要初始化Profiler
对象;请一定注意初始化Profiler对象的位置,不然可能无法产生Profiling数据。
然后在训练结束后,调用Profiler.analyse()
停止性能数据收集并生成性能分析结果。请注意,在七月的版本中,Profiler接口移动至MindSpore中;如果使用之前的版本,请使用from mindinsight.profiler import Profiler
样例代码如下:
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从多个维度进行性能分析。
启动命令示例:
mindinsight start --port 9001 --workspace /home/wy/workspace --summary-base-dir ./
参数配置:
注意:需要正确设置summary-base-dir路径,否则mindinsight训练列表中找不到profiler文件.参考设置:用户训练生成的profiler文件存放的绝对路径为/home/user/code/data/profiler,则summary-base-dir设为/home/user/code.
在浏览器中输入 ip:port(如10.110.43.56:9001)即可打开mindinsight页面。可以使用MindInsight stop --port 9001
命令关闭MindInsight。
需要注意的是,如果想非localhost访问UI,需要进行如下操作:
pip show mindinsight
cd /root/wy/lib/python3.7/site-packages/mindinsight
用户从训练列表中选择指定的训练,点击性能调试,可以查看该次训练的性能数据。
图1: 性能数据总览
图1展示了性能数据总览页面,包含了迭代轨迹(Step Trace)、算子性能、MindData性能和Timeline等组件的数据总体呈现。各组件展示的数据如下:
用户可以点击查看详情链接,进入某个组件页面进行详细分析。MindInsight也会对性能数据进行分析,在左侧的智能小助手中给出性能调试的建议。
使用迭代轨迹分析组件可以快速了解训练各阶段在总时长中的占比情况。迭代轨迹将训练的一个step划分为迭代间隙 (两次step执行的间隔时间)、前向与反向执行、all reduce等几个阶段, 并显示出每个阶段的时长,帮助用户定界出性能瓶颈所在的执行阶段。
图2: 迭代轨迹分析
图2展示了迭代轨迹分析页面。在迭代轨迹详情中,会展示各阶段在训练step中的起止时间,默认显示的是各step的平均值,用户也可以在下拉菜单选择某个step查看该step的迭代轨迹情况。 在页面下方显示了迭代间隙、前后向计算、迭代拖尾时间(前后向计算结束到参数更新完成的时间)随着step的变化曲线等,用户可以据此判断某个阶段是否存在性能优化空间。
迭代轨分析时需要识别fp第一个算子和bp最后一个算子。
fp第一个节点和bp结束的节点由mindspore自动进行识别,识别方法是:
fp begin默认为get_next之后连接的算子,bp end默认为最后一次allreduce之前的算子。
这种判断方法对某些特殊网络而言会存在问题,比如EfficientNet,以及单Step包含多张图的网络;用户需要根据网络特点来判断自动打点是否合理。
如果不想使用默认的打点,可以进行手动配置,配置方法为设置FP_POINT和BP_POINT两个环境变量:
用户也可以将某个AllReduce算子名称配置到环境变量,这样可以将其加入到迭代轨迹展示中。
使用算子性能分析组件可以对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图信息
需要注意的是,为了避免Timeline数据过大而导致解析时间过长,MindInsight UI只会展示前20MB的Timeline数据。
profiler_cli --op_type aicore_detail --op_path ./data/profiler --device_id 4
参数说明:
op
或者
op --full_name XXX/XXX/XXX
参数说明:
op --dump_csv ./dump_out
参数说明:
step --step_id 1
参数说明:
prof --job_id JOBXXXXXXXXXXXXXXXXXXXX --device_id 3 --output_path ./data 参数说明:
为了控制性能测试时生成数据的大小,大型网络建议性能调试的step数目限制在10以内。
执行/usr/local/HiAi/driver/tools/ada
指令,抛出错误信息“daemon init failed, exit”
安装mindinsight后,执行mindinsight命令行相关命令,提示找不到mindinsight命令
ln -s /usr/local/python3.7/bin/mindinsight /usr/local/python3/bin/mindinsight
profier.analyse提示” Fail to get profiling job, please check whether profiling job path is exist under path”错误
检查profiling JOB目录有没生成
ls –alrt /var/log/npu/profiling/
如果没有生成,则检查ada服务是否正常
检查job profiling路径下,host_start.log文件是否生成
cd /var/log/npu/profiling/JOBDEAHCGBCECAHBJDJIBCAAAAAAAAAA
ls –l host_start.log
如果没有生成,则检查ada服务是否正常,是否开启了文件压缩功能
检查device id是否匹配
检查训练脚本,环境变量是否设置了”DEVICE_ID” 比如: export DEVICE_ID=”4” 如果没有设置,profiler默认取device 0,可能与实际devcie id不匹配
如果之前没有使用MindInsight Profiler,原有的Profile数据能否集成到MindInsight Profiler中?
可以集成。
场景:直接使用ada工具profile训练,Job目录文件在默认目录下(/var/log/npu/profiling)已经生成。
集成步骤:
ls -l /var/log/npu/profiling |grep JOBHEJDICBADIBHFCCCFJGAAAAAAAAAA
# python
Python 3.7.5 (default, Jan 11 2020, 18:38:06)
[GCC 7.3.0] on linux
Type "help", "copyright", "credits" or "license" for more information.
>>> from mindinsight.profiler.profiling import Profiler
>>> profiler = Profiler(job_id="JOBHEJDICBADIBHFCCCFJGAAAAAAAAAA")
>>> profiler.analyse()
安装mindinsight后,执行mindinsight命令行相关命令,提示找不到mindinsight命令
解决办法:
which mindinsight
命令,查看linux会在哪些路径下查找mindinsight命令ln -s /usr/local/python3.7/bin/mindinsight /usr/local/python3/bin/mindinsight
如果遇到问题,可以发送邮件到wangyue53@huawei.com寻求帮助
此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。