『技术』一行代码让训练速度提升2倍,飞桨自动混合精度技术详解( 二 )
为了训练 MNIST 网络 , 还需要定义损失函数来更新权重参数 , 此处使用的优化损失函数是 SGDOptimizer 。 为了简化说明 , 这里省略了迭代训练的相关代码 , 仅体现损失函数及优化器定义相关的内容 。
import paddle.fluid as fluidimport numpy as npdata = http://news.hoteastday.com/a/fluid.layers.data(name='image', shape=[None, 28, 28, 1], dtype='float32')label = fluid.layers.data(name='label', shape=[None, 1], dtype='int64')out = MNIST(data, class_dim=10)loss = fluid.layers.cross_entropy(input=out, label=label)avg_loss = fluid.layers.mean(loss)sgd = fluid.optimizer.SGDOptimizer(learning_rate=1e-3)sgd.minimize(avg_loss)
那么如何将上面的示例改造成使用 AMP 训练的方式呢?用户仅需要使用飞桨提供的 AMP 函数 fluid.contrib.mixed_precision.decorate 将原来的优化器 SGDOptimizer 进行封装 , 然后使用封装后的优化器(mp_sgd)更新参数梯度 , 代码如下所示:
sgd = fluid.optimizer.SGDOptimizer(learning_rate=1e-3)mp_sgd = fluid.contrib.mixed_precision.decorator.decorate(sgd)mp_sgd.minimize(avg_loss)
如上即为最简单的飞桨 AMP 功能使用方法 。
但是大家可能有些疑问 , 模型是如何感知哪些算子(Op)需要被转换呢?是不是还需要手工指定呢?算子那么多 , 我怎么知道哪个算子可以被转换呢?别着急 , 飞桨已经帮你定制好了 , 这也是这门技术被称为「自动」的原因之一 , 且请往下看!
黑白名单功能
为了让开发者可以方便快捷的使用混合精度计算 , 飞桨的工程师们使用了大量模型在不同应用场景中反复验证 , 然后根据半精度数据类型计算的稳定性和加速效果 , 梳理出一系列适合转换为半精度计算的算子 , 并将这些算子定义到了一份白名单文件中 。 同时对于一些经过验证发现不适合转换的算子 , 也就是使用半精度计算会导致数值不精确的算子将被记录到黑名单文件中 。 此外一些对半精度计算没有多少影响的算子归类于灰名单 。 在使用 AMP 训练过程中 , 系统会自动读取黑白名单 , 从而感知到哪些算子需要被转换为半精度计算 。
对于某些特殊场景 , 如果开发者希望使用自定义的黑白名单 , 则可以使用 AutoMixedPrecisionLists 类设置 , 代码示例如下所示 。
sgd = SGDOptimizer(learning_rate=1e-3)# 指定自定义的黑白名单 , 其中 list1 和 list2 为包含有算子名称的列表amp_list = AutoMixedPrecisionLists(custom_white_list=list1,custom_black_list=list2)mp_sgd = fluid.contrib.mixed_precision.decorator.decorate(sgd, amp_list)mp_sgd.minimize(avg_loss)
那么自动混合精度技术被称为「自动」的原因之二呢?那就是下面的自动调整 Loss Scaling 功能 。
自动调整 Loss Scaling
AMP 技术在提升访存和计算效率的同时 , 伴随的副作用也是很明显的 。 那就是由于半精度数据类型的精度范围与转换前的单精度相比过窄 , 导致容易产生 INF 和 NAN 问题 。 为了避免此类问题 , AMP 技术实现了自动调整 Loss Scaling 功能 , 即在 AMP 训练过程中 , 为了避免精度下溢 , 每训练一定数量批次的数据 , 就将 Loss 放大指定倍数 。 如果 Loss 在放大过程中发生上溢 , 则可以再缩小一定倍数 , 确保整个训练过程中 , 梯度可以正常收敛 。
fluid.contrib.mixed_precision.decorate 函数携带了自动调整 Loss Scaling 功能相关的参数 , 这些参数都带有默认值 , 如下面代码所示 。 这些默认值都是经过飞桨工程师多次验证后定义的 。 通常情况下 , 用户可以直接使用 , 无需重新设置 。
推荐阅读
- 「A1canton」智慧酒店震撼来袭——虚拟现实VR篇,五大技术革新传统酒店
- #麒麟说财经#利润高到想不到,却被很多人看不起,这一行业被低估
- 「北京头条客户端」科技部:将加大对前沿技术研发的攻关和支持力度
- 『财经涂鸦』三七互娱爆发的秘密:该用技术公司估值模型来看它了
- 2020年你应该关注的8大技术趋势,眺望曙光TVP线上技术闭门会纯享实录
- 十大突破性技术-NMN,叫你如何选择最好的NMN
- CNBC:京东智联云打造欧美企业在华首选技术服务平台
- 鲁信创投■60余家创投机构代表参加新能源与先进制造专场路演活动中国科协科学技术传播中心
- 产业气象站▲固守高端显示技术领先地位,三星、LGD皆弃LCD
- 『接风娱乐』人机对战协作新时期已经来临,提高智能化与人工智能技术趋于结合
