建议使用以下浏览器,以获得最佳体验。 IE 9.0+以上版本 Chrome 31+ 谷歌浏览器 Firefox 30+ 火狐浏览器
设置昵称

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

确定
我再想想
选择版块
昇腾论坛 主题:14054帖子:83203

【技术干货】

【学习心得】TensorFlow训练脚本迁移与调优

kaliarch 2021/9/19 3594

一 背景

近期学习了昇腾CANN系列教程之TensorFlow训练脚本迁移与调优,从TensorFlow训练脚本迁移,训练网络精度问题分析,再到训练网络性能优化,深入的学习了TensorFlow训练。

二 TensorFlow训练脚本迁移

主要内容为如果将TensorFlow的训练脚本迁移至能在昇腾系列处理器上运行的脚本,

2.1 目标及前提

  • 目标
    • 了解如何将TensorFlow训练脚本迁移至NPU训练
    • 了解如何在NPU上进行混合精度训练
  • 学前准备
    • 熟练的Python语言编程能力
    • 熟悉TensorFlow 1.1 5的API
    • 深度学习基础知识, 熟悉训练网络的基本知识与流程
  • 准备工作
    • Ascend 910环境
    • 能够在GPU_上跑通的训练脚本
    • 与脚本配套的数据集

 

2.2 迁移要点

2.2.1 为什么要进行网络迁移

Ascend 910是华为在2019年发布的人工智能(AI)专用的神经网络处理器(NPU) ,其算力高达256T,

最新款算力高达310T,是业界主流芯片算力的2倍,默认配套MindSpore训练框架。当前业界大多数训

练脚本基于TensorFlow的Python API开发,默认运行在CPU/GPU/TPU上。为了使其能够在Ascend

910.上利用NPU的澎湃算力执行训练,提升训练性能,提高训练效率,我们需要对训练网络脚本进行相

关的迁移适配工作。当前Ascend910. 上支持TensorFlow的三种API开发的训练脚本迁移:分别是

Estimator, Sess.run, Keras。

13561632025047_.pic_hd.jpg


2.2.2 Estimator迁移

Estimator迁移,Estimator API属于TensorFlow的高阶API,在201 8年发布的TensorFlow 1.10版本中引入,它可极大简化机器学习的编程过程。

使用Estimator进行训练脚本开发的一般步骤为:

1.创建输入函数input _fn;

2.构建模型函数model_ fn;

3.实例化Estimator,并传入Runconfig类对象作为运行参数;

4.在Estimator上调用训练方法Estimator.train(),利用指定输入对模型进行固定步数的训练。

针对Estimator的训练脚本迁移,我们也按照以上步骤进行。

 

 

1. 创建输入函数input fn;

直接迁移,无需改造。

这里我们需要注意:如果你在创建dataset时使用dataset.batch返回动态shape,需要设置

drop_ remainder为True使其固定shape。

2.构建模型函数model _fn;

直接迁移,无需改造。

如果在model中使用了Gelu和Dropout接口,推荐修改为NPU提供的高性能接口。

WeChat1cb2c1a2777fc42f97f374eba8608c81.png


 

3.实例化Estimator, 并传入RunConfig类对象作为运行参数;

这-步我们需要将TensorFlow的RunConfig迁移为NPURunConfig。由于NPURunConfig类是继

承RunConfig类,因此我们在迁移时直接更改接口即可,大多数参数可不变。

迁移示例:

WeChatfc71a057e743b1376b758dd0d62cc8f1.png


  1. 在Estimator.上调用训练方法Estimator.train(),利用指定输入对模型进行固定步数训练。

将TensorFlow的Estimator迁移为NPUEstimator。

NPUEstimator类是继承Estimator类,因此我们在迁移时如下示例所示直接更改接口即可,参数可保持不变。

WeChat763f5847602fa6ceb846a954973498f1.png


 

2.2.3 Sess.run迁移

1. 数据预处理;

2.模型搭建/计算Loss/梯度 更新;

这两步与Estimator迁移相同:直接迁移,无需改造。

同样需要注意的是:

1.如果在创建dataset时使用dataset.batch返回动态shape,需要设置drop_ remainder为True使其固定shape。

