MindSpore深度学习模型快速调优

 MindInsight 调试调优工具包

注意:如果在你的电脑上想要使用MindInsight光pip install MindInsight是不行的,还要改一个host文件里面的服务端口号改成你电脑的,具体操作流程我忘了,安装教程参考:mindinsight: A visual dashboard for model tuning. (gitee.com)

其他框架比如pytorch可以迁移到minspore通过MindConverter

MindSpore深度学习模型快速调优_第1张图片

MindSpore深度学习模型快速调优_第2张图片

生态迁移工具:

根据TensorFlow pb/ONNX模型文件生成Mindspore模型定义脚本以及权重文件。

用户只需要传入四个参数,命令示例:

MindSpore深度学习模型快速调优_第3张图片

 模型之间前端语言的差异是巨大的,但是计算图都是相似的,所以使用模型迁移,而迁移使用的中间转换方式是ONNX。(奥尼克斯)

MindSpore深度学习模型快速调优_第4张图片

        ONNX定义了开放式模型交互的一种协议,通过ONNX可以统一不同深度学习框架间模型表达,其中有几个关键的概念:

        (1)opset:算子集;graph:存储模型的计算图;

MindSpore深度学习模型快速调优_第5张图片

 用在推理阶段比较多,因为导出ONNX模型时训练阶段算子会丢失(比如,dropout),需要转换后用户手动补回;推荐使用opset11+保存ONNX模型,若ONNX模型版本过低可能导致MindConverter转换失败;MindConverter暂不支持包含控制流节点的模型。

MindSpore精度调试器

MindSpore调试器是为图(Graph)模式训练提供的调试工具,可以用来查看并分析计算图节点的中间结果。具体操作流程:

MindSpore深度学习模型快速调优_第6张图片

        我们上一节不是说过,图模式进行训练过程高效的原因是他的计算图是固定下来的,也就是说用户无法从Python层获取计算图中间节点的结果,使得训练调试变得困难。使用MindSpore调试器就饿可以:

        (1)在MindInsight调试器界面结合计算图,查看图节点的输出结果;

        (2)设置监测点,监测训练异常情况(比如检查张量溢出),在异常发生时追踪错误原因;

         (3) 查看权重参数的变化情况。

MindSpore深度学习模型快速调优_第7张图片

MindSpore深度学习模型快速调优_第8张图片 红色线的那两个端口号要保持一致。

MindSpore深度学习模型快速调优_第9张图片

只能说功能太丰富了。 

案例展示(迁移BERT模型的情感分类任务,loss一直不收敛,通过调试器进行定位问题所在。

MindSpore深度学习模型快速调优_第10张图片

这视频把我都看晕了,有时间我自己试试吧。

性能调优工具Profiler使用

MindSpore深度学习模型快速调优_第11张图片

给我整懵逼了,为啥不能直接在for循环里把结果存到数组里然后画出来,有什么区别吗整这个东西。

MindSpore深度学习模型快速调优_第12张图片

还是有点用的,能分析每个算子耗能分析哈哈哈

训练可视化

这里要说明一下,训练可视化有两种方法,一种是调用下买你的这些Summary来记录数据,最后使用MindInsight画出来

第二种方法就是自己写回调函数Cellback,可以参考这篇文章我觉得讲的非常好华为云Mindspore实现鸢尾花分类作业_岭南香雪的博客-CSDN博客

一般来说回调函数的代码:

from mindspore.train.callback import Callback

# Callback function(在原有基础上添加收集了loss和accuracy随epoch的变化数据)
class StepLossAccInfo(Callback):
    def __init__(self, model, eval_dataset, steps_loss, steps_eval, epoch_loss, epoch_eval):    #通过init函数定义self的变量
        self.model = model
        self.eval_dataset = eval_dataset
        self.steps_loss = steps_loss
        self.steps_eval = steps_eval
        self.epoch_loss = epoch_loss
        self.epoch_eval = epoch_eval
        
    def step_end(self, run_context):
        cb_params = run_context.original_args() #Mindspore获取参数的方法
        cur_epoch = cb_params.cur_epoch_num     #获取当前训练周期epoch
        cur_step = (cur_epoch - 1) * 1 + cb_params.cur_step_num     #计算当前训练步数step
        # 每经过一步(step),添加对应的loss和accuracy
        self.steps_loss["loss_value"].append(str(cb_params.net_outputs))
        self.steps_loss["step"].append(str(cur_step))
        acc = self.model.eval(self.eval_dataset, dataset_sink_mode=False)
        self.steps_eval["step"].append(cur_step)
        self.steps_eval["acc"].append(acc['acc'])
        # 在本代码中,每个epoch包含4个steps,下面这一段的意思即是,每经过4个steps(1个epoch),添加对应的loss和accuracy
        if cur_step % 3 == 0:
            self.epoch_loss["loss_value"].append(str(cb_params.net_outputs))
            self.epoch_loss["epoch"].append(str(cur_epoch))
            acc = self.model.eval(self.eval_dataset, dataset_sink_mode=False)
            self.epoch_eval["epoch"].append(cur_epoch)
            self.epoch_eval["acc"].append(acc['acc'])    

 定义好回调函数后,获得需要保存的参数(训练损失、测试准确率)之后,开始训练步骤,将回调函数带入train方法里面

steps_loss = {"step": [], "loss_value": []}
steps_eval = {"step": [], "acc": []}
epoch_loss = {"epoch": [], "loss_value": []}
epoch_eval = {"epoch": [], "acc": []}
model = ms.train.Model(net, loss, opt, metrics={'acc', 'loss'})
# collect the steps, epoch, loss and accuracy information
step_loss_acc_info = StepLossAccInfo(model, ds_test, steps_loss, steps_eval, epoch_loss, epoch_eval)
model.train(200, ds_train, callbacks=[LossMonitor(per_print_times=ds_train.get_dataset_size()), step_loss_acc_info], dataset_sink_mode=False)
metrics = model.eval(ds_test)
print(metrics)

可视化出来: 

#损失值随训练每一步(step)的变化曲线
steps = steps_loss["step"]
loss_value = steps_loss["loss_value"]
steps = list(map(int, steps))
loss_value = list(map(float, loss_value))
plt.plot(steps, loss_value)
plt.xlabel("Steps")
plt.ylabel("Loss_value")
plt.title("Change chart of model loss value")
plt.show()

#损失值随训练周期数epoch的变化曲线
epoch = epoch_loss["epoch"]
loss_value = epoch_loss["loss_value"]
epoch = list(map(int, epoch))
loss_value = list(map(float, loss_value))
plt.plot(epoch, loss_value)
plt.xlabel("Epochs")
plt.ylabel("Loss_value")
plt.title("Change chart of model loss value")
plt.show()

MindSpore深度学习模型快速调优_第13张图片

MindSpore深度学习模型快速调优_第14张图片

云上调试调优

MindSpore模型快速调优攻略-昇腾社区 (hiascend.com)

按照这个步骤来就差不多,先到自己的个人主页获得个人密钥:

MindSpore深度学习模型快速调优_第15张图片

 搜索OBS,并且创建OPS桶,可以往里面传入一些数据,预训练的模型等等:

MindSpore深度学习模型快速调优_第16张图片

MindSpore深度学习模型快速调优_第17张图片

MindSpore深度学习模型快速调优_第18张图片

MindSpore深度学习模型快速调优_第19张图片 MindSpore IDE插件,通过插件还能访问MindInight

MindSpore深度学习模型快速调优_第20张图片

你可能感兴趣的:(华为ICT昇腾AI赛道学习知识,深度学习,人工智能)