MindSpore框架下msMonitor的使用方法¶
简介¶
在MindSpore框架下使用msMonitor组件,用于监测MindSpore模型的训练过程中的性能指标,支持动态profiling自定义for循环方式和callback方式。
功能介绍¶
1. 动态profiling自定义for循环方式¶
-
启动dynolog daemon进程,详细介绍请参见dynolog。
-
使能dynolog环境变量
-
(可选)配置msMonitor日志路径,默认路径为当前目录下的msmonitor_log。
[!NOTE] Note 前3步以及第5步操作请参见 npu-monitor 或 nputrace 使用示例。
-
拉起训练任务,在训练任务中实例化
DynamicProfilerMonitor对象,且在每一次训练后,调用step()方法。示例代码如下:
import numpy as np import mindspore import mindspore.dataset as ds from mindspore import nn from mindspore.profiler import DynamicProfilerMonitor 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 = mindspore.train.Model(test_net, loss, optimizer) model.train(1, data) if __name__ == '__main__': dp = DynamicProfilerMonitor() step_num = 100 # 定义模型 net = Net() for i in range(step_num): # 模型训练 train(net) # 调用step方法实现nputrace或npu-monitor功能 dp.step() -
通过 dyno CLI 使能 nputrace 或 npu-monitor
2. 动态profiling callback方式¶
该使能方式与动态profiling自定义for循环方式一致,唯一区别是将step()方法适配在step_begin、step_end回调函数中。
示例代码如下:
import mindspore
from mindspore.profiler import DynamicProfilerMonitor
class StopAtStep(mindspore.Callback):
def __init__(self, start_step, stop_step):
super(StopAtStep, self).__init__()
self.start_step = start_step
self.stop_step = stop_step
self.dp = DynamicProfilerMonitor()
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.dp.start()
def step_end(self, run_context):
cb_params = run_context.original_args()
step_num = cb_params.cur_step_num
if self.start_step <= step_num < self.stop_step:
self.dp.step() # 调用step方法实现npu trace dump或npu monitor功能
if step_num == self.stop_step:
self.dp.stop()