2.如果在模型搭建使用了Gelu和Dropout接口,建议修改为NPU提供的高性能接口。

 

WeChat6ad71394d73f26c649562ce997676f8b.png


3.创建session并初始化资源;

这一步我们需要在创建Session前添加如下的配置,使得训练能够在NPU上执行:

13571632025170_.pic_hd.jpg


在添加配置时需要注意这些配置保持默认配置即可,如果原脚本中有变动需要恢复默认配置:

以下配置默认关闭,请勿开启:

13581632025173_.pic_hd.jpg


  1. 执行训练

Sess.run部分直接迁移,无需改造。

2.2.4 Keras迁移

Keras和Estimator类似,都属于TensorFlow高阶API, 提供了方便的构图功能,并对训练、评估、预测、导出提供了方便的接口。使用Keras API进行训练脚本开发的一般步骤为:

1.数据预处理;

2.模型搭建;

3.模型编译;

4.模型训练。

 

由于Keras迁移到Ascend平台运行时,某些功能受限支持,例如不支持动态学习率等,因此不建议用户在Ascend平台_上迁移Keras开发的网络脚本。如需在Ascend平台运行Keras脚本,下面提供两种迁移方式:

在Ascend平台可以直接使用Keras原生API进行训练,但需要进行部分适配,同时指定一次

Session.run调用,在异腾AI处理器执行训练迭代的次数固定为1,具体请参考Keras原生接口支持部分的内容。

如需减少Host与Device间的交互次数,缩短训|练时长,需要通过model _to_ npu_ estimator接口,将通过Keras构建的模型转换为NPUEstimator对象,同时通过NPURunConfig中的

iterations_ per_ loop参数指定一次Session.run调用, 在异腾Al处理器执行训练迭代的次数。具体请参考Keras转换为NPUEstimator部分的内容。

Keras原生接口支持

需要开启use_ off line用于在异腾AI处理器执行训练,因此需要先创建一个TensorFlow会话并且注册Keras。同时在训练结束时,关闭会话。类似于Sess.run的迁移。

13591632025207_.pic_hd.jpg


Keras原生接口支持

如果需要在异腾AI处理器上进行分布式训练,需要在Keras模型编译时修改optimizer,使用

TensorFlow单机训练优化器(注意不能使用Keras的优化器),并通过NPUDistributedOptimizer类来封装单机训练优化器,例如:

 


2.3 混合精度训练

*混合精度训练

混合精度训练方法是为了解决fp32"下内存和显存占用大, fp16 下精度不够的问题,使前向计算、反向求导、梯度传输的时候都使用fp16,但参数更新阶段的时候将fp1 6的梯度加到参数的fp32副本上。下- -轮迭代时,将参数的fp32副本转化为fp16,用作前向计算。这样可以减少内存使用和存取,从而可以训练更大的神经网络。同时又能基本保持使用float32训练所能达到的网络精度。

使用混合精度训练有如下这些好处:省存储:参数、梯度、feature map均表示为fp16,省一伴存储(显存或内存),因此可使用更大的batch-size省传输:分布式训练时(单机多卡,或多机多卡),梯度的传输量减少-半省计算: GPU的fp1 6运算主要在tensor core中执行,相比fp32算力提升5倍。Ascend910 aicore同样支持fp1 6加速运算,因此也支持混合精度训练。

 

当前异腾Al处理器支持如下几种训练精度模式,用户可以在训练脚本中设置。

  • allow_ fp32_ to_ fp16: 优先保持原图精度,当算子不支持float32数据类型时,直接降低精度到 float16。
  • force_ _fp16:当算子既支持float1 6又支持float32数据类型时,强制选择float16。
  • must_ keep_ _origin_ _dtype:保持原图精度。此种方式下,如果整网中有Conv2D算子,由于该算子

仅支持float1 6类型,在原图输入是float32类型的情况下,训练会报错中止。

allow_ mix_ precision:自动混合精度。可以针对全网中float32数据类型的算子,按照内置的优化策略,自动将部分float32的算子降低精度到float16, 从而在精度损失很小的情况下提升系统性能并减少内存使用。

 

 

  • Loss Scale

