MindSpore Insight

MindInsight为MindSpore提供调优调试能力,可以记录训练过程中的 标量、张量、图像、计算图、模型超参、训练耗时数据,并提供可视化页面供分析。

设计架构

在这里插入图片描述

收集Summary

训练信息收集API:
1.Summary API:结合SummaryCollector,自定义收集网络中数据
2.Python API:训练信息的收集(可以记录graph、train_lineage、eval_lineage等)
3.SummaryCollector:自动收集常用训练信息(计算图、损失值、学习率)

MindSpore提供4个summary算子来收集训练信息:
1.ScalarSummary:记录标量数据
2.ImageSummary:记录图片数据
3.HistogramSummary:记录参数分布图
4.TensorSummary:记录张量数据

使用案例

核心代码:

# Init a SummaryCollector callback instance, and use it in model.train or model.eval
specified = {"collect_metric": True, "histogram_regular": "^conv1.*|^conv2.*", "collect_graph": True,
             "collect_dataset_graph": True}

summary_collector = ms.SummaryCollector(summary_dir="./summary_dir/summary_02", collect_specified_data=specified,
                                        collect_freq=1, keep_default_action=False, collect_tensor_freq=200)

print("============== Starting Training ==============")
model.train(epoch=1, train_dataset=ds_train, callbacks=[time_cb, LossMonitor(), summary_collector],
            dataset_sink_mode=False)

可视化效果:

  1. 标量趋势图
    在这里插入图片描述
    神经网络在训练过程中损失值的变化过程

  2. 参数分布图
    在这里插入图片描述
    将用户指定的张量以直方图的形式展示

  3. 计算图
    在这里插入图片描述
    展示数据流向及每个算子的输入输出

  4. 数据图
    在这里插入图片描述
    展示训练所使用的数据处理流水线,可以选择图中单个节点查看详细信息
    例:tensor_op_nameResize:tensor_op_params{“device_target”: “CPU”, “interpolation”: 0, “size”: [227, 227]}

超参调优

MindInsight提供的mindoptimizer可以根据配置,从训练日志中提取训练记录进行分析,推荐超参,最后自动执行训练脚本(当前仅支持高斯过程调参方法)

案例:若用户的优化目标是Accuracy,优化超参为learning_rate,batch_size和momentum,则应该按照以下示例配置yaml文件

summary_base_dir: /home/summaries
tuner:
    name: gp
target:
    group: metric
    name: Accuracy
    goal: maximize
parameters:
    learning_rate:
        bounds: [0.00001, 0.001]
        type: float
    batch_size:
        choice: [32, 64, 128, 256]
        type: int
    momentum:
        source: user_defined
        choice: [0.8, 0.9]
        type: float

之后在训练脚本中实例化HyperConfig对象,并使用HyperConfig实例的参数变量作为训练脚本中对应的参数的取值,并使用SummaryCollector收集训练信息,包括超参和评估指标值等

from mindinsight.optimizer import HyperConfig
config = HyperConfig()
params = config.params

# Replace batch_size with params.batch_size.
ds_train = create_dataset_cifar10(args.data_path, params.batch_size)
# Replace cfg.learning_rate with params.learning_rate.
lr = Tensor(get_lr_cifar10(0, params.learning_rate, cfg.epoch_size, step_per_epoch))
# Replace cfg.momentum with params.momentum.
opt = nn.Momentum(network.trainable_params(), lr, params.momentum)

# Instantiate SummaryCollector and add it to callback to automatically collect training information.
summary_cb = SummaryCollector(config.summary_dir)
model.train(cfg.epoch_size, ds_train, callbacks=[time_cb, ckpoint_cb, LossMonitor(), summary_cb]

性能调优(以单卡为例)

MindSpore Insight在性能调优页面提供了迭代轨迹标签页。迭代轨迹将训练过程分为迭代间隙、前反向计算和迭代拖尾。
迭代间隙:反映每个迭代开始时等待训练数据的时间;
前反向计算:执行网络中的前向和反向算子;
迭代拖尾:主要包含参数更新等操作;

迭代间隙耗时长

理想情况下,某个迭代开始前向训练时,气所需数据已经在Host侧完成了加载及增强,并发送到了Device侧,反映到迭代间隙耗时在1毫秒内,若迭代时间耗时长,说明该迭代开始前向计算时等待较长时间后训练数据才发送到了Device,说明数据发送过程中可能存在性能问题。

前反向耗时长

算子耗时统计排名标签页,可查看训练过程中算子耗时情况,解决算子耗时长的思路:
1.在不影响精度的前提下,将float32类型修改为float16类型;
2.存在转换算子过多(TransData、Cast类算子)且耗时明显时,如果对精度没有影响,可去掉冗余的Cast、TransData算子;
3.如果某个算子耗时明显不合理,可到MindSpore社区反馈;

迭代拖尾时长:

从实际调优经验来看,在单卡训练场景下该阶段耗时都很短,不会存在性能瓶颈;

准备好训练脚本后,在训练脚本中调用性能调试接口,接着运行训练脚本,代码案例如下:

import numpy as np
from mindspore import nn
from mindspore.train import Model
import mindspore as ms
import mindspore.dataset as ds

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 = Model(net, loss, optimizer)
    model.train(1, data)


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()
Logo

昇腾计算产业是基于昇腾系列(HUAWEI Ascend)处理器和基础软件构建的全栈 AI计算基础设施、行业应用及服务,https://devpress.csdn.net/organization/setting/general/146749包括昇腾系列处理器、系列硬件、CANN、AI计算框架、应用使能、开发工具链、管理运维工具、行业应用及服务等全产业链

更多推荐