dashboard_and_lineage.md 19.3 KB
Newer Older
T
Ting Wang 已提交
1
# 训练看板和溯源
L
leiyuning 已提交
2 3 4

<!-- TOC -->

T
Ting Wang 已提交
5
- [训练看板和溯源](#训练看板和溯源)
L
leiyuning 已提交
6 7 8
    - [概述](#概述)
    - [操作流程](#操作流程)
    - [准备训练脚本](#准备训练脚本)
T
Ting Wang 已提交
9
        - [Summary数据收集](#summary数据收集)
L
leiyuning 已提交
10
    - [可视化组件](#可视化组件)
11 12 13 14 15 16 17 18 19
        - [训练看板](#训练看板)
            - [标量可视化](#标量可视化)
            - [参数分布图可视化](#参数分布图可视化)
            - [计算图可视化](#计算图可视化)
            - [数据图可视化](#数据图可视化)
            - [图像可视化](#图像可视化)
        - [模型溯源](#模型溯源)
        - [数据溯源](#数据溯源)
        - [对比看板](#对比看板)
W
wenkai 已提交
20
    - [规格](#规格)
L
leiyuning 已提交
21 22 23

<!-- /TOC -->

24 25
<a href="https://gitee.com/mindspore/docs/blob/r0.5/tutorials/source_zh_cn/advanced_use/dashboard_and_lineage.md" target="_blank"><img src="../_static/logo_source.png"></a>&nbsp;&nbsp;
<a href="https://gitee.com/mindspore/docs/tree/r0.5/tutorials/notebook/mindinsight" target="_blank"><img src="../_static/logo_source.png"></a>
26

L
leiyuning 已提交
27 28 29 30 31 32 33 34 35 36 37
## 概述
训练过程中的标量、图像、计算图以及模型超参等信息记录到文件中,通过可视化界面供用户查看。

## 操作流程

- 准备训练脚本,并在训练脚本中指定标量、图像、计算图、模型超参等信息记录到summary日志文件,接着运行训练脚本。
- 启动MindInsight,并通过启动参数指定summary日志文件目录,启动成功后,根据IP和端口访问可视化界面,默认访问地址为 `http://127.0.0.1:8080`
- 在训练过程中,有数据写入summary日志文件时,即可在页面中查看可视的数据。

## 准备训练脚本

W
wangyue01 已提交
38 39
### Summary数据收集

40
当前MindSpore支持将标量、图像、计算图、模型超参等信息保存到summary日志文件中,并通过可视化界面进行展示。
L
leiyuning 已提交
41

42
MindSpore目前支持三种方式将数据记录到summary日志文件中。
L
leiyuning 已提交
43

44
**方式一:通过 `SummaryCollector` 自动收集**
L
leiyuning 已提交
45

46
在MindSpore中通过 `Callback` 机制提供支持快速简易地收集一些常见的信息,包括计算图,损失值,学习率,参数权重等信息的 `Callback`, 叫做 `SummaryCollector`
L
leiyuning 已提交
47

48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69
在编写训练脚本时,仅需要实例化 `SummaryCollector`,并将其应用到 `model.train` 或者 `model.eval` 中,
即可自动收集一些常见信息。`SummaryCollector` 详细的用法可以参考 `API` 文档中 `mindspore.train.callback.SummaryCollector`

样例代码如下:
```python
import mindspore.nn as nn
from mindspore import context
from mindspore import Tensor
from mindspore.train import Model
from mindspore.model_zoo.alexnet import AlexNet
from mindspore.train.callback import SummaryCollector

context.set_context(mode=context.GRAPH_MODE)

network = AlexNet(num_classes=10)
loss = nn.SoftmaxCrossEntropyWithLogits(is_grad=False, sparse=True, reduction="mean")
lr = Tensor(0.1)
opt = nn.Momentum(network.trainable_params(), lr, momentum=0.9)
model = Model(network, loss, opt)
ds_train = create_dataset('./dataset_path')

# Init a SummaryCollector callback instance, and use it in model.train or model.eval
70
summary_collector = SummaryCollector(summary_dir='./summary_dir', collect_freq=1)
71 72

# Note: dataset_sink_mode should be set to False, else you should modify collect freq in SummaryCollector
73
model.train(epoch=1, ds_train, callbacks=[summary_collector], dataset_sink_mode=False)
74 75 76 77 78 79 80 81 82 83 84 85 86 87

ds_eval = create_dataset('./dataset_path')
model.eval(ds_eval, callbacks=[summary_collector])
```

**方式二:结合Summary算子和 `SummaryCollector`,自定义收集网络中的数据**

MindSpore除了提供 `SummaryCollector` 能够自动收集一些常见数据,还提供了Summary算子,支持在网络中自定义收集其他的数据,比如每一个卷积层的输入,或在损失函数中的损失值等。记录方式如下面的步骤所示。

步骤一:在继承 `nn.Cell` 的衍生类的 `construct` 函数中调用Summary算子来采集图像或标量数据或者其他数据。

比如,定义网络时,在网络的 `construct` 中记录图像数据;定义损失函数时,在损失函数的 `construct`中记录损失值。

如果要记录动态学习率,可以定义优化器时,在优化器的 `construct` 中记录学习率。
L
leiyuning 已提交
88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121

样例代码如下:

```python
from mindspore import context, Tensor, nn
from mindspore.common import dtype as mstype
from mindspore.ops import operations as P
from mindspore.ops import functional as F
from mindspore.nn import Optimizer


class CrossEntropyLoss(nn.Cell):
    """Loss function definition."""
    def __init__(self):
        super(CrossEntropyLoss, self).__init__()
        self.cross_entropy = P.SoftmaxCrossEntropyWithLogits()
        self.mean = P.ReduceMean()
        self.one_hot = P.OneHot()
        self.on_value = Tensor(1.0, mstype.float32)
        self.off_value = Tensor(0.0, mstype.float32)

        # Init ScalarSummary
        self.sm_scalar = P.ScalarSummary()

    def construct(self, logits, label):
        label = self.one_hot(label, F.shape(logits)[1], self.on_value, self.off_value)
        loss = self.cross_entropy(logits, label)[0]
        loss = self.mean(loss, (-1,))

        # Record loss
        self.sm_scalar("loss", loss)
        return loss


122 123 124 125 126 127 128 129 130 131 132 133 134 135 136
class MyOptimizer(Optimizer):
    """Optimizer definition."""
    def __init__(self, learning_rate, params, ......):
        ......
        # Initialize ScalarSummary
        self.sm_scalar = P.ScalarSummary()
        self.histogram_summary = P.HistogramSummary()
        self.weight_names = [param.name for param in self.parameters]

    def construct(self, grads):
        ......
        # Record learning rate here
        self.sm_scalar("learning_rate", learning_rate)

        # Record weight
137 138 139
        self.histogram_summary(self.weight_names[0], self.paramters[0])
        # Record gradient
        self.histogram_summary(self.weight_names[0] + ".gradient", grads[0])
140

141 142
        ......

L
leiyuning 已提交
143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159
class Net(nn.Cell):
    """Net definition."""
    def __init__(self):
        super(Net, self).__init__()
        ......

        # Init ImageSummary
        self.sm_image = P.ImageSummary()

    def construct(self, data):
        # Record image by Summary operator
        self.sm_image("image", data)
        ......
        return out

```

160
步骤二:在训练脚本中,实例化 `SummaryCollector`,并将其应用到 `model.train`
L
leiyuning 已提交
161

162
样例代码如下:
L
leiyuning 已提交
163

164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180
```python
from mindspore import Model, nn, context
from mindspore.train.callback import SummaryCollector

context.set_context(mode=context.GRAPH_MODE)
net = Net()
loss_fn = CrossEntropyLoss()
optim = MyOptimizer(learning_rate=0.01, params=network.trainable_params())
model = Model(net, loss_fn=loss_fn, optimizer=optim, metrics=None)

train_ds = create_mindrecord_dataset_for_training()

summary_collector = SummaryCollector(summary_dir='./summary_dir', collect_freq=1)
model.train(epoch=2, train_ds, callbacks=[summary_collector])
```

**方式三:自定义Callback记录数据**
L
leiyuning 已提交
181

182 183
MindSpore支持自定义Callback, 并允许在自定义Callback中将数据记录到summary日志文件中,
并通过可视化页面进行查看。
L
leiyuning 已提交
184

185 186 187
下面的伪代码则展示在CNN网络中,开发者可以利用带有原始标签和预测标签的网络输出,生成混淆矩阵的图片,
然后通过 `SummaryRecord` 模块记录到summary日志文件中。
`SummaryRecord` 详细的用法可以参考 `API` 文档中 `mindspore.train.summary.SummaryRecord`
L
leiyuning 已提交
188 189 190

样例代码如下:

191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221
```
from mindspore.train.callback import Callback
from mindspore.train.summary import SummaryRecord

class ConfusionMatrixCallback(Callback):
    def __init__(self, summary_dir):
        self._summary_dir = summary_dir
    
    def __enter__(self):
        # init you summary record in here, when the train script run, it will be inited before training
        self.summary_record = SummaryRecord(summary_dir)
    
    def __exit__(self, *exc_args):
        # Note: you must close the summary record, it will release the process pool resource
        # else your training script will not exit from training.
        self.summary_record.close()
        return self

    def step_end(self, run_context):
        cb_params = run_context.run_context.original_args()

        # create a confusion matric image, and record it to summary file
        confusion_martrix = create_confusion_matrix(cb_params)        
        self.summary_record.add_value('image', 'confusion_matrix', confusion_matric)
        self.summary_record.record(cb_params.cur_step)

# init you train script
...

confusion_martrix = ConfusionMartrixCallback(summary_dir='./summary_dir')
model.train(cnn_network, callbacks=[confusion_martrix])
L
leiyuning 已提交
222 223
```

224 225 226 227
上面的三种方式,支持记录计算图, 损失值等多种数据。除此以外,MindSpore还支持保存训练中其他阶段的计算图,通过
将训练脚本中 `context.set_context``save_graphs` 选项设置为 `True`, 可以记录其他阶段的计算图,其中包括算子融合后的计算图。 

在保存的文件中,`ms_output_after_hwopt.pb` 即为算子融合后的计算图,可以使用可视化页面对其进行查看。
L
leiyuning 已提交
228

229
> - 目前MindSpore仅支持在Ascend 910 AI处理器上导出算子融合后的计算图。
230 231
> - 在训练中使用Summary算子收集数据时,`HistogramSummary`算子会影响性能,所以请尽量少地使用。

L
leiyuning 已提交
232 233
## 可视化组件

234
### 训练看板
L
leiyuning 已提交
235

236
用户从训练列表中选择指定的训练,进入训练看板。
L
leiyuning 已提交
237

238
#### 标量可视化
L
leiyuning 已提交
239 240 241 242 243

标量可视化用于展示训练过程中,标量的变化趋势情况。

![scalar.png](./images/scalar.png)

244
图1:标量趋势图
L
leiyuning 已提交
245

246
图1展示了神经网络在训练过程中损失值的变化过程。横坐标是训练步骤,纵坐标是损失值。
L
leiyuning 已提交
247 248 249 250 251 252 253 254 255 256 257

图中右上角有几个按钮功能,从左到右功能分别是全屏展示,切换Y轴比例,开启/关闭框选,分步回退和还原图形。

- 全屏展示即全屏展示该标量曲线,再点击一次即可恢复。
- 切换Y轴比例是指可以将Y轴坐标进行对数转换。
- 开启/关闭框选是指可以框选图中部分区域,并放大查看该区域, 可以在已放大的图形上叠加框选。
- 分步回退是指对同一个区域连续框选并放大查看时,可以逐步撤销操作。
- 还原图形是指进行了多次框选后,点击此按钮可以将图还原回原始状态。

![scalar_select.png](./images/scalar_select.png)

258
图2:标量可视化功能区
L
leiyuning 已提交
259

260
图2展示的标量可视化的功能区,提供了根据选择不同标签,水平轴的不同维度和平滑度来查看标量信息的功能。
L
leiyuning 已提交
261 262 263 264 265 266 267 268

- 标签:提供了对所有标签进行多项选择的功能,用户可以通过勾选所需的标签,查看对应的标量信息。
- 水平轴:可以选择“步骤”、“相对时间”、“绝对时间”中的任意一项,来作为标量曲线的水平轴。
- 平滑度:可以通过调整平滑度,对标量曲线进行平滑处理。
- 标量合成:可以选中两条标量曲线进行合成并展示在一个图中,以方便对两条曲线进行对比或者查看合成后的图。

![scalar_compound.png](./images/scalar_compound.png)

269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321
图3:Accuracy和Loss的标量合成图

图3展示Accuracy曲线和Loss曲线的标量合成图。标量合成的功能区与标量可视化的功能区相似。其中与标量可视化功能区不一样的地方,在于标签选择时,标量合成功能最多只能同时选择两个标签,将其曲线合成并展示。

#### 参数分布图可视化

参数分布图用于将用户所指定的张量以直方图的形式进行展示。

![histogram.png](./images/histogram.png)

图4: 直方图展示

图4将用户所记录的张量以直方图的形式进行展示。点击图中右上角,可以将图放大。

![histogram_func.png](./images/histogram_func.png)

图5: 参数分布图功能区

图5展示参数分布图的功能区,包含以下内容:

- 标签选择:提供了对所有标签进行多项选择的功能,用户可以通过勾选所需的标签,查看对应的直方图。
- 纵轴:可以选择`步骤``相对时间``绝对时间`中的任意一项,来作为直方图纵轴显示的数据。
- 视角:可以选择`正视``俯视`中的一种。`正视`是指从正面的角度查看直方图,此时不同步骤之间的数据会覆盖在一起。`俯视`是指偏移以45度角俯视直方图区域,这时可以呈现不同步骤之间数据的差异。

#### 计算图可视化

计算图可视化用于展示计算图的图结构,数据流以及控制流的走向,支持展示summary日志文件与通过`context``save_graphs`参数导出的`pb`文件。

![graph.png](./images/graph.png)

图6:计算图展示区

图6展示了计算图的网络结构。如图中所展示的,在展示区中,选中其中一个算子(图中圈红算子),可以看到该算子有两个输入和一个输出(实线代表算子的数据流走向)。

![graph_sidebar.png](./images/graph_sidebar.png)

图7:计算图功能区

图7展示了计算图可视化的功能区,包含以下内容:

*  文件选择框: 可以选择查看不同文件的计算图。
*  搜索框:可以对节点进行搜索,输入节点名称点击回车,即可展示该节点。
*  缩略图:展示整个网络图结构的缩略图,在查看超大图结构时,方便查看当前浏览的区域。
*  节点信息:展示选中的节点的基本信息,包括节点的名称、属性、输入节点、输出节点等信息。
*  图例:展示的是计算图中各个图标的含义。

#### 数据图可视化

数据图可视化用于展示单次模型训练的数据处理和数据增强信息。

![data_function.png](./images/data_function.png)

图8:数据图功能区
L
leiyuning 已提交
322

323
图8展示的数据图功能区包含以下内容:
L
leiyuning 已提交
324

325 326 327 328 329
*  图例:展示数据溯源图中各个图标的含义。
*  数据处理流水线:展示训练所使用的数据处理流水线,可以选择图中的单个节点查看详细信息。
*  节点信息:展示选中的节点的基本信息,包括使用的数据处理和增强算子的名称、参数等。

#### 图像可视化
L
leiyuning 已提交
330 331 332 333 334

图像可视化用于展示用户所指定的图片。

![image.png](./images/image_vi.png)

335
图9:图像可视化
L
leiyuning 已提交
336

337
图9展示通过滑动图中“步骤”滑条,查看不同步骤的图片。
L
leiyuning 已提交
338 339 340

![image_function.png](./images/image_function.png)

341
图10:图像可视化功能区
L
leiyuning 已提交
342

343
图10展示图像可视化的功能区,提供了选择查看不同标签,不同亮度和不同对比度来查看图片信息。
L
leiyuning 已提交
344 345 346 347 348

- 标签:提供了对所有标签进行多项选择的功能,用户可以通过勾选所需的标签,查看对应的图片信息。
- 亮度调整:可以调整所展示的所有图片亮度。
- 对比度调整:可以调整所展示的所有图片对比度。

349
### 模型溯源
L
leiyuning 已提交
350 351 352 353 354

模型溯源可视化用于展示所有训练的模型参数信息。

![image.png](./images/lineage_label.png)

355
图11:模型参数选择区
L
leiyuning 已提交
356

357
图11展示的模型参数选择区,列举了可供查看的模型参数标签。用户可以通过勾选所需的标签,查看相应的模型参数。
L
leiyuning 已提交
358 359 360

![image.png](./images/lineage_model_chart.png)

361
图12:模型溯源功能区
L
leiyuning 已提交
362

363
图12展示的模型溯源功能区,图像化展示了模型的参数信息。用户可以通过选择列的特定区域,展示区域范围内的模型信息。
L
leiyuning 已提交
364 365 366

![image.png](./images/lineage_model_table.png)

367
图13:模型列表
L
leiyuning 已提交
368

369
图13分组展示所有模型信息,用户可以按指定列进行升序或降序展示模型信息。
L
leiyuning 已提交
370

371
### 数据溯源
L
leiyuning 已提交
372

373
数据溯源可视化用于展示所有训练的数据处理和数据增强信息。
L
leiyuning 已提交
374

375
![data_label.png](./images/data_label.png)
L
leiyuning 已提交
376

377
图14:数据处理和增强算子选择区
L
leiyuning 已提交
378

379
图14展示的数据处理和数据增强算子选择区,列举了可供查看的数据处理和增强算子的名称。用户可以通过勾选所需的标签,查看相应的参数等信息。
L
leiyuning 已提交
380

381
![data_chart.png](./images/data_chart.png)
L
leiyuning 已提交
382

383
图15:数据溯源功能区
L
leiyuning 已提交
384

385
图15展示的数据溯源功能区,图像化展示了数据处理和数据增强使用的参数信息。用户可以通过选择列的特定区域,展示区域范围内的参数信息。
L
leiyuning 已提交
386

387
![data_table.png](./images/data_table.png)
L
leiyuning 已提交
388

389
图16:数据溯源列表
L
leiyuning 已提交
390

391
图16展示所有模型训练的数据处理和数据增强信息。
L
leiyuning 已提交
392

Q
qin_jun_yan 已提交
393 394
> 如果用户筛选模型溯源随后切换到数据溯源页面时,折线图将展示最新一次筛选过的模型溯源列。

395
### 对比看板
L
leiyuning 已提交
396

397
对比看板可视用于多个训练之间的标量曲线对比。
L
leiyuning 已提交
398

399
![multi_scalars.png](./images/multi_scalars.png)
L
leiyuning 已提交
400

401
图17: 标量对比曲线图
L
leiyuning 已提交
402

403
图17展示了多个训练之间的标量曲线对比效果,横坐标是训练步骤,纵坐标是标量值。
404

405
图中右上角有几个按钮功能,从左到右功能分别是全屏展示,切换Y轴比例,开启/关闭框选,分步回退和还原图形。
406

407 408 409 410 411
- 全屏展示即全屏展示该标量曲线,再点击一次即可恢复。
- 切换Y轴比例是指可以将Y轴坐标进行对数转换。
- 开启/关闭框选是指可以框选图中部分区域,并放大查看该区域, 可以在已放大的图形上叠加框选。
- 分步回退是指对同一个区域连续框选并放大查看时,可以逐步撤销操作。
- 还原图形是指进行了多次框选后,点击此按钮可以将图还原回原始状态。
412

413
![multi_scalars_select.png](./images/multi_scalars_select.png)
414

415
图18:对比看板可视功能区
416

417
图18展示的对比看板可视的功能区,提供了根据选择不同训练或标签,水平轴的不同维度和平滑度来进行标量对比的功能。
418

419 420 421 422
- 训练: 提供了对所有训练进行多项选择的功能,用户可以通过勾选或关键字筛选所需的训练。
- 标签:提供了对所有标签进行多项选择的功能,用户可以通过勾选所需的标签,查看对应的标量信息。
- 水平轴:可以选择“步骤”、“相对时间”、“绝对时间”中的任意一项,来作为标量曲线的水平轴。
- 平滑度:可以通过调整平滑度,对标量曲线进行平滑处理。
423

W
wenkai 已提交
424 425 426 427 428 429 430 431 432
## 规格

为了控制列出summary列表的用时,MindInsight最多支持发现999个summary列表条目。

为了控制内存占用,MindInsight对标签(tag)数目和步骤(step)数目进行了限制:
- 每个训练看板的最大标签数量为300个标签。标量标签、图片标签、计算图标签、参数分布图(直方图)标签的数量总和不得超过300个。特别地,每个训练看板最多有10个计算图标签。当实际标签数量超过这一限制时,将依照MindInsight的处理顺序,保留最近处理的300个标签。
- 每个训练看板的每个标量标签最多有1000个步骤的数据。当实际步骤的数目超过这一限制时,将对数据进行随机采样,以满足这一限制。
- 每个训练看板的每个图片标签最多有10个步骤的数据。当实际步骤的数目超过这一限制时,将对数据进行随机采样,以满足这一限制。
- 每个训练看板的每个参数分布图(直方图)标签最多有50个步骤的数据。当实际步骤的数目超过这一限制时,将对数据进行随机采样,以满足这一限制。
W
wangyue01 已提交
433

434 435 436 437
出于性能上的考虑,MindInsight对比看板使用缓存机制加载训练的标量曲线数据,并进行以下限制:
- 对比看板只支持在缓存中的训练进行比较标量曲线对比。
- 缓存最多保留最新(按修改时间排列)的15个训练。
- 用户最多同时对比5个训练的标量曲线。