是否可以使用 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(大脑浮动)类型,它具有 float32exponent 部分(8 位)和较小的分数。与 float16 相比,这允许它保持更大范围的值(例如,在计算梯度时),这允许人们避免 loss scaling

以上 (bfloat16) 应该主要在 TPU 中有用,AFAIK NVidia GPU 对它的支持不是很好(如果我错了请纠正我)。一些信息here.