前面我们提到,在混合精度训练中,前向计算,反向求导,梯度传输的过程中会使用fp1 6进行计算。

但是我们知道,在深度学习训练中,有些反向求导计算产生的梯度数据会非常小。这种情况下,

fp1 6的精度可能不足以表示这些梯度数据,导致在反向传播的过程中梯度丢失。如果将Loss值

(是个标量)放大K倍,那么根据链式法则,反向传播过程中的weight gradient. feature map

gradient都会放大K倍。因此原来不能被fp16表示(即< 2-24的数)的gradient就可能被fp1 6表示

13611632025253_.pic_hd.jpg


 

在Ascend 910.上,我们提供了Loss scale功能。

如果原始网络中手动实现了Loss Scale功能,

这种可以不需要迁移。

如果原始网络中使用了Loss Scale功能,13621632025256_.pic_hd.jpg


静态Loss Scale:用户可定义在混合精度训练过程中使用固定的Loss Scale系数。

具体做法是,在创建NPULossScaleOptimizer之前, 实例化-个FixedLossScaleManager类进行指定Loss Scale的值。

 

动态Loss Scale:用户可定义在混合精度训练过程中根据浮点计算异常状态调整Loss Scale系数。

具体做法是,在创建NPULossScaleOptimizer之 前,实例化一个ExponentialUpdateLossScaleManagr类进行动态Loss Scale的配置。

另外,当使用NPULossScaleOptimizer时, 将is_ _distributed配置为True以支持分布式训练场景下LossScaling功能。

13631632025287_.pic_hd.jpg


 

三 训练网络精度问题分析

  • 课程目标

了解确认精度误差是否为NPU带来的问题

了解对NPU上的Dump数据的方法

  • 准备内容

熟练的Python语言编程能力

熟悉TensorFlow 1.15的API

能够在Ascend 910.上执行训练脚本

深度学习基础知识,熟悉训练网络的基本知识与流程

3.1 精度问题分析

当我们在NPU上执行训练,最终的精度不满足时,可以使用通常的精度调优方法,例如调整

epochs, learning_ rate等超参,或者增加训练数据,清洗问题数据,修改网络结构,优化器

等手段进行调优。

如果在使用多种手段后,精度依旧不达标( 包括loss跑~飞等情况),怀疑是NPU的精度问题

时,请参照下列方法进行初步定位:

1.关闭脚本中的所有随机, 例如数据集的shuffle, 网络中的dropout, layer中的初始化等。

此步骤非常关键,包括后面的Dump数据也必须做该操作;

2.取同一网络的原始脚本 与NPU迁移脚本,使用相同的数据集,相同的超参,分别在

CPU/GPU与NPU.上训练;

3.取最终的CPU/GPU与NPU训练的loss值进行拟合不对, 如果不拟合,则说明NPU存在精

度问题。

  • 获取Dump数据

华为支持迁移用户原始网络,用于在异腾910 Al处理器上执行训练,网络迁移可能会造成自

有实现的算子运算结果与用业界标准算子(如TensorFlow) 运算结果存在偏差。根据前面的

方法,当我们确认NPU存在精度问题时,可以获取异腾910 Al处理器运算结果与原始网络基

于GPU/CPU运算结果,通过使用精度比对工具确认误差发生的算子。

目前精度比对工具提供Vector比对能力,包含余弦相似度、最大绝对误差、累积相对误差、

欧氏相对距离、KLD散度、标准差的算法比对。

  • 获取Dump数据一-NPU数据准备

准备基于异腾AI处理器运行生成的Dump数据在进行迁移后的训练网络Dump数据前,您需要参考《驱动和开发环境安装指南》完成开发环境准备,并完成训练网络开发、编译和运行,确保具备可执行的训练工程,且Dump数据前去除随机。

1. 修改训练脚本,开启Dump功能。在相应代码中,增加如下的加粗字体信息。

Estimator模式: 通过NPURunConfig中的dump_ _config采集Dump数据,在创建

