mindspore.Profiler
- class mindspore.Profiler(**kwargs)[源代码]
MindSpore用户能够通过该类对神经网络的性能进行采集。可以通过导入 mindspore.Profiler 然后初始化Profiler对象以开始分析,使用 Profiler.analyse() 停止收集并分析结果。可通过 MindSpore Insight 工具可视化分析结果。目前,Profiler支持AICORE算子、AICPU算子、HostCPU算子、内存、设备通信、集群等数据的分析。
- 参数:
output_path (str, 可选) - 表示输出数据的路径。默认值:
"./data"
。op_time (bool, 可选) -(Ascend/GPU)表示是否收集算子性能数据,默认值:
True
。profile_communication (bool, 可选) -(仅限Ascend)表示是否在多设备训练中收集通信性能数据。当值为
True
时,收集这些数据。在单台设备训练中,该参数的设置无效。使用此参数时, op_time 必须设置成True
。默认值:False
。profile_memory (bool, 可选) -(仅限Ascend)表示是否收集Tensor内存数据。当值为
True
时,收集这些数据。使用此参数时, op_time 必须设置成True
。默认值:False
。parallel_strategy (bool, 可选) -(仅限Ascend)表示是否收集并行策略性能数据, 默认值:
True
。start_profile (bool, 可选) - 该参数控制是否在Profiler初始化的时候开启数据采集。默认值:
True
。aicore_metrics (int, 可选) -(仅限Ascend)收集的AICORE性能数据类型,使用此参数时, op_time 必须设置成
True
,且值必须包含在[-1, 0, 1, 2, 3, 4, 5],默认值:0
,每种类型包含的数据项如下:-1: 不收集任何AICORE数据。
0: ArithmeticUtilization,包含mac_fp16/int8_ratio、vec_fp32/fp16/int32_ratio、vec_misc_ratio等。
1: PipeUtilization,包含vec_ratio、mac_ratio、scalar_ratio、mte1/mte2/mte3_ratio、icache_miss_rate等。
2: Memory,包含ub_read/write_bw、l1_read/write_bw、l2_read/write_bw、main_mem_read/write_bw等。
3: MemoryL0,包含l0a_read/write_bw、l0b_read/write_bw、l0c_read/write_bw等。
4: ResourceConflictRatio,包含vec_bankgroup/bank/resc_cflt_ratio等。
5: MemoryUB,包含ub_read/write_bw_mte, ub_read/write_bw_vector, ub_/write_bw_scalar等。
l2_cache (bool, 可选) -(仅限Ascend)是否收集l2缓存数据,当值为
True
时,收集这些数据。默认值:False
。sync_enable (bool, 可选) -(仅限GPU)Profiler是否用同步的方式收集算子耗时,默认值:
True
。True: 同步方式,在把算子发送到GPU之前,在CPU端记录开始时间戳。然后在算子执行完毕返回到CPU端后,再记录结束时间戳。算子耗时为两个时间戳的差值。
False: 异步方式,算子耗时为从CPU发送到GPU的耗时。这种方式能减少因增加Profiler对整体训练时间的影响。
data_process (bool, 可选) -(Ascend/GPU)表示是否收集数据准备性能数据,默认值:
True
。timeline_limit (int, 可选) -(Ascend/GPU)设置限制timeline文件存储上限大小(单位M),使用此参数时, op_time 必须设置成
True
。默认值:500
。profile_framework (str, 可选) -(Ascend/GPU)需要收集的host信息类别,可选参数为[“all”, “time”, “memory”, None],如果设置值不为None,会在指定的profiler目录下生成子目录host_info,存放收集到的Host侧的内存和时间文件。默认值:
"all"
。“all”: 记录host侧时间戳和内存占用情况。
“time”: 只记录host侧时间戳。
“memory”: 只记录host侧内存占用情况。
None: 不记录host信息。
- 异常:
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 >>> >>> 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() ... ... # Train Model ... net = Net() ... train(net) ... ... # Profiler end ... profiler.analyse()
- analyse(offline_path=None, pretty=False)[源代码]
收集和分析训练的性能数据,支持在训练中和训练后调用。样例如上所示。
- 参数:
offline_path (Union[str, None], 可选) - 需要使用离线模式进行分析的数据路径。离线模式用于非正常退出场景。对于在线模式,此参数应设置为
None
。默认值:None
。pretty (bool, 可选) - 对重要json文件进行format。此参数默认值为
False
,即不进行format。
- 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.2/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.2/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 - 停止Minddata采集后,不支持重复开启。
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()
- 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()