# 大模型获取性能数据方法

MindSpore提供环境变量使能或修改训练脚本两种方式来获取性能数据。

这里推荐直接修改训练脚本，该方法可灵活的适配数据下沉和非数据下沉等训练方式。

**1、环境变量使能获取性能数据：**

在运行网络脚本前，配置Profiler相关配置项。

```
export MS_PROFILER_OPTIONS='{"start": true, "output_path": "/XXX", "memory": false, "hccl": false, "aicore_metrics": 0, "l2_cache": false}'
```

start \(bool，必选\) - 设置为”true”，表示使能Profiler；设置成”false”，表示关闭性能数据收集，默认值：”false”。

output\_path \(str, 可选\) - 表示输出数据的路径（绝对路径）。默认值：”./data”。

memory \(bool，可选\) - 表示是否收集Tensor内存数据。当值为”true”时，收集这些数据。默认值：”false”。

hccl \(bool, 可选\) - 表示是否在多设备训练中收集通信性能数据。当值为”true”时，收集这些数据。在单台设备训练中，该参数的设置无效。默认值：”false”。

aicore\_metrics \(int, 可选\) - 设置AI Core指标类型，默认值：0。

l2\_cache \(bool, 可选\) - 设置是否收集l2缓存数据，默认值：”false”。

**2、修改网络训练脚本使能获取性能数据：**

2.1 对于数据非下沉

如果用户是for循环格式进行模型训练，可参考以下代码获取性能数据

```
profiler = ms.Profiler(start_profile=False)
data_loader = ds.create_dict_iterator()
 
for i, data in enumerate(data_loader):
    train()
    if i==100:
        profiler.start()
    if i==200:
        profiler.stop()
 
profiler.analyse()
```

该代码主要需要包含以下功能：

1. 在模型训练之前初始化profiler；

2. 在for循环中，自定义哪个step启动profiler工具；

3. 在for循环中，自定义哪个step关闭profiler工具；

4. 在for循环结束，调用analyse分析profiler数据。

完整代码参考：数据非下沉获取profiling数据完成代码样例

如果用户是model.train的方式进行模型训练，需要自定义获取性能数据的方法

用户可基于step开启，也可基于epoch开启，主要是需要自定义类，定义开启profiler和关闭profiler及profiler解析的函数。这里简单介绍介于step开启方法。

```
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 = ms.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()
```

2.2 对于数据下沉

只需要在模型训练之前初始化profiler工具；再在模型训练结束之后，调用analyse接口进行性能数据分析即可。

代码参考如下：

```
if __name__ == '__main__':
    ms.set_context(mode=ms.GRAPH_MODE, device_target="Ascend")
 
    # Init Profiler
    # Note that the Profiler should be initialized before model.train
    profiler = ms.Profiler(output_path='./profiler_data')
 
    # Train Model
    net = Net()
    train(net)
 
    # Profiler end
    profiler.analyse()
```

获取性能数据的内容，具体可参考官网profiling。

