mindspore.Profiler

class mindspore.Profiler(**kwargs)[源代码]

MindSpore用户能够通过该类对神经网络的性能进行采集。可以通过导入 mindspore.Profiler 然后初始化Profiler对象以开始分析,使用 Profiler.analyse() 停止收集并分析结果。可通过 MindStudio Insight 工具可视化分析结果。目前,Profiler支持AICORE算子、AICPU算子、HostCPU算子、内存、设备通信、集群等数据的分析。

参数:
  • start_profile (bool, 可选) - 该参数控制是否在Profiler初始化的时候开启数据采集。默认值: True

  • output_path (str, 可选) - 表示输出数据的路径。默认值: "./data"

  • profiler_level (ProfilerLevel, 可选) -(仅限Ascend)表示采集性能数据级别。默认值:ProfilerLevel.Level0

    • ProfilerLevel.Level0:最精简的采集性能数据级别,采集计算类算子的耗时数据和通信类大算子的基础数据。

    • ProfilerLevel.Level1:在Level0的基础上额外采集CANN层中AscendCL数据、AICORE性能数据以及通信类小算子数据。

    • ProfilerLevel.Level2:在Level1的基础上额外采集CANN层中GE和Runtime数据。

  • activities (list, 可选) - 表示需要收集的性能数据类型。默认值: [ProfilerActivity.CPU, ProfilerActivity.NPU]

    • ProfilerActivity.CPU:收集MindSpore框架数据。

    • ProfilerActivity.NPU:收集CANN软件栈和NPU数据。

    • ProfilerActivity.GPU:收集GPU数据。

  • schedule (schedule, 可选) - 设置采集的动作策略,由schedule类定义,需要配合step接口使用,默认值: None

  • on_trace_ready (Callable, 可选) - 设置当性能数据采集完成时,执行的回调函数。默认值: None

  • profile_memory (bool, 可选) -(仅限Ascend)表示是否收集Tensor内存数据。当值为 True 时,收集这些数据。使用此参数时, activities 必须设置为 [ProfilerActivity.CPU, ProfilerActivity.NPU] 。在图编译等级为O2时收集算子内存数据,需要从第一个step开始采集。默认值: False ,此参数目前采集的算子名称不完整。将在后续版本修复,建议使用环境变量 MS_ALLOC_CONF 代替。

  • aicore_metrics (AicoreMetrics, 可选) -(仅限Ascend)收集的AICORE性能数据类型,使用此参数时, activities 必须包含 ProfilerActivity.NPU ,且值必须包含在AicoreMetrics枚举值中,默认值: AicoreMetrics.AiCoreNone ,每种类型包含的数据项如下:

    • AicoreMetrics.AiCoreNone:不收集任何AICORE数据。

    • AicoreMetrics.ArithmeticUtilization:包含mac_fp16/int8_ratio、vec_fp32/fp16/int32_ratio、vec_misc_ratio等。

    • AicoreMetrics.PipeUtilization:包含vec_ratio、mac_ratio、scalar_ratio、mte1/mte2/mte3_ratio、icache_miss_rate等。

    • AicoreMetrics.Memory:包含ub_read/write_bw、l1_read/write_bw、l2_read/write_bw、main_mem_read/write_bw等。

    • AicoreMetrics.MemoryL0:包含l0a_read/write_bw、l0b_read/write_bw、l0c_read/write_bw等。

    • AicoreMetrics.ResourceConflictRatio:包含vec_bankgroup/bank/resc_cflt_ratio等。

    • AicoreMetrics.MemoryUB:包含ub_read/write_bw_mte、 ub_read/write_bw_vector、 ub_/write_bw_scalar等。

    • AicoreMetrics.L2Cache:包含write_cache_hit、 write_cache_miss_allocate、 r0_read_cache_hit、 r1_read_cache_hit等。本功能仅支持Atlas A2 训练系列产品。

  • with_stack (bool, 可选) - (Ascend)表示是否收集Python侧的调用栈的数据,此数据在timeline中采用火焰图的形式呈现,使用此参数时, activities 必须包含 ProfilerActivity.CPU 。默认值: False

  • data_simplification (bool, 可选) - (仅限Ascend)是否开启数据精简,开启后将在导出性能数据后删除FRAMEWORK目录数据以及其他多余数据,仅保留profiler的交付件以及PROF_XXX目录下的原始性能数据,以节省空间。默认值: True

  • l2_cache (bool, 可选) -(仅限Ascend)是否收集l2缓存数据,当值为 True 时,收集这些数据。默认值: False

  • hbm_ddr (bool, 可选) -(仅限Ascend)是否收集片上内存/DDR内存读写速率数据,当值为 True 时,收集这些数据。默认值: False

  • pcie (bool, 可选) -(仅限Ascend)是否收集PCIe带宽数据,当值为 True 时,收集这些数据。默认值: False

  • data_process (bool, 可选) -(Ascend/GPU)表示是否收集数据准备性能数据,默认值: False

  • parallel_strategy (bool, 可选) -(仅限Ascend)表示是否收集并行策略性能数据,默认值: False

  • sync_enable (bool, 可选) -(仅限GPU)Profiler是否用同步的方式收集算子耗时,默认值: True

    • True:同步方式,在把算子发送到GPU之前,在CPU端记录开始时间戳。然后在算子执行完毕返回到CPU端后,再记录结束时间戳。算子耗时为两个时间戳的差值。

    • False:异步方式,算子耗时为从CPU发送到GPU的耗时。这种方式能减少因增加Profiler对整体训练时间的影响。

