网站构建的基本流程五个环节,网站建设的费用报价,企业优化网站,wordpress代码高亮一只小狐狸带你解锁 炼丹术NLP 秘籍作者#xff1a;苏剑林#xff08;来自追一科技#xff0c;人称“苏神”#xff09;前言在前不久的文章《BERT重计算#xff1a;用22.5%的训练时间节省5倍的显存开销#xff08;附代码#xff09;》中介绍了一个叫做“重计算”的… 一只小狐狸带你解锁 炼丹术NLP 秘籍作者苏剑林来自追一科技人称“苏神”前言在前不久的文章《BERT重计算用22.5%的训练时间节省5倍的显存开销附代码》中介绍了一个叫做“重计算”的技巧附pytorch和paddlepaddle实现。简单来说重计算就是用来省显存的方法让平均训练速度慢一点但batch_size可以增大好几倍该技巧首先发布于论文《Training Deep Nets with Sublinear Memory Cost》。最近笔者发现重计算的技巧在tensorflow也有实现。事实上从tensorflow1.8开始tensorflow就已经自带了该功能了当时被列入了tf.contrib这个子库中而从tensorflow1.15开始它就被内置为tensorflow的主函数之一那就是tf.recompute_grad。找到 tf.recompute_grad 之后笔者就琢磨了一下它的用法经过一番折腾最终居然真的成功地用起来了居然成功地让 batch_size 从48增加到了144然而在继续整理测试的过程中发现这玩意居然在tensorflow 2.x是失效的...于是再折腾了两天查找了各种资料并反复调试最终算是成功地补充了这一缺陷。最后是笔者自己的开源实现Github地址https://github.com/bojone/keras_recompute该实现已经内置在bert4keras中使用bert4keras的读者可以升级到最新版本0.7.5来测试该功能。使用笔者的实现也命名为recompute_grad它是一个装饰器用于自定义Keras层的 call函数比如from recompute import recompute_gradclass MyLayer(Layer):
recompute_grad
def call(self, inputs):
return inputs * 2
对于已经存在的层可以通过继承的方式来装饰from recompute import recompute_grad
class MyDense(Dense):recompute_graddef call(self, inputs):return super(MyDense, self).call(inputs)
自定义好层之后在代码中嵌入自定义层然后在执行代码之前加入环境变量RECOMPUTE1来启用重计算。注意不是在总模型里插入了recomputr_grad就能达到省内存的目的而是要在每个层都插入recomputr_grad才能更好地省显存。简单来说就是插入的recomputr_grad越多就省显存。具体原因请仔细理解重计算的原理。效果bert4keras0.7.5已经内置了重计算直接传入环境变量RECOMPUTE1就会启用重计算读者可以自行尝试大概的效果是1、在BERT Base版本下batch_size可以增大为原来的3倍左右2、在BERT Large版本下batch_size可以增大为原来的4倍左右3、平均每个样本的训练时间大约增加25%4、理论上层数越多batch_size可以增大的倍数越大。环境在下面的环境下测试通过tensorflow 1.14 keras 2.3.1tensorflow 1.15 keras 2.3.1tensorflow 2.0 keras 2.3.1tensorflow 2.1 keras 2.3.1tensorflow 2.0 自带tf.kerastensorflow 2.1 自带tf.keras确认不支持的环境tensorflow 1.x 自带tf.keras欢迎报告更多的测试结果。顺便说一下强烈建议用keras2.3.1配合tensorflow1.x/2.x来跑强烈不建议使用tensorflow 2.x自带的tf.keras来跑。可能喜欢算法工程师的效率神器——vim篇硬核推导Google AdaFactor一个省显存的宝藏优化器数据缺失、混乱、重复怎么办最全数据清洗指南让你所向披靡LayerNorm是Transformer的最优解吗ACL2020|FastBERT放飞BERT的推理速度夕小瑶的卖萌屋_关注星标小夕带你解锁AI秘籍订阅号主页下方「撩一下」有惊喜哦