NPURunConfig之前,实例化一个DumpConfig类进行dump的配置 ( 包括配置

dump路径、dump哪些迭代的数据、dump算子的输入还是输出数据等)

13641632025311_.pic_hd.jpg


 

准备基于GPU/CPU运行生成的npy或Dump数据

获取NPU的Dump数据后,我们还要准备对比数据,在进行原始网络生成CPU/GPU的

npy或Dump数据前,需要已经有一套完整的、 可执行的标准的原始模型训练工程。如果

需要使用基于GPU/CPU运行生成的dump数据比对,请获取到npy文件后利用华为提供

的转换工具将npy文件转换成dump数据文件。

四 训练网络性能优化

  • 课程目标

了解在NPU.上训练一 个迭代的时间分解

了解如何在NPU上获取Profiling数据

了解对NPU上的训练脚本进行性能优化及常用手段

  • 准备工作

熟练的Python语言编程能力

熟悉TensorFlow 1.1 5的API

能够在Ascend 910.上执行训练脚本

深度学习基础知识,熟悉训练网络的基本知识与流程

4.1 训练端到端时间分解

13651632025340_.pic_hd.jpg

训练一个迭代(step) 的端到端时间为:迭代间隙+ FPBP+ AllReduce+梯度更新。迭代间隙为上一个迭代到这次迭代的间隔时间,FPBP为算子计算前向传播和反向传播的时间AR即AllReduce为分布式训练时HCCL进行梯度聚合的时间,在NPU.上默认切分为AR1和AR2梯度更新即正反向计算得到梯度后更新参数的时间。

4.2 常见性能优化方法


在获取Profiling数据后,根据一个迭代训练中各部分的耗时,根据各部分的工作,可以做针

对性的性能优化:例如迭代间隙时间较长,迭代间隙一般为host与device的交互,数据预处理等,可以考虑增加下沉次数iteration per loop或改进数据预处理提升性能。

若FPBP时间过长,就要进一步解析训练过程中各个算子的时间, 找出耗时长(相对理论性能)

的算子进行优化。

若AllReduce时间长,则考虑优化AllReduce.例如并行度差时可以通过调整切分策略来优化

AllReduce的时间。

 

数据预处理性能提升

1.均衡数据预处理算 子

在大数据量的情况下,当数据预处理性能无法满足后续图需要的计算性能,用户可以

通过均衡Host和Device.上执行的数据预处理算子,提高训练性能。

数据预处理算子是否在Device执行的策略为:预处理算子由后向前查找,若找到的

算子支持在Device执行,则在Device执行,直至遇到不支持的算子,其余均在Host

执行。

当前支持在Device运行的数据预处理算子为: map、batch、 map_ and_ batch, 其余均在Host执行。

 

五 结束语

老师讲解TensorFlow脚本迁移由浅入深,从理论到实战,帮助我们能在日常工作中提供思路和解决方案,非常的好。

 

回复8

囹圄
0 0
2021/9/19 21:07

学习了,谢谢分享

2021/9/20 21:05

谢谢分享 学习了

ArmyFans
0 0
2021/9/21 22:01

感谢分享

2021/10/9 10:01

感谢分享~

2021/10/9 13:32

谢谢分享~

xxll
0 0
2021/10/9 13:40

感谢分享

JammySate
0 0
2021/10/9 14:01

感谢分享~

囹圄
0 0
2021/10/10 16:19

谢谢分享

上划加载中
直达楼层
标签
您还可以添加5个标签
  • 没有搜索到和“关键字”相关的标签
  • 云产品
  • 解决方案
  • 技术领域
  • 通用技术
  • 平台功能
取消

采纳成功

您已采纳当前回复为最佳回复

kaliarch

发帖: 4粉丝: 4

发消息 + 关注

发表于2021年09月19日 12:22:52 3594 8
直达本楼层的链接
楼主
显示全部楼层
[技术干货] 【学习心得】TensorFlow训练脚本迁移与调优

一 背景

近期学习了昇腾CANN系列教程之TensorFlow训练脚本迁移与调优,从TensorFlow训练脚本迁移,训练网络精度问题分析,再到训练网络性能优化,深入的学习了TensorFlow训练。

