# MindInsight_Profiler_Guide **Repository Path**: chenchao99/MindInsight_Profiler_Guide ## Basic Information - **Project Name**: MindInsight_Profiler_Guide - **Description**: The MindInsight Profiler Guide for Internal Huawei users - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 5 - **Created**: 2020-06-05 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README # MindInsight Profiler介绍与使用说明 MindInsight Profiler是系统化的性能分析工具,能够帮助理解、分析、调试MindSpore程序性能。当前,只支持调试运行在Ascend芯片上的程序。 使用MindInsight Profiler,用户可以: * 方便地在训练脚本中启动、停止Profile功能 * 分析神经网络中算子的执行性能 * 查看训练的迭代轨迹统计信息,快速定位性能瓶颈所在的阶段 * 查看训练timeline,分析stream/task在Ascend芯片上的执行序列和执行时间 ## Profiler的使用准备 使用Profiler前,用户需要首先安装Ascend芯片的run包,以及与run包匹配的MindSpore和MindInsight版本。MindInsight使用pip install命令安装whl包。 然后,按照如下顺序检查Profiler的使用环境: 1. 检查配置Ada服务 Ada服务用来收集profile相关的数据,首先检查系统ada服务是否正常,确认ada服务的启动用户是否与执行训练的用户一致(如root)。 有root权限的用户建议直接使用root登录,否则使用HwHiAiUser(Ada服务的默认启动用户)登录。 Run包刷新或者OS重启后,建议进行检查,如果ada服务启动用户与MindSpore训练时的用户不一致,profiling数据可能无法生成。 如果Ada服务异常或用户不一致,可按照如下步骤配置: - 拷贝证书到root目录 ``` mkdir -p /root/ide_daemon cp -rf /home/HwHiAiUser/ide_daemon/* /root/ide_daemon ``` - 在root用户下重启ada进程 ``` pkill ada /usr/local/HiAI/driver/tools/ada ``` 2. 检查关闭profiling文件的压缩功能,步骤如下: - 打开profiling的压缩配置文件 ``` vi /var/log/npu/conf/slog/ziplog.conf ``` - 查看profiling子项的压缩开关COMPRESS_SWITCH,如果不为0,则修改配置为0 Ada进程启动的tips: - 不要在conda环境下启动 - Ada启动后, 通过ps -ef命令确认启动成功 ## 在MindSpore脚本中加入profiling功能代码 在训练脚本集成profile功能的步骤如下: 1. 引用MindInsight Profiler ``` from mindinsight.profiler.profiling import Profiler ``` 2. 在训练开始前,初始化Profiler对象,并根据需要设置参数 ``` profiler = Profiler(output_path="./data", is_detail=True, is_show_op_path=False, subgraph='All') ``` 参数配置包括: - output_path: 生成的统计数据文件存放路径,默认值为'./data' - is_detail: 除了按照算子类型汇总数据外,是否要统计详细的算子实例信息,默认值为True - is_show_op_path: 算子实例是否显示带graph和scope的全名,设置为True时生效,默认值为False - is_print: 是否将算子性能统计结果打印到console,默认值为True - subgraph: 统计的子图信息,可选项有'All', 'Default', 'Gradients',默认值为'All' - optypes_to_deal: 按算子类型过滤,只统计显示特定类型的算子统计信息,比如Conv2d; 默认值为空,统计所有算子类型数据 - optypes_not_deal: 按照算子类型过滤,不统计显示特定类型的算子统计信息,默认值为 ["Variable"] - job_id_env: 迭代轨迹中存储的job_id信息; 默认值为'None',不配置时会自动生成 3. 训练结束时,调用```Profiler.analyse()``` ```Profiler.analyse()```会收集profiling数据,统计分析profiling结果。 ![profiler_api](docs/profiler_api.png) 训练结束后,可以通过MindInsight CLI和UI从多个维度进行性能分析。 ## 算子性能分析 目前,可以通过两种方法查看算子类型、单算子的性能统计数据: 1. 控制台打印 如果在训练脚本中初始化Profiler对象时,is_print参数设置为True,算子的性能分析数据会打印在控制台中。会分别按照算子类型以及 单个算子进行性能统计数据的排序展示。 2. MindInsight CLI 用户也可以启动CLI,通过CLI命令查看分析性能统计数据。CLI启动命令示例: mindinsight prof --op_path ./data --ge_graph_path ./ --device_id 0 启动参数包括: - output_path: profiling解析数据保存目录,默认值为./data - device_id: 多卡训练时指定解析哪张卡的profiling数据,默认值为0号卡 - ge_graph_path: ge图的保存位置,如果需要查看算子shape、type等信息需要配置; 默认值为当前目录 进入CLI后,算子性能分析命令包括: - op 按照算子的类型,对属于该类型的算子性能数据进行汇总,展示所有算子类型的计算时长、调用次数、时间占比和执行阶段等数据。默认按照计算时长从高到低 对数据进行展示。 ![op_types](docs/op_types.png) - op --opnames op1 --detail 查看某个算子类型的详细信息,展示该算子类型下的所有算子,并按单算子的执行时间排序。 - op --full_name 查看单个算子的详细信息,展示该算子的type、shape等信息 ![op_detail](docs/op_detail.png) - op --dump_csv /home/XXX 将算子信息导出到csv文件,文件路径是/home/XXX ## 迭代轨迹分析 迭代轨迹指的是对训练过程中各个阶段的执行时间进行分段统计,这些阶段包括:迭代间隙、前后向执行、迭代拖尾、all reduce相关时间、参数更新时间等。 通过迭代轨迹分析,用户可以快速定界性能瓶颈所在的执行阶段。 1. 迭代轨迹数据查看(MindInsight UI) 使用MindInsight UI可以清晰地展示迭代轨迹信息,具体步骤如下: - 启动MindInsight UI 启动命令示例: ``` mindinsight start --port 9001 --workspace /home/wy/workspace --summary-base-dir ./ ``` 参数配置: * port: 指定端口号,默认8080,但8080容易和其他服务的端口冲突,建议设置自己的端口号 * workspace: 指定workspace目录,目前主要用于存放MindInsight日志,默认路径:[HOME]/mindinsight * summary-base-dir: 指定summary根目录,目前主要用于保存训练过程可视所需内容,如果要在UI上查看GE图则需配置,默认路径./ ![mindinsight_start](docs/mindinsight_start.png) 在浏览器中输入 ip:port(如10.110.43.56:9001)即可打开mindinsight页面。 **需要注意的是,如果想非localhost访问UI,需要进行如下操作:** * 找到mindinsight包的位置 ```pip show mindinsight``` * cd到Location下的mindinsight目录,如: ```cd /root/wy/lib/python3.7/site-packages/mindinsight``` * 打开conf目录下的contants.py文件,按照下图,修改HOST、ENABLE_CORS和SUPPORT_REQUEST_METHODS: ![mindinsight_remote_start](docs/mindinsight_remote_start.png) - 打开MindInsight UI后,点击Profiling页签,输入profiling数据源信息 在路径中输入profiling解析文件所在的路径; 在卡编号中输入想要解析的卡号,然后点击确定。 - 迭代轨迹分析 UI中会展示迭代轨迹的时间统计信息,默认展示各阶段在所有step的平均执行时间。如果想查看某个具体step的迭代轨迹信息,可以点击“选择step” 找到相对应的step进行查看。在迭代轨迹下方会展示迭代间隙时间和前后向执行时间随着step的变化曲线图。 ![StepTrace](docs/step_trace.png) 2. 迭代轨迹数据查看(MindInsight CLI) 同样可以使用MindInsight CLI来查看迭代轨迹数据。 打开CLI后,输入```step```,可以查看每个step的耗时,包括迭代间隙、前向反向时间、拖尾时间、All Reduce时间、参数更新时间等 ![step_trace_cli](docs/step_trace_cli.png) 输入```step --num n```,可以查看第n个step的耗时(从1开始): ![step_trace_single_cli](docs/step_trace_single_cli.png) 输入```step --average```,可以查看各个step的平均耗时: ![step_trace_average](docs/step_trace_average_cli.png) 3. 自定义打点 迭代轨迹展示需要识别fp第一个算子和bp最后一个算子。 - 如果使用5月20日之后的run包版本,fp第一个节点和bp结束的节点由mindspore自动进行识别,识别方法是: fp begin默认为get_next之后连接的算子,bp end默认为最后一次allreduce之前的算子。 这种判断方法对某些特殊网络而言会存在问题,比如EfficientNet;用户需要根据网络特点来判断自动打点是否合理。 如果不想使用默认的打点,可以进行手动配置,配置方法为设置FP_POINT和BP_POINT两个环境变量: ![FP_BP_POINT](docs/fp_bp_point.png) - 如果使用的是5月20日前的run包版本,则用户需要手动配置FP_POINT和BP_POINT环境变量,才可以使用迭代轨迹功能。 - 用户也可以将某个AllReduce算子名称配置到环境变量,这样可以将其加入到迭代轨迹展示中。 ## Timeline分析 Timeline可以展示: - 算子分配到哪个设备(AICPU、AICore等)进行执行 - 算子在Device上的执行序列和执行时长 通过分析Timeline,用户可以对训练过程进行细粒度分析:从High Level而言,可以分析input pipeline是否是训练瓶颈;从Low Level而言,可以分析 哪个算子执行时间最长等。 使用Timeline功能的具体步骤如下: 1. 启动MindInsight CLI, 启动方法可以参考算子性能分析 2. 输入timeline命令,解析timeline数据,生成对应的json文件 timeline命令的参数如下: - output_path: 指定profile解析结果的位置,默认值为./data目录; - device_id: 制定解析哪张卡的数据,默认值为0号卡 3. 打开第二步指定的output_path,找到生成的json文件,该文件以Device id为前缀 4. 打开chrome浏览器,输入chrome://tracing/,将第三步中的文件拖拽到页面即可展示 ![Timeline](docs/timeline.png) Timeline主要包含如下几个部分: - *Device及其stream list*: 包含device上的stream列表,每个stream由task执行序列组成,一个task是其中的一个小方块,大小代表执行时间长短; - *算子信息*: 选中某个task后,可以显示该task对应算子的信息,包括名称、type等 可以使用W/A/S/D来放大、缩小地查看timline图信息 ## Frequently Asked Questions 1. 执行```/usr/local/HiAi/driver/tools/ada```指令,抛出错误信息“daemon init failed, exit” - 确认当前用户下 ~/ide_daemon的文件夹下证书是否存在,如果没有证书,更换启动用户为安装用户,或者复制证书 - 文件夹权限对IDE-daemon所属用户是否有读写权限,如果没有请增加读写权限 2. 安装mindinsight后,执行mindinsight命令行相关命令,提示找不到mindinsight命令 - 确定mindinsight命令可执行文件的路径,通常在“python安装目录/bin”下面 - 执行which mindinsight命令,查看linux会在哪些路径下查找mindinsight命令 - 如果前两步对应的路径不同时,会导致找不到mindinsight命令,可以在第二步路径下建立mindinsight软连接,连接到实际可执行文件的位置,如 ```ln -s /usr/local/python3.7/bin/mindinsight /usr/local/python3/bin/mindinsight``` 3. 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不匹配 4. 如果之前没有使用MindInsight Profiler,原有的Profile数据能否集成到MindInsight Profiler中? 可以集成。 场景:直接使用ada工具profile训练,Job目录文件默认目录下(/var/log/npu/profiling)以及GE build图等已经生成。 集成步骤: * 检查JOB目录在/var/log/npu/profiling/下存在,如: ``` ls -l /var/log/npu/profiling |grep JOBHEJDICBADIBHFCCCFJGAAAAAAAAAA ``` ![profiling_job_dir](docs/profiling_job_dir.png) * 检查ge build图在当前路径下存在 ```ls -l|grep ge_proto_``` ![ge_graph_file](docs/ge_graph_file.png) * 执行python,进行数据解析 ``` # 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", job_id_env="10086") >>> profiler.analyse() ``` * 生成结果位置和训练脚本中进行集成相同 注:对于2020年4月17日之前版本的MindIndight包,如果需要解析training trace文件,请设置job_id_env参数。后续版本可以不用设置,如果不设置时,会以从training trece文件中解析出来的为准。 5. 安装mindinsight后,执行mindinsight命令行相关命令,提示找不到mindinsight命令 解决办法: * 确定mindinsight命令可执行文件的路径,通常在“python安装目录/bin”下面 * 执行```which mindinsight```命令,查看linux会在哪些路径下查找mindinsight命令 * 如果前两步对应的路径不同时,会导致找不到mindinsight命令,可以在第二步路径下建立mindinsight软连接,连接到实际可执行文件的位置,如 ```ln -s /usr/local/python3.7/bin/mindinsight /usr/local/python3/bin/mindinsight``` # Ask For Help 如果遇到问题,可以发送邮件到wangyue53@huawei.com寻求帮助