技术干货 | MindSpore精度调试能力更上一层楼!

不断提升模型精度是算法工程师的重要目标,之前的文章(https://zhuanlan.zhihu.com/p/353715732 )从常见精度问题的角度分析过AI框架如何帮助开发者提升精度调优效率。今天从技术的角度分析下精度调试的挑战和MindSpore的对策,并介绍下1.3版本的两个新功能:图码结合调试和离线调试

挑战与对策

技术上看,深度学习的精度调试过程,主要面临以下挑战:

1. 训练过程数据量大,需要对GB甚至TB量级的数据进行分析。例如,BERT-Large模型单迭代的过程数据可能达到100GB,不可能手工对全量数据进行分析。

2. 模型训练黑盒,网络内部异常难以观察检测。一方面,训练中只有loss等少量数值会定期打印,限制了算法工程师的观察范围;另一方面,训练过程数据量太大,人工print的方式难以观察这些数据。

3. 一种异常现象存在多个可能的原因,只能基于经验寻找问题原因。以loss不收敛为例,任何可能导致激活值饱和、梯度消失、权重更新不正确的问题都可能导致loss不收敛。例如错误地冻结了部分权重,使用的激活函数和数据不匹配(使用relu激活函数且输入值全部小于0),学习率过小等原因都是loss不收敛的可能原因。在这种情况下,算法工程师只能依靠经验寻找问题原因。

4. 图模式下训练找不到异常现象相关的代码,影响问题分析。脚本代码问题是精度问题的重要原因,分析精度问题时能够自动关联代码对算法工程师联系代码逻辑分析问题很有帮助。

5. 资源紧张时难以快速申请到训练加速器对精度问题进行复现和分析。实验室中的训练加速器常常要排队跑任务,云上训练加速器收费不菲,当资源紧张的时候,可能难以申请到用于精度调试的环境。

为了帮助开发者们克服上述挑战MindSpore 1.1发布了用于静态图模式的图形化精度调试器(下面简称“MindSpore调试器”或“调试器”)。

针对挑战1,2,调试器支持对模型训练中产生的大量数据进行处理,提供了丰富的检测规则,允许开发者从激活值、梯度、权重等角度对网络内部异常进行检测,支持计算图和张量数据的关联及可视化。

针对挑战3,调试器提供了调优向导功能,列出可能的问题原因来引导算法工程师分析。这些功能为开发者精度调试提供了很好的帮助,相关的介绍可以参考MindSpore官网文档(https://mindspore.cn/mindinsight/docs/zh-CN/master/debugger.html )和之前的文章(AI框架中模型调试调优能力构建思考与实践 https://zhuanlan.zhihu.com/p/382078428)。

MindSpore 1.3 中,我们百尺竿头更进一步,针对代码关联(挑战4)和问题复现(挑战5)两个挑战,推出图码结合调试和离线调试两个功能,进一步提升静态图模式下的精度调试能力。

新特性和重要能力

接下来我们着重介绍1.3版本新发布的功能:图码结合调试和离线调试。

  • 图码结合调试能帮助用户掌握代码和计算图的关系,通过调试器提供的代码信息,用户能够更好地理解计算图背后的代码逻辑,提升精度问题分析效率。

  • 离线调试模式带来了训练回放的功能,在训练结束后,您可以通过离线调试模式对训练过程进行分析,还能对并行训练(单机多卡)中的精度问题进行分析和定位。

图码结合调试:一眼掌握代码和计算图的关系

MindSpore图模式的调试中,如果能方便地找到某行代码所关联的计算图节点,对调试效率将有很大提升。在调试器的帮助下,用户可以方便地查看计算图中算子节点和代码的关联关系,无论是以码搜图,还是以图找码,都能在图形界面下快速完成。

图1 以码搜图

输入想要查找的代码行(例如alexnet.py:52),即可寻找同此行代码关联的计算图节点。

图2 以图找码

在计算图中选中算子节点(例如Conv2d-op108),即可在堆栈信息中查看该算子对应的代码行。

支持离线调试:随时离线回放分析训练过程,节约训练加速器资源

在使用之前的调试器时,要求先启动训练进程,在训练进程运行的过程中对精度问题进行分析。这种在线调试的方式符合直觉,且无需额外存储空间,但是无法进行训练回放,过去的迭代无法再次调试。

考虑到昇腾硬件平台资源比较宝贵,在线调试时间可能受限,我们提供了离线调试的能力。离线调试通过dump功能将调试数据保存到磁盘上,然后就可以在不使用昇腾硬件平台的情况下回看训练过程,分析精度问题。
由于数据在磁盘上,离线调试中还可以随意切换正在调试的迭代,回放训练,免去在线调试错过关键迭代后又要从头运行脚本的烦恼。需要说明的是,神经网络的训练过程数据是比较大的,不建议保存全部迭代的dump数据,一般只需要保存精度问题出现的迭代和前一个迭代的dump数据就能够支撑问题分析。

图3 离线调试中可以随意切换迭代

只要在输入框中输入想要调试的轮次,就能任意在不同轮次间跳转(需提前使用dump功能存储对应轮次的数据)。

支持单机多卡调试:定位并行训练中的精度问题

在离线调试功能的基础上,调试器支持了单机多卡训练的调试。您在MindSpore上调试单机多卡的训练时,只需通过dump功能保存数据到磁盘,就可以使用MindInsight可视化地进行分析。调试器中已经提供的监测点,例如检查梯度消失,检查激活值饱和,检查权重不更新等,都可以继续在此场景下使用。图码结合调试同样支持单机多卡。

图4 通过离线调试器进行单机多卡调试

在下拉菜单中可以切换当前正在调试的逻辑卡。

重要能力

除了上面介绍的新功能,MindSpore调试器的以下能力(之前的版本已发布)也对提升调试体验有较大帮助:

  • 问题检测能力丰富贴近用户认知。MindSpore调试器支持检查激活值范围、检查梯度爆炸、检查权重初始值、检查权重不更新、检查张量值范围、检查张量溢出(+/-Inf,NaN)等规则,算法开发工程师看到名称即可理解规则的作用。

  • 支持对反向图进行检查。静态图模式下,MindSpore调试器的监测点同样适用于反向图中的节点,这对于定位梯度计算过程中的问题有很大帮助。

  • 开箱即用。调试器会自动推荐监测点,帮助用户发现常见精度问题,例如张量全为零、梯度消失、权重更新过大、激活值饱和等。此外,页面上还会展示调优建议和张量关系图,帮助梳理问题定位思路,快速定位问题。

架构设计

在1.3版本发布离线调试器功能后,MindSpore调试器同时支持在线(调试对象为训练进程)和离线(调试对象为已保存的数据)两种调试模式,以统一的架构支持这两种模式对整洁架构和降低工作量非常重要。为了提供图形化的调试器界面,部分调试器架构元素在MindInsight中。调试器架构设计如下:

图5 调试器架构

调试器分为MindInsight和MindSpore两层实现。功能上,MindInsight侧主要负责调试器与用户的交互,包括计算图与节点输出的查看、条件断点的设置、训练的执行/终止等。MindSpore侧主要负责训练信息的获取和分析,包括获取张量数据、执行监测点检查等。架构上,调试器架构统一,通过Online Server和Offline Server分别对接在线调试模式功能和离线调试模式功能。

调试器各模块介绍如下:

1.MindInsight Debugger UI 是Debugger和用户交互的界面,用户可以在UI界面查看训练计算图、查看训练信息、查看计算图节点的shape/dtype/输出结果、设置条件断点、继续执行/终止训练等;

2.Session Manager是调试会话的管理中心,负责精度调试会话的创建、管理和删除。

3.Debugger Session是具体的精度调试会话,负责管理Debugger Cache,Debugger Service等的生命周期。

4.Stream Operator负责处理来自UI的各类操作请求。例如Tensor Operator负责处理来自UI的张量查看请求,WatchPoint Operator负责处理来自UI的监测点增删改查请求。

5.Debugger Service 负责驱动MindSpore中的相关调试器功能。在线调试模式下由Online Server同MindSpore中的Debugger Client交互。离线调试模式下由Offline Server在同一进程中直接调用Debugger Services lib,完成监测点检查和张量读取等功能。

6.Stream Handler 负责处理MindInsight侧Debugger的各类数据,包括张量数据(Tensor Handler)、监测点数据(WatchPoint Handler)等。

7.Debugger Cache 负责在MindInsight侧缓存训练过程中生成的关键数据,包括张量(Tensor Cache)、监测点(WatchPoint Cache)等。这样UI查询时不需要每次均从MindSpore侧获取这些信息,起到加速查询的作用。

8.Debugger Client 负责在MindSpore侧发送消息给MindInsight侧的Online Server,接收并处理返回的消息。

9.Debugger Services Lib 负责提供核心的精度问题检测能力。

10.Tensor Loader 负责加载张量数据到内存中。

在这一架构设计下,在线调试模式和离线调试模式复用了主体代码,保持了功能和界面的统一,已经习惯在线调试模式的用户可以方便地使用离线调试模式,享受离线调试模式带来的训练回放等新功能。

小结

随着MindSpore框架的发展,MindSpore也在为用户提供越来越成熟的调试调优能力,助力算法工程师更快取得满意的性能和精度。本文从精度调试的技术挑战出发,对MindSpore调试器的新特性和架构设计做了一个介绍,欢迎大家体验。

参考资料

1. AI框架如何帮助开发者提升精度调优效率:

https://zhuanlan.zhihu.com/p/353715732

2. AI框架中模型调试调优能力构建思考与实践:

https://zhuanlan.zhihu.com/p/382078428

3. MindSpore调试器教程:

https://mindspore.cn/mindinsight/docs/zh-CN/master/debugger.html

评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值