二 TensorFlow训练脚本迁移

主要内容为如果将TensorFlow的训练脚本迁移至能在昇腾系列处理器上运行的脚本,

2.1 目标及前提

  • 目标
    • 了解如何将TensorFlow训练脚本迁移至NPU训练
    • 了解如何在NPU上进行混合精度训练
  • 学前准备
    • 熟练的Python语言编程能力
    • 熟悉TensorFlow 1.1 5的API
    • 深度学习基础知识, 熟悉训练网络的基本知识与流程
  • 准备工作
    • Ascend 910环境
    • 能够在GPU_上跑通的训练脚本
    • 与脚本配套的数据集

 

2.2 迁移要点

2.2.1 为什么要进行网络迁移

Ascend 910是华为在2019年发布的人工智能(AI)专用的神经网络处理器(NPU) ,其算力高达256T,

最新款算力高达310T,是业界主流芯片算力的2倍,默认配套MindSpore训练框架。当前业界大多数训

练脚本基于TensorFlow的Python API开发,默认运行在CPU/GPU/TPU上。为了使其能够在Ascend

910.上利用NPU的澎湃算力执行训练,提升训练性能,提高训练效率,我们需要对训练网络脚本进行相

关的迁移适配工作。当前Ascend910. 上支持TensorFlow的三种API开发的训练脚本迁移:分别是

Estimator, Sess.run, Keras。

13561632025047_.pic_hd.jpg


2.2.2 Estimator迁移

Estimator迁移,Estimator API属于TensorFlow的高阶API,在201 8年发布的TensorFlow 1.10版本中引入,它可极大简化机器学习的编程过程。

使用Estimator进行训练脚本开发的一般步骤为:

1.创建输入函数input _fn;

2.构建模型函数model_ fn;

3.实例化Estimator,并传入Runconfig类对象作为运行参数;

4.在Estimator上调用训练方法Estimator.train(),利用指定输入对模型进行固定步数的训练。

针对Estimator的训练脚本迁移,我们也按照以上步骤进行。

 

 

1. 创建输入函数input fn;

直接迁移,无需改造。

这里我们需要注意:如果你在创建dataset时使用dataset.batch返回动态shape,需要设置

drop_ remainder为True使其固定shape。

2.构建模型函数model _fn;

直接迁移,无需改造。

如果在model中使用了Gelu和Dropout接口,推荐修改为NPU提供的高性能接口。

WeChat1cb2c1a2777fc42f97f374eba8608c81.png


 

3.实例化Estimator, 并传入RunConfig类对象作为运行参数;

这-步我们需要将TensorFlow的RunConfig迁移为NPURunConfig。由于NPURunConfig类是继

承RunConfig类,因此我们在迁移时直接更改接口即可,大多数参数可不变。

迁移示例:

WeChatfc71a057e743b1376b758dd0d62cc8f1.png


  1. 在Estimator.上调用训练方法Estimator.train(),利用指定输入对模型进行固定步数训练。

将TensorFlow的Estimator迁移为NPUEstimator。

NPUEstimator类是继承Estimator类,因此我们在迁移时如下示例所示直接更改接口即可,参数可保持不变。

WeChat763f5847602fa6ceb846a954973498f1.png


 

2.2.3 Sess.run迁移

1. 数据预处理;

2.模型搭建/计算Loss/梯度 更新;

这两步与Estimator迁移相同:直接迁移,无需改造。

同样需要注意的是:

1.如果在创建dataset时使用dataset.batch返回动态shape,需要设置drop_ remainder为True使其固定shape。

2.如果在模型搭建使用了Gelu和Dropout接口,建议修改为NPU提供的高性能接口。

 

WeChat6ad71394d73f26c649562ce997676f8b.png


3.创建session并初始化资源;

这一步我们需要在创建Session前添加如下的配置,使得训练能够在NPU上执行:

13571632025170_.pic_hd.jpg


在添加配置时需要注意这些配置保持默认配置即可,如果原脚本中有变动需要恢复默认配置:

以下配置默认关闭,请勿开启:

13581632025173_.pic_hd.jpg


  1. 执行训练

