是否可以使用 float16 训练 tensorflow 1?
Is it possible to train with tensorflow 1 using float16?
目前使用默认设置 - float32 在 tensorflow 模型上训练 keras。
Post 训练网络被量化:将权重转换为 float16。这将性能提高了 ~x3,同时保持相同的准确性。
我试图从一开始就使用 float16 进行训练,但惨遭失败。我找不到任何 link 来解释这是否可能,如果不可能,为什么不可能。
来自 NVidia 的 Automated Mixed Precision 可能是一个可行的方法。
根据我自 1.14
以来收集到的信息,上游支持(曾经)支持它。您所要做的就是像这样包装您的优化器:
opt = tf.train.experimental.enable_mixed_precision_graph_rewrite(opt)
您可能还需要在 Python 脚本中设置特定的 environment variable
,即:
os.environ[‘TF_ENABLE_AUTO_MIXED_PRECISION’] = ‘1’
以上应该已经采用了良好的混合精度训练实践(例如损失缩放、在必要时保持 float32
等)。
此解决方案的好资源应该是 official NVidia's documentation。
收集的一些其他资源也可能有用(尽管似乎并不表示您需要做更多的事情)here, here or here。
我建议不要手动投射,因为你可能很容易失去精度(例如,在推理过程中使用的 BatchNorm
统计数据中),除非你知道特定层的来龙去脉。
此外,您还可以检查 Google 中的 bfloat16
(大脑浮动)类型,它具有 float32
的 exponent
部分(8
位)和较小的分数。与 float16
相比,这允许它保持更大范围的值(例如,在计算梯度时),这允许人们避免 loss scaling
。
以上 (bfloat16
) 应该主要在 TPU 中有用,AFAIK NVidia GPU 对它的支持不是很好(如果我错了请纠正我)。一些信息here.
目前使用默认设置 - float32 在 tensorflow 模型上训练 keras。
Post 训练网络被量化:将权重转换为 float16。这将性能提高了 ~x3,同时保持相同的准确性。
我试图从一开始就使用 float16 进行训练,但惨遭失败。我找不到任何 link 来解释这是否可能,如果不可能,为什么不可能。
Automated Mixed Precision 可能是一个可行的方法。
根据我自 1.14
以来收集到的信息,上游支持(曾经)支持它。您所要做的就是像这样包装您的优化器:
opt = tf.train.experimental.enable_mixed_precision_graph_rewrite(opt)
您可能还需要在 Python 脚本中设置特定的 environment variable
,即:
os.environ[‘TF_ENABLE_AUTO_MIXED_PRECISION’] = ‘1’
以上应该已经采用了良好的混合精度训练实践(例如损失缩放、在必要时保持 float32
等)。
此解决方案的好资源应该是 official NVidia's documentation。
收集的一些其他资源也可能有用(尽管似乎并不表示您需要做更多的事情)here, here or here。
我建议不要手动投射,因为你可能很容易失去精度(例如,在推理过程中使用的 BatchNorm
统计数据中),除非你知道特定层的来龙去脉。
此外,您还可以检查 Google 中的 bfloat16
(大脑浮动)类型,它具有 float32
的 exponent
部分(8
位)和较小的分数。与 float16
相比,这允许它保持更大范围的值(例如,在计算梯度时),这允许人们避免 loss scaling
。
以上 (bfloat16
) 应该主要在 TPU 中有用,AFAIK NVidia GPU 对它的支持不是很好(如果我错了请纠正我)。一些信息here.