本教程介绍如何在GPU上使用MindSpore Profiler进行性能调试。
/home/user/code/data
,则summary-base-dir设为/home/user/code
。启动成功后,根据IP和端口访问可视化界面,默认访问地址为 http://127.0.0.1:8080
。普通用户在默认情况下无权访问目标设备上的NVIDIA GPU性能计数器。
如果普通用户需要在训练脚本中使用profiler性能统计能力,则需参考以下网址的说明进行权限配置。
https://developer.nvidia.com/nvidia-development-tools-solutions-err-nvgpuctrperm-cupti
收集神经网络性能数据有两种方式,可以使用以下任意一种方式使能Profiler。
方式一:修改训练脚本
在训练脚本中添加MindSpore Profiler相关接口。
set_context
之后,初始化MindSpore Profiler
对象,Profiler开启收集性能数据。
GPU多卡场景需要在
set_auto_parallel_context
之后初始化Profiler
对象。Profiler支持的参数可以参考: Profiler API。
在训练结束后,调用Profiler.analyse()
停止性能数据收集并生成性能分析结果。
启动命令请参考性能调试使用样例。
GPU场景可自定义callback方式收集性能,但数据准备阶段、数据下沉模式不支持该方式收集性能数据。
示例如下:
import mindspore as ms
class StopAtStep(ms.Callback):
def __init__(self, start_step, stop_step):
super(StopAtStep, self).__init__()
self.start_step = start_step
self.stop_step = stop_step
self.profiler = Profiler(start_profile=False)
def step_begin(self, run_context):
cb_params = run_context.original_args()
step_num = cb_params.cur_step_num
if step_num == self.start_step:
self.profiler.start()
def step_end(self, run_context):
cb_params = run_context.original_args()
step_num = cb_params.cur_step_num
if step_num == self.stop_step:
self.profiler.stop()
def end(self, run_context):
self.profiler.analyse()
以上代码仅供参考,用户可根据所需场景自由实现。
方式二:环境变量使能
在运行网络脚本前,配置Profiler相关配置项。
例如:export MS_PROFILER_OPTIONS='{"start": true, "output_path": "/XXX", "sync_enable": true}'
start
(bool, 必选)- 设置为true,表示使能Profiler;设置成false,表示关闭性能数据收集,默认值:false。output_path
(str, 可选)- 需要设置为绝对路径,不设置则默认在当前路径创建data目录存储性能数据。sync_enable
(bool, 可选)- Profiler是否用同步的方式收集算子耗时。使用此参数时,op_time必须设置成true,默认值:true。timeline_limit
(int, 可选) - 设置限制timeline文件存储上限大小(单位M)。使用此参数时,op_time必须设置成true,默认值:500。data_process
(bool, 可选)- 表示是否收集数据准备性能数据,默认值:true。op_time
(bool, 可选)- 表示是否收集算子性能数据,默认值:true。启动命令请参考MindSpore Insight相关命令。
用户从训练列表中选择指定的训练,点击性能调试,可以查看该次训练的性能数据(目前GPU场景支持算子耗时统计排名、Timeline、迭代轨迹分析以及数据准备性能分析,其他功能敬请期待)。
图1:性能数据总览
图1展示了性能数据总览页面,包含了迭代轨迹(Step Trace)、算子性能、数据准备性能和Timeline等组件的数据总体呈现:
用户可以点击查看详情链接,进入组件页面进行详细分析。
使用算子性能分析组件可以对MindSpore运行过程中的各个算子的执行时间进行统计展示(包括GPU算子、CUDA内核、HOSTCPU算子)。
图2:算子类别统计分析
图2展示了按算子类别进行统计分析的结果,包含以下内容:
图2下半部分展示了算子性能统计表,包含以下内容:
图3:内核信息分析
图3展示了CUDA activity信息统计,包含以下内容:
op_full_name
(所属算子名称)进行部分匹配的搜索。可通过profiler.op_analyse(op_name="xxx")
接口查询指定的CUDA内核算子、HOSTCPU算子的性能数据。查询的性能数据为算子在不同的张量(input_shape
)输入下的算子执行侧(op_side
)、执行次数(op_occurrences
)、算子执行总耗时(op_total_time(us)
)以及算子执行平均耗时(op_avg_time(us)
),其数据格式为JSON数据,可借助JSON解析工具快速查看,接口使用示例如下:
使用方式1:
import mindspore as ms
# Profiler init.
profiler = ms.Profiler()
# Train or eval model.
train_net()
profiler.analyse()
operation_info = profiler.op_analyse('Conv2D')
print(operation_info) # json
使用方式2:
import mindspore as ms
# Profiler init.
profiler = ms.Profiler(output_path="my_profiler_path")
operation_info = profiler.op_analyse(['Conv2D', 'BiasAdd']) # str or list
print(operation_info) # json
说明:
op_occurrences
,op_total_time(us)
,op_avg_time(us)
)数据来源于图3所示内核信息列表的(occurrences(次)
, total_duration(us)
, avg_duration(us/次)
)信息,不同点在于使用算子性能接口获取的CUDA算子性能数据会依据算子的类型(Primitive算子类型)进行数据汇总,并根据算子的输入张量信息进行区分。若需要查看具体算子的信息,可启动MindSpore Insight查看详细的CUDA内核性能数据。op_occurrences
,op_total_time(us)
,op_avg_time(us)
)来源于算子耗时统计排名HOST CPU页面的(op_occurrences(次)
, op_total_time(us)
, op_avg_time(us/次)
)信息,不同点在于使用算子性能接口获取的CPU算子性能数据会依据算子的类型(Primitive算子类型)进行数据汇总,并根据算子的输入张量信息进行区分。若需要查看具体算子的信息,可启动MindSpore Insight查看详细的HOST CPU算子性能数据。op_analyse()
接口,可使用device_id参数指定解析哪张卡的算子性能数据,当接口基于离线数据进行解析时,默认device_id=0
。当训练网络为动态shape网络时,可以综合迭代轨迹模块与算子耗时(按迭代)分析组件,对MindSpore运行过程中的算子性能进行分析。算子耗时(按迭代)分析组件对不同迭代中各类型算子的执行时间进行统计展示(包括GPU算子信息、内核信息、HOSTCPU算子信息),可以快速了解训练各迭代中各类型算子的耗时详情。
图4:算子类别耗时(按迭代)统计
图4展示了算子类别耗时统计分析的结果,包含以下内容:
operator/kernel
切换器切换查看的维度,operator维度展示的数据是GPU各类型算子信息(异构时包括CPU各类型算子的耗时),kernel维度展示的是GPU内核信息。表1:算子耗时(按迭代)统计
表1展示了算子耗时按迭代展开的耗时详情,包含以下内容:
GPU场景下,Timeline分析的使用方法和Ascend场景相同,不同之处是,GPU Timeline展示的是算子信息(包括GPU算子和CPU算子)和CUDA activity的信息。
可参考:使用方法。
GPU场景下,迭代轨迹分析的使用方法和Ascend场景相同。(注意:迭代轨迹暂不支持异构训练场景)
可参考:使用方法。
GPU场景下,数据准备性能分析的使用方法和Ascend场景相同。
可参考:使用方法。
资源利用包括CPU利用率分析。
图4:资源利用总览
图4展示了资源利用总览页面,展示了CPU利用率的情况。通过点击右上角的查看详情
按钮可以查看详细信息。
GPU场景下,CPU利用率分析的使用方法和Ascend场景相同。
可参考:使用方法。
export LD_LIBRARY_PATH=${CUDA_HOME}/extras/CUPTI/lib64:$LD_LIBRARY_PATH
,其中CUDA_HOME需要替换为本地CUDA路径。此处可能存在不合适展示的内容,页面不予展示。您可通过相关编辑功能自查并修改。
如您确认内容无涉及 不当用语 / 纯广告导流 / 暴力 / 低俗色情 / 侵权 / 盗版 / 虚假 / 无价值内容或违法国家有关法律法规的内容,可点击提交进行申诉,我们将尽快为您处理。