Sess.run部分直接迁移,无需改造。

2.2.4 Keras迁移

Keras和Estimator类似,都属于TensorFlow高阶API, 提供了方便的构图功能,并对训练、评估、预测、导出提供了方便的接口。使用Keras API进行训练脚本开发的一般步骤为:

1.数据预处理;

2.模型搭建;

3.模型编译;

4.模型训练。

 

由于Keras迁移到Ascend平台运行时,某些功能受限支持,例如不支持动态学习率等,因此不建议用户在Ascend平台_上迁移Keras开发的网络脚本。如需在Ascend平台运行Keras脚本,下面提供两种迁移方式:

在Ascend平台可以直接使用Keras原生API进行训练,但需要进行部分适配,同时指定一次

Session.run调用,在异腾AI处理器执行训练迭代的次数固定为1,具体请参考Keras原生接口支持部分的内容。

如需减少Host与Device间的交互次数,缩短训|练时长,需要通过model _to_ npu_ estimator接口,将通过Keras构建的模型转换为NPUEstimator对象,同时通过NPURunConfig中的

iterations_ per_ loop参数指定一次Session.run调用, 在异腾Al处理器执行训练迭代的次数。具体请参考Keras转换为NPUEstimator部分的内容。

Keras原生接口支持

需要开启use_ off line用于在异腾AI处理器执行训练,因此需要先创建一个TensorFlow会话并且注册Keras。同时在训练结束时,关闭会话。类似于Sess.run的迁移。

13591632025207_.pic_hd.jpg


Keras原生接口支持

如果需要在异腾AI处理器上进行分布式训练,需要在Keras模型编译时修改optimizer,使用

TensorFlow单机训练优化器(注意不能使用Keras的优化器),并通过NPUDistributedOptimizer类来封装单机训练优化器,例如:

 


2.3 混合精度训练

*混合精度训练

混合精度训练方法是为了解决fp32"下内存和显存占用大, fp16 下精度不够的问题,使前向计算、反向求导、梯度传输的时候都使用fp16,但参数更新阶段的时候将fp1 6的梯度加到参数的fp32副本上。下- -轮迭代时,将参数的fp32副本转化为fp16,用作前向计算。这样可以减少内存使用和存取,从而可以训练更大的神经网络。同时又能基本保持使用float32训练所能达到的网络精度。

使用混合精度训练有如下这些好处:省存储:参数、梯度、feature map均表示为fp16,省一伴存储(显存或内存),因此可使用更大的batch-size省传输:分布式训练时(单机多卡,或多机多卡),梯度的传输量减少-半省计算: GPU的fp1 6运算主要在tensor core中执行,相比fp32算力提升5倍。Ascend910 aicore同样支持fp1 6加速运算,因此也支持混合精度训练。

 

当前异腾Al处理器支持如下几种训练精度模式,用户可以在训练脚本中设置。

  • allow_ fp32_ to_ fp16: 优先保持原图精度,当算子不支持float32数据类型时,直接降低精度到 float16。
  • force_ _fp16:当算子既支持float1 6又支持float32数据类型时,强制选择float16。
  • must_ keep_ _origin_ _dtype:保持原图精度。此种方式下,如果整网中有Conv2D算子,由于该算子

仅支持float1 6类型,在原图输入是float32类型的情况下,训练会报错中止。

allow_ mix_ precision:自动混合精度。可以针对全网中float32数据类型的算子,按照内置的优化策略,自动将部分float32的算子降低精度到float16, 从而在精度损失很小的情况下提升系统性能并减少内存使用。

 

 

  • Loss Scale

前面我们提到,在混合精度训练中,前向计算,反向求导,梯度传输的过程中会使用fp1 6进行计算。

但是我们知道,在深度学习训练中,有些反向求导计算产生的梯度数据会非常小。这种情况下,

fp1 6的精度可能不足以表示这些梯度数据,导致在反向传播的过程中梯度丢失。如果将Loss值

(是个标量)放大K倍,那么根据链式法则,反向传播过程中的weight gradient. feature map

gradient都会放大K倍。因此原来不能被fp16表示(即< 2-24的数)的gradient就可能被fp1 6表示

