共计 7144 个字符,预计需要花费 18 分钟才能阅读完成。
摘要:在模型的开发过程中,精度达不到预期经常让人头疼。为了帮忙用户解决模型调试调优的问题,咱们为 MindSpore 量身定做了可视化调试调优组件:MindInsight。
本文分享自华为云社区《技术干货 | 模型优化精度、速度我全都要!MindSpore 模型精度调优实战(二)》,原文作者:HWCloudAI。
引言:
在模型的开发过程中,精度达不到预期经常让人头疼。为了帮忙用户解决模型调试调优的问题,咱们为 MindSpore 量身定做了可视化调试调优组件:MindInsight。咱们还梳理了针对常见精度问题的调试调优指南,将以“MindSpore 模型精度调优实战”系列文章的模式分享进去,心愿能帮忙用户轻松定位精度问题,疾速优化模型精度。
回顾 MindSpore 模型精度调优实战系列点击跳转链接→技术干货 | 更快定位精度问题!MindSpore 模型精度调优实战(一)。
本文是系列分享的第二篇,将给出 罕用的精度调试调优思路。本系列分享假如您的脚本曾经可能运行并算出 loss 值。如果脚本还不能运行,请先参考相干报错提醒进行批改。
遇到精度问题时,罕用调试调优思路如下:
- 查看代码和超参
- 查看模型构造
- 查看输出数据
- 查看 loss 曲线
- 查看精度是否达到预期
代码是精度问题的重要源头,查看代码重在对脚本和代码做查看,力争在源头发现问题(第 2 节);模型构造体现了 MindSpore 对代码的了解,查看模型构造重在查看 MindSpore 的了解和算法工程师的设计是否统一(第 3 节);有的问题要到动静的训练过程中才会发现,查看输出数据(第 4 节)和 loss 曲线(第 5 节)正是将代码和动静训练景象联合进行查看;查看精度是否达到预期则是对整体精度调优过程从新扫视,并思考调整超参、解释模型、优化算法等调优伎俩(第 6 节)。此外,相熟模型和工具也是很重要的(第 1 节)。上面将别离介绍这些思路。
01 精度调优筹备
1.1 回顾算法设计,全面相熟模型
精度调优前,要先对算法设计做回顾,确保算法设计明确。如果参考论文实现模型,则应回顾论文中的全副设计细节和超参抉择状况;如果参考其它框架脚本实现模型,则应确保有一个惟一的、精度可能达标的标杆脚本;如果是新开发的算法,也应将重要的设计细节和超参抉择明确进去。这些信息是前面查看脚本步骤的重要依据。
精度调优前,还要全面相熟模型。只有相熟了模型,能力精确了解 MindInsight 提供的信息,判断是否存在问题,查找问题源头。因而,花工夫了解模型算法和构造、了解模型中算子的作用和参数的含意、了解模型所用优化器的个性等模型因素是很重要的。入手剖析精度问题细节前,倡议先带着问题加深对这些模型因素的理解。
前,要先对算法设计做回顾,确保算法设计明确。如果参考论文实现模型,则应回顾论文中的全副设计细节和超参抉择状况;如果参考其它框架脚本实现模型,则应确保有一个惟一的、精度可能达标的标杆脚本;如果是新开发的算法,也应将重要的设计细节和超参抉择明确进去。这些信息是前面查看脚本步骤的重要依据。
精度调优前,还要全面相熟模型。只有相熟了模型,能力精确了解 MindInsight 提供的信息,判断是否存在问题,查找问题源头。因而,花工夫了解模型算法和构造、了解模型中算子的作用和参数的含意、了解模型所用优化器的个性等模型因素是很重要的。入手剖析精度问题细节前,倡议先带着问题加深对这些模型因素的理解。
1.2 相熟工具
MindInsight 功能丰富,倡议用户简略浏览 MindInsight 教程(https://www.mindspore.cn/tuto…),理解次要性能。定位精度问题时,倡议使能 summary 训练信息收集性能,在脚本中退出 SummaryCollector,并应用训练看板查看训练过程数据,如下图所示。Summary 性能的使用指南请见(https://www.mindspore.cn/tuto…),训练可视性能的使用指南请见(https://www.mindspore.cn/tuto…)。
当您须要在线调试模型时,请参考此链接使能调试器性能:
https://www.mindspore.cn/tuto…
02 查看代码和超参
代码是精度问题的重要源头,超参问题、模型构造问题、数据问题、算法设计和实现问题会体现在脚本中,对脚本做查看是定位精度问题很有效率的伎俩。查看代码次要依赖代码走读,倡议应用小黄鸭调试法:在代码走读的过程中,急躁地向没有教训的“小黄鸭”解释每一行代码的作用,从而激发灵感,发现代码问题。查看脚本时,要留神查看脚本实现(包含数据处理、模型构造、loss 函数、优化器等实现)同设计是否统一,如果参考了其它脚本,要重点查看脚本实现同其它脚本是否统一,所有不统一的中央都应该有充沛正当的理由,否则就应批改。
查看脚本时,也要关注超参的状况,超参问题次要体现为超参取值不合理,例如
- 学习率设置不合理;
- loss_scale 参数不合理;
- 权重初始化参数不合理等。
MindInsight 能够辅助用户对超参做查看,大多数状况下,SummaryCollector 会自动记录常见超参,您能够通过 MindInsight 的训练参数详情性能(如下图)和溯源剖析性能查看超参。联合 MindInsight 模型溯源剖析模块和脚本中的代码,能够确认超参的取值,辨认显著不合理的超参。如果有标杆脚本,倡议同标杆脚本一一比对超参取值,如果有默认参数值,则默认值也应一并比对,以防止不同框架的参数默认值不同导致精度降落或者训练谬误。
03 查看模型构造
在模型构造方面,常见的问题有:
- 算子应用谬误(应用的算子不适用于指标场景,如应该应用浮点除,谬误地应用了整数除);
- 权重共享谬误(共享了不应共享的权重);
- 权重解冻谬误(解冻了不应解冻的权重);
- 节点连贯谬误(应该连贯到计算图中的 block 未连贯);
- loss 函数谬误;
- 优化器算法谬误(如果自行实现了优化器)等。
倡议通过查看模型代码的形式对模型构造进行查看。此外,MindInsight 也能够辅助用户对模型构造进行查看。大多数状况下,SummaryCollector 会自动记录计算图,通过 MindInsight,用户能够 不便地对计算图进行查看。模型脚本运行后,倡议应用 MindInsight 计算图可视模块查看模型构造,加深对计算图的了解,确认模型构造合乎预期。若有标杆脚本,还能够同标杆脚本对照查看计算图,查看以后脚本和标杆脚本的计算图是否存在重要的差别。
思考到模型构造个别都很简单,冀望在这一步就能发现所有的模型构造问题是不事实的。只有通过可视化的模型构造加深对计算图的了解,发现显著的构造问题即可。前面的步骤中,发现了更明确的精度问题景象后,咱们还会回到这一步从新查看确认。
注 1:MindInsight 反对查看 SummaryCollector 记录的计算图和 MindSpore context 的 save_graphs 参数导出的 pb 文件计算图。请参考咱们教程中的“计算图可视化”局部理解更多信息(https://www.mindspore.cn/tuto…)。
注 2:脚本迁徙工具能够将 PyTorch、TensorFlow 框架下编写的模型转换为 MindSpore 脚本,请拜访教程(https://www.mindspore.cn/tuto…)以理解更多信息。
04 查看输出数据
通过查看输出模型的数据,能够联合脚本判断数据处理流水线和数据集是否存在问题。输出数据的常见问题有:
- 数据缺失值过多;
- 每个类别中的样本数目不平衡;
- 数据中存在异样值;
- 数据标签谬误;
- 训练样本有余;
- 未对数据进行标准化,输出模型的数据不在正确的范畴内;
- finetune 和 pretrain 的数据处理形式不同;
- 训练阶段和推理阶段的数据处理形式不同;
- 数据处理参数不正确等。
MindInsight 能够辅助用户对输出数据、数据处理流水线进行查看。大多数状况下,SummaryCollector 会自动记录输出模型的数据(数据处理后的数据)和数据处理流水线参数。输出模型的数据会展现在“数据抽样”模块,数据处理流水线参数会展现在“数据图”模块和“数据溯源”模块。通过 MindInsight 的数据抽样模块,能够查看输出模型的(数据处理流水线解决后的)数据。若数据显著不合乎预期(例如数据被裁剪的范畴过大,数据旋转的角度过大等),能够判断输出数据呈现了肯定的问题。通过 MindInsight 的数据图和数据溯源模块,能够查看数据处理流水线的数据处理过程和具体参数取值,从而 发现不合理的数据处理办法。
如果有标杆脚本,还能够同标杆脚本对照,查看数据处理流水线输入的数据是否和以后脚本的数据雷同。例如,将数据处理流水线输入的数据保留为 npy 文件,而后应用 numpy.allclose()办法对标杆脚本和以后脚本的数据进行比照。如果发现不同,则数据处理阶段可能存在精度问题。
若数据处理流水线未发现问题,能够手动检查数据集是否存在分类不平衡、标签匹配谬误、缺失值过多、训练样本有余等问题。
05 查看 loss 曲线
很多精度问题会在网络训练过程中发现,常见的问题或景象有:
- 权重初始化不合理(例如初始值为 0,初始值范畴不合理等);
- 权重中存在过大、过小值;
- 权重变动过大;
- 权重解冻不正确;
- 权重共享不正确;
- 激活值饱和或过弱(例如 Sigmoid 的输入靠近 1,Relu 的输入全为 0);
- 梯度爆炸、隐没;
- 训练 epoch 有余;
- 算子计算结果存在 NAN、INF;
- 算子计算过程溢出(计算过程中的溢出不肯定都是无害的)等。
上述这些问题或景象,有的能够通过 loss 体现进去,有的则难以察看。MindInsight 提供了针对性的性能,能够察看上述景象、主动查看问题,帮忙您更快定位问题根因。例如:
- MindInsight 的参数分布图模块能够展现模型权重随训练过程的变化趋势;
- MindInsight 的张量可视模块能够展现张量的具体取值,对不同张量进行比照;
- MindInsight 调试器内置了品种丰盛,功能强大的查看能力,能够查看权重问题(例如权重不更新、权重更新过大、权重值过大 / 过小)、梯度问题(例如梯度隐没、梯度爆炸)、激活值问题(例如激活值饱和或过弱)、张量全为 0、NAN/INF、算子计算过程溢出等问题。
调试器应用教程:
https://www.mindspore.cn/tuto…
大多数状况下,SummaryCollector 会自动记录模型的 loss 曲线,能够通过 MindInsight 的标量可视模块查看。loss 曲线可能反映网络训练的动静趋势,通过观察 loss 曲线,能够 失去模型是否收敛、是否过拟合等信息。
大多数状况下,SummaryCollector 会自动记录模型参数变动状况(默认记录 5 个参数),能够通过 MindInsight 的参数分布图模块查看。如果想要记录更多参数的参数分布图,请参考 SummaryCollector 的 histogram_regular 参数(https://www.mindspore.cn/doc/…),或参考 HistogramSummary 算子(https://www.mindspore.cn/tuto…)。
张量不会被自动记录,如果想要通过 MindInsight 查看张量的具体取值,请应用 TensorSummary 算子(https://www.mindspore.cn/tuto…)。
上面联合 loss 曲线的常见景象介绍应用 MindInsight 进行精度问题定位的思路。
5.1 loss 跑飞
loss 跑飞是指 loss 中呈现了 NAN、+/-INF 或者特地大的值。loss 跑飞个别意味着算法设计或实现存在问题。定位思路如下:
- 回顾脚本、模型构造和数据,
1)查看超参是否有不合理的特地大 / 特地小的取值,
2)查看模型构造是否实现正确,特地是查看 loss 函数是否实现正确,
3)查看输出数据中是否有缺失值、是否有特地大 / 特地小的取值。
- 察看训练看板中的参数分布图,查看参数更新是否有显著的异样。若发现参数更新异样,能够联合调试器定位参数更新异样的起因。3. 应用调试器模块对训练现场进行查看。
1)若 loss 值呈现 NAN、+/-INF,可应用“查看张量溢出”条件增加全局监测点,定位首先呈现 NAN、+/-INF 的算子节点,查看算子的输出数据是否会导致计算异样(例如除零)。若是算子输出数据的问题,则能够针对性地退出小数值 epsilon 防止计算异样。
2)若 loss 值呈现特地大的值,可应用“查看过大张量”条件增加全局监测点,定位首先呈现大值的算子节点,查看算子的输出数据是否会导致计算异样。若输出数据自身存在异样,则能够持续向上追踪产生该输出数据的算子,直到定位出具体起因。
3)若狐疑参数更新、梯度等方面存在异样,可应用“查看权重变动过大”、“查看梯度隐没”、“查看梯度过大”等条件设置监测点,定位到异样的权重或梯度,而后联合张量查看视图,逐层向上对可疑的正向算子、反向算子、优化器算子等进行查看。
5.2 loss 收敛慢
loss 收敛慢是指 loss 震荡、收敛速度慢,通过很长时间能力达到预期值,或者最终也无奈收敛到预期值。相较于 loss 跑飞,loss 收敛慢的数值特色不显著,更难定位。定位思路如下:1. 回顾脚本、模型构造和数据,
1)查看超参是否有不合理的特地大 / 特地小的取值,特地是查看学习率是否设置过小或过大,学习率设置过小会导致收敛速度慢,学习率设置过大会导致 loss 震荡、不降落;
2)查看模型构造是否实现正确,特地是查看 loss 函数、优化器是否实现正确;
3)查看输出数据的范畴是否失常,特地是输出数据的值是否过小
- 察看训练看板中的参数分布图,查看参数更新是否有显著的异样。若发现参数更新异样,能够联合调试器定位参数更新异样的起因。3. 应用调试器模块对训练现场过程查看。
1)可应用“查看权重变动过小”、“查看未变动权重”条件对可训练(未固定)的权重进行监测,查看权重是否变动过小。若发现权重变动过小,可进一步查看学习率取值是否过小、优化器算法是否正确实现、梯度是否隐没,并做针对性的修复。
2)可应用“查看梯度隐没”条件对梯度进行监测,查看是否存在梯度隐没的景象。若发现梯度隐没,可进一步向上查看导致梯度隐没的起因。例如,能够通过“查看激活值范畴”条件查看是否呈现了激活值饱和、Relu 输入为 0 等问题。
5.3 其它 loss 景象
若训练集上 loss 为 0,个别阐明模型呈现了过拟合,请尝试增大训练集大小。
06 查看精度是否达到预期
MindInsight 能够为用户记录每次训练的精度后果。在 model.train 和 model.eval 中应用同一个 SummaryCollector 实例时,会自动记录模型评估(metrics)信息。训练完结后,能够通过 MindInsight 的模型溯源模块查看训练后果精度是否达标。
6.1 查看训练集上的精度
若训练集上模型的 loss 值、metric 值未达到预期,能够参考以下思路进行定位和优化:
- 回顾代码、模型构造、输出数据和 loss 曲线,
1)查看脚本,查看超参是否有不合理的值
2)查看模型构造是否实现正确
3)查看输出数据是否正确
4)查看 loss 曲线的收敛后果和收敛趋势是否存在异样
- 尝试应用 MindInsight 溯源剖析性能优化超参。溯源剖析页面会对超参的重要性进行剖析,用户应优先思考调整重要性高的超参,从散点图中能够察看出超参和优化指标的关系,从而针对性地调整超参取值。
- 尝试应用 MindInsight 调参器优化超参。请留神,调参器通过执行屡次残缺训练的形式进行超参搜寻,耗费的工夫为网络一次训练用时的若干倍,如果网络一次训练耗时较长,则超参搜寻将须要很长的工夫。调参器应用教程:https://www.mindspore.cn/tuto…
- 尝试应用 MindInsight 模型解释性能优化模型和数据集。模型解释性能能够通过显著图可视化展现对分类后果最重要的区域,还能够通过评分体系提醒应该对哪类标签进行优化。
模型解释应用教程:
https://www.mindspore.cn/tuto…
- 尝试优化模型构造 / 算法。
6.2 查看验证集上的精度
若训练集精度和验证集精度都未达到预期,则应首先参考上一节查看训练集精度。若训练集精度已达到预期,然而验证集精度未达到预期,大概率是模型呈现了过拟合,解决思路如下:
- 查看验证集评估脚本的评估逻辑有无谬误。特地是数据处理形式是否与训练集统一,推理算法有误谬误,是否加载了正确的模型 checkpoint。2. 减少数据量。包含减少样本量,进行数据加强和扰动等。3. 正则化。常见的技术如参数范数惩办(例如向指标函数中增加一个正则项),参数共享(强制模型的两个组件共享雷同的参数值),提前停止训练等。4. 适当升高模型的规模。例如缩小卷积层数等。
6.3 查看测试集上的精度
若验证集和测试集精度都未达到预期,则应首先参考上一节查看验证集精度。若验证集精度已达到预期,然而测试集精度未达到预期,思考到测试集的数据是模型从未见过的新数据,起因个别是测试集的数据分布和训练集的数据分布不统一。解决思路如下:
- 查看测试集评估脚本的评估逻辑有误谬误。特地是数据处理形式是否与训练集统一,推理算法有误谬误,是否加载了正确的模型 checkpoint。
- 查看测试集中的数据品质,例如数据的散布范畴是否显著同训练集不同,数据是否存在大量的噪声、缺失值或异样值。
07 小结
因为雷同的景象存在多个可能起因,精度问题的定位十分依赖专家教训。心愿上述定位办法和性能可能起到良好的疏导的作用,帮忙你一直积攒成功经验,成为精度调优巨匠。
点击关注,第一工夫理解华为云陈腐技术~