MindSpore模型快速调优攻略笔记分享(上)

举报
Jack20 发表于 2022/12/13 21:55:34 2022/12/13
【摘要】 • 近年来,深度学习技术在语音识别、自然语言处理、计算机视觉、信息检索等任务上取得了突破性进展;• 深度学习模型的复杂度与规模日益扩张,导致模型的调试调优成为了困扰算法工程师的一大难题;• MindSpore是由华为自研的深度学习框架,最佳匹配昇腾Al处理器算力,为数据科学家和算法工程师提供设计友好、运行高效的开发体验;• 在广泛吸纳行业用户诉求后,MindSpore推出Mindlnsigh...

近年来,深度学习技术在语音识别、自然语言处理、计算机视觉、信息检索等任务上取得了突破性进展;

深度学习模型的复杂度与规模日益扩张,导致模型的调试调优成为了困扰算法工程师的一大难题;

MindSpore是由华为自研的深度学习框架,最佳匹配昇腾Al处理器算力,为数据科学家和算法工程师提供设计友好、运行高效的开发体验;

在广泛吸纳行业用户诉求后,MindSpore推出Mindlnsight工具包,涵盖生态迁移、调试调优,以解决用户关键诉求。


1. 调试调优背景介绍

随着深度学习技术的普及,深度学习框架如雨后春笋般涌现...

目标用户:

1.对于从其他框架切换到MindSpore的用户

2.对于期望基于MindSpore做研究开发的用户。


模型训练\推理过程中可能遇到的问题:

代码编写错误,问题难以定位;

模型结构错误;

权重更新错误;·损失函数设计错误;

半精度下计算溢出;Loss scale调整不当;

过拟合、欠拟合;

梯度消失/爆炸;

激活值饱和;

学习率设置不当;

批大小(batch size)、期(Epoch)设置不当;

模型训练/推理慢


MindSpore介绍

关键特性

1.自动并行:动整图切分,感知集群拓扑,实现通信开销最小,融合数据并行与模型并行;

2.二阶优化:利用二阶计算修正梯度更新方向,找到训练梯度最

优下降路径,从而加速训练收敛过程;

3.动静态图结合:统一自动微分引擎支持动静态图,一行代码完

成模式切换,兼顾模型开发和执行效率;

4.全场景部署协同:超轻量技术,模型压缩、自适应模型生成、

loT超轻量运行时,基于异构的混合并行;

5.全栈协同加速:通过多级并行、图算融合等深度图优化,以及

跨层内存复用技术,发挥昇腾极致性能;

6.迁移及调试工具:覆盖生态迁移、精度调优、性能调优全场景、可视化,脚本迁移自动化,降低开发门槛,提高调试效率;

7.Alt科学计算,场景应用创新,拓展MindSpore的边界

8.安全可信,首个企业级Al可信计算框架(TrustedAl)


Mindlnsight介绍

生态迁移、精度调优、性能调优、模型解释


高效迁移,节省迁移人力

精度快速达标加速模型上市

助力框架性能、异构硬件算力发挥

模型结果可解释

2.MindSpore调试调优

生态迁移

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

基于迁移后BERT模型做情感分类下游任务训练,在4000个样本的小训练集上训练10个epoch,模型精度达到91.49%。

节省Pre-training训练时间的同时,下游任务精度也不受影响.

√迁移后脚本正确性

√迁移后权重推理正确性

√迁移后权重微调正确性

生态迁移工具使用示例

mindconverter --model_file bert.onnx --shape 1,128 1,128 1,128 \

--input_nodes input_ids attention_mask token_type_ids \

--output_nodes output_e --output /home/user/output

生态迁移工具技术方案

不同框架间模型定义前端表达差别巨大(相同算子的API\算子功能、模型构建方式差别较大);

对于同一框架。不管前端表达差异如何,最终对应的计算图是相似的。因此提出:基于模型的迁移方案

opset算子集

graph存储模型的计算图

input存储计算图输入节点

output存储计算图输出节点

initializer存储模型权重(张量)

node存储计算图上的计算节点

value_info存储计算图上节点的输出信息


导出ONNX模型时训练阶段算子会丢失。需要转换后用户手动补回;

·推荐使用opset11+保存ONNX模型,若ONNX模型版本过低可能导致MindConverter转换失败;

MindConverter暂不支持包含控制流节点的模型;


PyTorch Bert迁移案例

教程步骤:

1. ONNX模型导出;

2. ONNX模型验证;

3. MindConverter进行模型脚本和权重迁移;

4. MindSpore模型验证;

https://gitee.com/mindspore/mindinsight/blob/master/mindinsight/mindconverter/tutorial/pytorch_bert_migration_tutorial.ipynb



模型精度调优