13611632025253_.pic_hd.jpg


 

在Ascend 910.上,我们提供了Loss scale功能。

如果原始网络中手动实现了Loss Scale功能,

这种可以不需要迁移。

如果原始网络中使用了Loss Scale功能,13621632025256_.pic_hd.jpg


静态Loss Scale:用户可定义在混合精度训练过程中使用固定的Loss Scale系数。

具体做法是,在创建NPULossScaleOptimizer之前, 实例化-个FixedLossScaleManager类进行指定Loss Scale的值。

 

动态Loss Scale:用户可定义在混合精度训练过程中根据浮点计算异常状态调整Loss Scale系数。

具体做法是,在创建NPULossScaleOptimizer之 前,实例化一个ExponentialUpdateLossScaleManagr类进行动态Loss Scale的配置。

另外,当使用NPULossScaleOptimizer时, 将is_ _distributed配置为True以支持分布式训练场景下LossScaling功能。

13631632025287_.pic_hd.jpg


 

三 训练网络精度问题分析

  • 课程目标

了解确认精度误差是否为NPU带来的问题

了解对NPU上的Dump数据的方法

  • 准备内容

熟练的Python语言编程能力

熟悉TensorFlow 1.15的API

能够在Ascend 910.上执行训练脚本

深度学习基础知识,熟悉训练网络的基本知识与流程

3.1 精度问题分析

当我们在NPU上执行训练,最终的精度不满足时,可以使用通常的精度调优方法,例如调整

epochs, learning_ rate等超参,或者增加训练数据,清洗问题数据,修改网络结构,优化器

等手段进行调优。

如果在使用多种手段后,精度依旧不达标( 包括loss跑~飞等情况),怀疑是NPU的精度问题

时,请参照下列方法进行初步定位:

1.关闭脚本中的所有随机, 例如数据集的shuffle, 网络中的dropout, layer中的初始化等。

此步骤非常关键,包括后面的Dump数据也必须做该操作;

2.取同一网络的原始脚本 与NPU迁移脚本,使用相同的数据集,相同的超参,分别在

CPU/GPU与NPU.上训练;

3.取最终的CPU/GPU与NPU训练的loss值进行拟合不对, 如果不拟合,则说明NPU存在精

度问题。

  • 获取Dump数据

华为支持迁移用户原始网络,用于在异腾910 Al处理器上执行训练,网络迁移可能会造成自

有实现的算子运算结果与用业界标准算子(如TensorFlow) 运算结果存在偏差。根据前面的

方法,当我们确认NPU存在精度问题时,可以获取异腾910 Al处理器运算结果与原始网络基

于GPU/CPU运算结果,通过使用精度比对工具确认误差发生的算子。

目前精度比对工具提供Vector比对能力,包含余弦相似度、最大绝对误差、累积相对误差、

欧氏相对距离、KLD散度、标准差的算法比对。

  • 获取Dump数据一-NPU数据准备

准备基于异腾AI处理器运行生成的Dump数据在进行迁移后的训练网络Dump数据前,您需要参考《驱动和开发环境安装指南》完成开发环境准备,并完成训练网络开发、编译和运行,确保具备可执行的训练工程,且Dump数据前去除随机。

1. 修改训练脚本,开启Dump功能。在相应代码中,增加如下的加粗字体信息。

Estimator模式: 通过NPURunConfig中的dump_ _config采集Dump数据,在创建

NPURunConfig之前,实例化一个DumpConfig类进行dump的配置 ( 包括配置

dump路径、dump哪些迭代的数据、dump算子的输入还是输出数据等)

13641632025311_.pic_hd.jpg


 

准备基于GPU/CPU运行生成的npy或Dump数据

获取NPU的Dump数据后,我们还要准备对比数据,在进行原始网络生成CPU/GPU的

npy或Dump数据前,需要已经有一套完整的、 可执行的标准的原始模型训练工程。如果

需要使用基于GPU/CPU运行生成的dump数据比对,请获取到npy文件后利用华为提供

的转换工具将npy文件转换成dump数据文件。

四 训练网络性能优化

  • 课程目标