异常:
  • RuntimeError - 当CANN的版本与MindSpore版本不匹配时,生成的ascend_job_id目录结构MindSpore无法解析。

支持平台:

Ascend GPU

样例:

>>> import numpy as np
>>> import mindspore as ms
>>> from mindspore import nn
>>> import mindspore.dataset as ds
>>> from mindspore import Profiler
>>> from mindspore.profiler import ProfilerLevel, ProfilerActivity, AicoreMetrics
>>>
>>> class Net(nn.Cell):
...     def __init__(self):
...         super(Net, self).__init__()
...         self.fc = nn.Dense(2,2)
...     def construct(self, x):
...         return self.fc(x)
>>>
>>> def generator():
...     for i in range(2):
...         yield (np.ones([2, 2]).astype(np.float32), np.ones([2]).astype(np.int32))
>>>
>>> def train(net):
...     optimizer = nn.Momentum(net.trainable_params(), 1, 0.9)
...     loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True)
...     data = ds.GeneratorDataset(generator, ["data", "label"])
...     model = ms.train.Model(net, loss, optimizer)
...     model.train(1, data)
>>>
>>> if __name__ == '__main__':
...     # If the device_target is GPU, set the device_target to "GPU"
...     ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend")
...
...     # Init Profiler
...     # Note that the Profiler should be initialized before model.train
...     profiler = Profiler(profiler_level=ProfilerLevel.Level0,
...                         activities=[ProfilerActivity.CPU, ProfilerActivity.NPU],
...                         aicore_metrics=AicoreMetrics.AiCoreNone)
...
...     # Train Model
...     net = Net()
...     train(net)
...
...     # Profiler end
...     profiler.analyse()
add_metadata(key: str, value: str)[源代码]

上报自定义metadata键值对数据。

参数:
  • key (str) - metadata键值对的key。

  • value (str) - metadata键值对的value。

样例:

>>> from mindspore import Profiler
>>> # Profiler init.
>>> profiler = Profiler()
>>> # Call Profiler add_metadata
>>> profiler.add_metadata("test_key", "test_value")
>>> # Profiler end
>>> profiler.analyse()
add_metadata_json(key: str, value: str)[源代码]

上报自定义metadata键值对value为json字符串数据。

参数:
  • key (str) - metadata键值对的key。

  • value (str) - metadata键值对的value,格式为json字符串。

样例:

>>> import json
>>> from mindspore import Profiler
>>> # Profiler init.
>>> profiler = Profiler()
>>> # Call Profiler add_metadata_json
>>> profiler.add_metadata_json("test_key", json.dumps({"key1": 1, "key2": 2}))
>>> # Profiler end, metadata will be saved in profiler_metadata.json
>>> profiler.analyse()
analyse(offline_path=None, pretty=False, step_list=None, mode='sync')[源代码]

收集和分析训练的性能数据,支持在训练中和训练后调用。样例如上所示。

参数:
  • offline_path (Union[str, None], 可选) - 需要使用离线模式进行分析的数据路径。离线模式用于非正常退出场景。对于在线模式,此参数应设置为 None 。默认值: None

  • pretty (bool, 可选) - 对json文件进行格式化处理。此参数默认值为 False,即不进行格式化。

  • step_list (list, 可选) - 只解析指定step的性能数据,指定的step必须是连续的整数。此参数默认值为 None,即进行全解析。

  • mode (str, 可选) - 解析模式,同步解析或异步解析,可选参数为["sync", "async"], 默认值为 "sync"

    • "sync":同步模式解析性能数据,会阻塞当前进程。

    • "async":异步模式,另起一个子进程解析性能数据,不会阻塞当前进程。由于解析进程会额外占用CPU资源,请根据实际资源情况开启该模式。

样例:

>>> from mindspore.train import Callback
>>> from mindspore import Profiler
>>> class StopAtStep(Callback):
...     def __init__(self, start_step=1, stop_step=5):
...         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(step_list=[2,3,4], mode="sync")
classmethod offline_analyse(path: str, pretty=False, step_list=None, data_simplification=True)[源代码]

离线分析训练的性能数据,性能数据采集结束后调用。

参数:
  • path (str) - 需要进行离线分析的profiling数据路径,指定到profiler上层目录。

  • pretty (bool, 可选) - 对json文件进行格式化处理。此参数默认值为 False,即不进行格式化。

  • step_list (list, 可选) - 只解析指定step的性能数据,指定的step必须是连续的整数。此参数默认值为 None,即进行全解析。

  • data_simplification (bool, 可选) - 数据精简开关功能。默认值为 True,即开启数据精简。