MindSpore调试器是为图模式训练提供的调试工具,可以用来查看并分析计算图节点的中间结果。

操作流程

以调试器模式启动MindInsight,等待训练连接;

配置相关环境变量,运行训练脚本;

训练连接成功,在MindInsight调试器界面设置监测点;

在MindInsight调试器界面分析训练执行情况。


调试器介绍

MindSpore图模式的训练过程中,用户无法从Python层获取到计算图中间节点的结果,使得训练调试变得很困难。使用MindSpore调试器,用户可以:

MindInsight调试器界面结合计算图,查看图节点的输出结果;·设置监测点,监测训练异常情况(比如检查张量溢出),在异常发生时追踪错误原因;

查看权重等参数的变化情况。


模型精度调优

丰富的训练信息检查能力

检查计算过程溢出

检查权重变化过大

检查张量是否全为0

检查权重变化过小

检查张量溢出

检查未变化权重

检查张量值范围

检查权重溢出

检查过大张量

检查过大权重

检查过小张量

检查过小权重

检查梯度爆炸

检查激活值范围

检查梯度过大

检查梯度消失


推荐监测点,开箱即用

Re-check,不漏过可疑点

调优建议,引导定位思路

张量关系图,查找问题源头


使用调试器功能对训练现场进行检查

配置“检查权重变化过小”监测点,检查权重是否变化过小;

配置“检查未变化权重”监测点,检查权重是否不更新;

配置“检查梯度消失”监测点,定位异常的梯;

配置“检查张量溢出”监测点,定位NAN/INF出现位置;

配置“检查过大张量”监测点,定位出现大值的算子;

配置“检查权重变化过大”、“检查梯度消失”、“检查梯度过大”监测点,定位异常的权重或梯度;


Debugger演示视频

背景:

1.基于迁移后的BERT模型,在mindspore下开发情感分类模型。经过训练发现模型loss不收敛,因此尝试通过调试器定位问题根因;

2.在算法实现层面已经做过排查,损失函数.优化器都没问题;

3.由于BERT模型的正确性已经验证过了,并且在训练过程中只训练下游任务分类器的权重(model.weight, model.bias):;因此,将问题定位思路集中在下游任务分类器的权重更新以及模型训练数据:

a. weightFObias的初始值、weight和bias的梯度、模型的学习率;

b.训练数据错误;


性能调优工具Profiler介绍

Profiler为MindSpore提供了性能调优能力,在算子性能、迭代性能、数据处理性能等方面提供了易用、丰富的调试功能,帮助用户快速定位性能瓶颈点,提升网络性能。

Profiler工具为用户提供的能力可以分成两部分:

MindSpore侧在训练脚本中为用户提供性能数据收集的启动接口和数据分析接口,最终生成性能数据文件;

MindInsight侧为用户提供可视化界面,将通过多个维度展示性能数据以及统计分析结果。

使用方法:

1.训练开始阶段初始化Profiler,开始性能收集;

2.训练结束后使用analyse方法解析性能数据。

注意:

目前Profiler已经支持GPU场景,GPU下的使用方法和Ascend的使用方法一致;

GPU初始化Profiler时只有output_path参数有效;


使用方法:

1.启动MindInsight可视化界面;

mindinsight start --port 9081 --summary-base-dir ./

2通过浏览器访问MindInsight交互式界面:

cyour server ip address> : 9001/

2. 停止MindInsight可视化服务:

mindinsight stop --port 9ee1

注意:

由于安全原因,非本机访问MindInsight服务。需要在

MindInsight启动前,修改MindInsight安装目录下的conf/constant.py中相关配置;


迭代轨迹展示了每个迭代各个阶段的性能信息:包括迭代间隙、前向反向、迭代拖尾以及每个all_reduce的信息。


数据准备阶段性能分析分为两部分:

1. 迭代间隙数据处理分析;

2. .数据处理pipeline分析。

右图展示了迭代间隙阶段执行的操作的流程,其中两个队列是连接三个操作的通道通过分析队列中数据的情况判断出现性能问题的步骤。

训练过程可视

训练看板

计算图可视

参数分布可视

张量可视


生态迁移工具的能力与基本使用;

mindconverter --help

精度调试器的能力与基本使用;

mindinsight start --port{PORT}--enable-debugger True --debugger-port {DEBUGGER_PORT}

性能调试器的能力与基本使用;

训练脚本中添加:profiler = Profiler(),, profiler.analyse(

ONNX模型的基本概念:

- Graph,Node, Value lnfo, Initializer;

【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
  • 点赞
  • 收藏
  • 关注作者

评论(0

0/1000
抱歉,系统识别当前为高风险访问,暂不支持该操作

全部回复

上滑加载中

设置昵称

在此一键设置昵称,即可参与社区互动!

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

*长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。