【CANN文档速递03期】带你解锁「训练网络精度调优」
昇腾开发者迁移好的模型在昇腾AI处理器上执行训练时,可能会存在如下精度问题:
1. loss曲线与参考基准差异不符合预期
2. 验证准确度与参考基准差异不符合预期
这些精度问题往往由于具有以下特征而定位困难:
1. 训练正常结束
2. 日志无任何异常
3. 与参考基准对比时才发现结果不符合预期
我们分析发现,精度问题高概率发生点为:
本期为您梳理了精度问题定位的三板斧流程,带您快速扫除网络精度障碍!
精度调优流程
调优前检查
在精度问题定位前,我们需要对训练脚本进行必要的检查,排除参考基准和模型迁移过程中可能存在的影响网络训练精度的因素。
检查参考基准脚本,排除参考基准问题:
√ 检查参考基准脚本多次训练验证精度一致
√ 检查参考基准脚本正确使能混合精度训练
检查迁移后的脚本,排除模型迁移时可能存在的问题:
√ 检查模型在NPU上正确使能混合精度
√ 检查模型在NPU上正确使能Loss Scale
√ 检查数据集与参考基准一致
√ 检查数据预处理流程与参考基准一致
√ 检查多节点分片方式与参考基准一致
√ 检查训练流程与参考基准一致
√ 检查模型超参与参考基准一致
调优工具介绍
检查完训练脚本后,可借助一键式精度分析工具进行精度问题分析,该工具的主要功能包括:
开发者可以从https://gitee.com/ascend/tools下载precision_tool文件夹,上传到训练工作目录下即可使用:
├── resnet // 训练工作目录
│ ├── imagenet_main.py
│ ├── resnet_model.py
│ ├── resnet_run_loop.py
│ ├── cifar10_main.py
│ ├── ...
│ ├── precision_tool
│ │ ├── cli.py
│ │ ├──...
使用限制:
● 仅配套CANN 5.0.2.alpha005及以上版本
● 当前仅支持TensorFlow 1.15训练场景
后续工具会进行不断增强,欢迎大家持续关注,下面我们来看下现阶段工具提供了哪些精度问题分析能力吧!
浮点异常检测
训练网络执行过程中,可能发生频繁的浮点异常情况,即loss scale值下降次数较多或者直接下降为1,此时需要分析溢出数据,对频繁浮点异常问题定界定位。
步骤 1 修改训练脚本,采集溢出数据
import precision_tool.tf_config as npu_tf_config
config = npu_tf_config.session_dump_config(config, action='overflow')
with tf.Session(config=config) as sess:
sess.run(...)
训练执行完成后,生成溢出数据:
├── precision_tool
│ ├── cli.py
│ ├── ...
├── precision_data
│ ├── overflow
│ │ ├── dump // 生成的溢出数据
步骤 2 将生成的数据目录上传到toolkit安装环境,进行必要的配置(详细可参考文档),启动命令行,进行溢出数据分析
python3 ./precision_tool/cli.py
PrecisionTool > ac
可得到溢出算子信息:
----结束
融合异常检测
训练网络执行过程中,系统根据内置融合规则对网络中算子进行融合,以达到提高网络性能的效果。由于大多数融合是自动识别的,可能存在未考虑到的场景,导致精度问题,因此可以尝试关闭融合规则,定界网络问题是否是由于融合导致。
步骤 1 修改训练脚本,在关闭融合规则的情况下执行训练
import precision_tool.tf_config as npu_tf_config
config = npu_tf_config.session_dump_config(config, action='fusion_off')
with tf.Session(config=config) as sess:
sess.run(...)
步骤 2 在融合规则关闭的情况,如果网络精度有明显提高,表明是融合问题导致
目前暂不支持自动分析定位,后续会逐步支持,请到昇腾开源社区https://gitee.com/ascend提issue求助。
----结束
整网数据比对
排除以上问题后,在训练网络精度仍未达预期时,通过采集训练过程中各算子的运算结果(即Dump数据),然后和业界标准算子(如TensorFlow)运算结果进行数据偏差对比,可快速定位到具体算子的精度问题。
步骤 1 修改原始脚本,在GPU/CPU执行训练,生成标杆dump数据
import precision_tool.tf_config as npu_tf_config
# 等价于tf_debug.DumpingDebugWrapperSession(sess, "precision_data/tf/tf_debug")
sess = npu_tf_config.sess_dump(sess)
步骤 2 修改迁移后的脚本,在NPU训练,生成npu dump数据
import precision_tool.tf_config as npu_tf_config
config = npu_tf_config.session_dump_config(config, action=‘dump')
with tf.Session(config=config) as sess:
sess.run(...)
步骤 3 将生成的数据目录上传到toolkit安装环境,进行整网数据比对
├── precision_tool
│ ├── cli.py
│ ├── ...
├── precision_data
│ ├── tf
│ │ ├── dump // 标杆dump数据
│ ├── npu
│ │ ├── debug_0 // npu dump数据
进行必要的配置(详细可参考文档),启动命令行:
python3 ./precision_tool/cli.py
PrecisionTool > ac –c
PrecisionTool > vcs –c 0.98 –l 10
可得到余弦相似度小于0.98的数据:
----结束
更多介绍
了解更详细的内容,可以登录昇腾社区 https://www.hiascend.com,阅读相关文档:
- 点赞
- 收藏
- 关注作者
评论(0)