样例:

>>> from mindspore import Profiler
>>> Profiler.offline_analyse("./profiling_path")
op_analyse(op_name, device_id=None)[源代码]

获取primitive类型的算子性能数据。

参数:
  • op_name (str 或 list) - 表示要查询的primitive算子类型。

  • device_id (int, 可选) - 设备卡号,表示指定解析哪张卡的算子性能数据。在网络训练或者推理时使用,该参数可选。基于离线数据解析使用该接口时,默认值: 0

异常:
  • TypeError - op_name 参数类型不正确。

  • TypeError - device_id 参数类型不正确。

  • RuntimeError - 在Ascend上使用该接口获取性能数据。

支持平台:

GPU CPU

样例:

>>> from mindspore import Profiler
>>> from mindspore import nn
>>> from mindspore import Model
>>> # Profiler init.
>>> profiler = Profiler()
>>> # Train Model or eval Model, taking LeNet5 as an example.
>>> # Refer to https://gitee.com/mindspore/docs/blob/r2.5.0/docs/mindspore/code/lenet.py
>>> net = LeNet5()
>>> optimizer = nn.Momentum(net.trainable_params(), learning_rate=0.1, momentum=0.9)
>>> loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True)
>>> # Create the dataset taking MNIST as an example.
>>> # Refer to https://gitee.com/mindspore/docs/blob/r2.5.0/docs/mindspore/code/mnist.py
>>> dataloader = create_dataset()
>>> model = Model(net, loss, optimizer)
>>> model.train(5, dataloader, dataset_sink_mode=False)
>>>
>>> # Profiler end
>>> profiler.analyse()
>>>
>>> profiler.op_analyse(op_name=["BiasAdd", "Conv2D"])
start()[源代码]

开启Profiler数据采集。可以按条件开启Profiler。

异常:
  • RuntimeError - Profiler已经开启。

  • RuntimeError - 如果 start_profile 参数未设置或设置为 True

样例:

>>> from mindspore.train import Callback
>>> from mindspore import Profiler
>>> class StopAtStep(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()
step()[源代码]

用于在Ascend设备上,通过schedule和on_trace_ready区分步骤收集和解析性能数据。

异常:
  • RuntimeError - 如果 start_profile 参数未设置或Profiler未开启。

  • RuntimeError - 如果 schedule 参数未设置。

样例:

>>> import numpy as np
>>> import mindspore as ms
>>> import mindspore.dataset as ds
>>> from mindspore import context, nn, Profiler
>>> from mindspore.profiler import schedule, tensor_board_trace_handler
>>>
>>> class Net(nn.Cell):
...     def __init__(self):
...         super(Net, self).__init__()
...         self.fc = nn.Dense(2, 2)
...
...     def construct(self, x):
...         return self.fc(x)
>>>
>>> def generator_net():
...     for _ in range(2):
...         yield np.ones([2, 2]).astype(np.float32), np.ones([2]).astype(np.int32)
>>>
>>> def train(test_net):
...     optimizer = nn.Momentum(test_net.trainable_params(), 1, 0.9)
...     loss = nn.SoftmaxCrossEntropyWithLogits(sparse=True)
...     data = ds.GeneratorDataset(generator_net(), ["data", "label"])
...     model = ms.train.Model(test_net, loss, optimizer)
...     model.train(1, data)
>>>
>>> if __name__ == '__main__':
...     context.set_context(mode=ms.PYNATIVE_MODE, device_target="Ascend")
...
...     net = Net()
...     STEP_NUM = 15
...
...     with Profiler(schedule=schedule(wait=1, warmup=1, active=2, repeat=1, skip_first=2),
...                   on_trace_ready=tensor_board_trace_handler) as prof:
...         for i in range(STEP_NUM):
...             train(net)
...             prof.step()
stop()[源代码]

停止Profiler。可以按条件停止Profiler。

异常:
  • RuntimeError - Profiler没有开启。

样例:

>>> from mindspore.train import Callback
>>> from mindspore import Profiler
>>> class StopAtEpoch(Callback):
...     def __init__(self, start_epoch, stop_epoch):
...         super(StopAtEpoch, self).__init__()
...         self.start_epoch = start_epoch
...         self.stop_epoch = stop_epoch
...         self.profiler = Profiler(start_profile=False)
...
...     def epoch_begin(self, run_context):
...         cb_params = run_context.original_args()
...         epoch_num = cb_params.cur_epoch_num
...         if epoch_num == self.start_epoch:
...             self.profiler.start()
...
...     def epoch_end(self, run_context):
...         cb_params = run_context.original_args()
...         epoch_num = cb_params.cur_epoch_num
...         if epoch_num == self.stop_epoch:
...             self.profiler.stop()
...
...     def end(self, run_context):
...         self.profiler.analyse()