了解在NPU.上训练一 个迭代的时间分解

了解如何在NPU上获取Profiling数据

了解对NPU上的训练脚本进行性能优化及常用手段

  • 准备工作

熟练的Python语言编程能力

熟悉TensorFlow 1.1 5的API

能够在Ascend 910.上执行训练脚本

深度学习基础知识,熟悉训练网络的基本知识与流程

4.1 训练端到端时间分解

13651632025340_.pic_hd.jpg

训练一个迭代(step) 的端到端时间为:迭代间隙+ FPBP+ AllReduce+梯度更新。迭代间隙为上一个迭代到这次迭代的间隔时间,FPBP为算子计算前向传播和反向传播的时间AR即AllReduce为分布式训练时HCCL进行梯度聚合的时间,在NPU.上默认切分为AR1和AR2梯度更新即正反向计算得到梯度后更新参数的时间。

4.2 常见性能优化方法


在获取Profiling数据后,根据一个迭代训练中各部分的耗时,根据各部分的工作,可以做针

对性的性能优化:例如迭代间隙时间较长,迭代间隙一般为host与device的交互,数据预处理等,可以考虑增加下沉次数iteration per loop或改进数据预处理提升性能。

若FPBP时间过长,就要进一步解析训练过程中各个算子的时间, 找出耗时长(相对理论性能)

的算子进行优化。

若AllReduce时间长,则考虑优化AllReduce.例如并行度差时可以通过调整切分策略来优化

AllReduce的时间。

 

数据预处理性能提升

1.均衡数据预处理算 子

在大数据量的情况下,当数据预处理性能无法满足后续图需要的计算性能,用户可以

通过均衡Host和Device.上执行的数据预处理算子,提高训练性能。

数据预处理算子是否在Device执行的策略为:预处理算子由后向前查找,若找到的

算子支持在Device执行,则在Device执行,直至遇到不支持的算子,其余均在Host

执行。

当前支持在Device运行的数据预处理算子为: map、batch、 map_ and_ batch, 其余均在Host执行。

 

五 结束语

老师讲解TensorFlow脚本迁移由浅入深,从理论到实战,帮助我们能在日常工作中提供思路和解决方案,非常的好。

 

昇腾

举报
分享

分享文章到朋友圈

分享文章到微博

采纳成功

您已采纳当前回复为最佳回复

囹圄

发帖: 0粉丝: 0

发消息 + 关注

发表于2021年09月19日 21:07:29
直达本楼层的链接
沙发
显示全部楼层

学习了,谢谢分享

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

吃辣的企鹅

发帖: 0粉丝: 0

发消息 + 关注

发表于2021年09月20日 21:05:06
直达本楼层的链接
板凳
显示全部楼层

谢谢分享 学习了

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

ArmyFans

发帖: 0粉丝: 0

发消息 + 关注

发表于2021年09月21日 22:01:34
直达本楼层的链接
地板
显示全部楼层

感谢分享

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复
发表于2021年10月09日 10:01:21
直达本楼层的链接
5#
显示全部楼层

感谢分享~

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

有点小偏执

发帖: 0粉丝: 0

发消息 + 关注

发表于2021年10月09日 13:32:50
直达本楼层的链接
6#
显示全部楼层

谢谢分享~

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

xxll

发帖: 3粉丝: 0

发消息 + 关注

发表于2021年10月09日 13:40:35
直达本楼层的链接
7#
显示全部楼层

感谢分享

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

JammySate

发帖: 0粉丝: 0

发消息 + 关注

发表于2021年10月09日 14:01:56
直达本楼层的链接
8#
显示全部楼层

感谢分享~

点赞 评论 引用 举报

采纳成功

您已采纳当前回复为最佳回复

囹圄

发帖: 0粉丝: 0

发消息 + 关注

发表于2021年10月10日 16:19:44
直达本楼层的链接
9#
显示全部楼层

谢谢分享

点赞 评论 引用 举报

游客

您需要登录后才可以回帖 登录 | 立即注册

结贴

您对问题的回复是否满意?
满意度
非常满意 满意 一般 不满意
我要反馈
0/200