使用 TensorFlow 和 Bfloat16 加速第三代 Intel® Xeon® 可扩展处理器上的 AI 性能
2020 年 6 月 18 日
来自 Intel 的 Niranjan HasabnisMohammad Ashraf BhuiyanWei WangAG Ramesh 的客座文章
深度学习的快速发展推动了更复杂模型的开发,这些模型需要更强大的计算和内存能力。已经提出了一些低精度数字格式来解决这个问题。Google 的 bfloat16FP16: IEEE 半精度格式是两种最常用的 16 位格式。使用低精度格式的 混合精度 训练和推理已经被开发出来,以减少计算和带宽要求。

Bfloat16最初由 Google 开发,并在 TPU 中使用,使用一位表示符号位,八位表示指数位,七位表示尾数位。由于 bfloat16 与 FP16 相比具有更大的动态范围,因此 bfloat16 可用于直接表示梯度,而无需损失缩放。此外,已经 证明 使用 bfloat16 进行混合精度训练可以在使用与 FP32 相同次数的迭代且无需更改超参数的情况下,在多个模型上获得相同的最先进 (SOTA) 结果。

最近推出的第三代 Intel® Xeon® 可扩展处理器(代号为 Cooper Lake)采用 Intel® 深度学习加速,是第一个支持 bfloat16 格式的通用 x86 CPU。具体而言,在 Intel 深度学习加速中的 AVX512_BF16 扩展中添加了三个新的 bfloat16 指令:VCVTNE2PS2BF16、VCVTNEPS2BF16 和 VDPBF16PS。前两个指令允许在 bfloat16 数据类型之间进行转换,而最后一个指令执行 bfloat16 对的点积。有关详细信息,请参阅 Intel 发布的 硬件数值文档

英特尔与 TensorFlow 开发团队合作,增强 TensorFlow 以包含对 CPU 的 bfloat16 数据支持。我们很高兴地宣布,这些功能现在可以在 github.com 上的 Intel 优化版 TensorFlow 中使用。开发人员可以使用最新的 Intel 版 TensorFlow 在第三代 Intel Xeon 可扩展处理器上使用 bfloat16 执行其当前的 FP32 模型,只需更改少量代码即可。

使用 Intel 优化版 TensorFlow 中的 bfloat16。

现有的 TensorFlow 1 FP32 模型(或使用 v1 兼容模式的 TensorFlow 2 模型)可以轻松移植到使用 bfloat16 数据类型以在 Intel 优化版 TensorFlow 上运行。这可以通过 启用图重写传递(AutoMixedPrecisionMkl)来完成。重写优化传递将自动将某些操作转换为 bfloat16,同时将某些操作保留在 FP32 中以确保数值稳定性。此外,还可以按照 Google 提供的用于在 TPU 上运行的 说明 手动转换模型。但是,这种手动移植需要对模型有很好的理解,并且可能很麻烦且容易出错。

TensorFlow 2 具有 Keras 混合精度 API,允许模型开发人员在 GPU 和 TPU 上使用混合精度来训练 Keras 模型。我们目前正在努力在 Intel 优化版 TensorFlow 中为第三代 Intel Xeon 可扩展处理器支持此 API。此功能将在今年晚些时候在 TensorFlow 主分支中提供。一旦可用,我们建议用户使用 Keras API 而不是 grappler 传递,因为 Keras API 更灵活,支持 Eager 模式。

性能改进。

我们调查了在三个模型(ResNet50v1.5、BERT-Large(SQuAD)和 SSD-ResNet34)上使用 bfloat16 进行混合精度训练和推理的性能改进。ResNet50v1.5 是一种经过广泛测试的图像分类模型,已包含在 MLPerf 中,用于对不同硬件进行视觉工作负载的基准测试。BERT-Large(SQuAD)是一项微调任务,侧重于阅读理解,旨在回答给定文本/文档中的问题。SSD-ResNet34 是一种目标检测模型,使用 ResNet34 作为主干模型。

bfloat16 模型在具有 28 个核心* 的第三代 Intel Xeon 可扩展处理器的 4 插槽系统上进行了基准测试,并与具有 28 核心的第二代 Intel Xeon 可扩展处理器的 4 插槽系统的 FP32 性能进行了比较。


如上图所示,在具有 bfloat16 的第三代 Intel Xeon 可扩展处理器上使用混合精度训练模型的速度比在第二代 Intel Xeon 可扩展处理器上使用 FP32 精度快 1.7 倍到 1.9 倍。类似地,对于推理,使用 bfloat16 精度会导致性能提高 1.87 倍到 1.9 倍。

准确性和训练时间

除了性能测量之外,我们还对两个多插槽第三代 Intel Xeon 可扩展处理器系统* 上的三个深度学习模型进行了完全收敛测试。对于 BERT-Large(SQuAD)和 SSD-ResNet34,使用了 4 插槽 28 核系统。对于 ResNet50v1.5,我们使用了 8 插槽 28 核的第三代 Intel Xeon 可扩展处理器系统。模型首先使用 FP32 进行训练,并使用完全相同的超参数(学习率等)和批处理大小来训练使用混合精度的模型。
以上结果表明,来自三个不同用例(图像分类、语言建模和目标检测)的模型都能够使用相同的纪元数量达到 SOTA 准确率。对于 ResNet50v1.5,使用了标准 MLPerf 阈值 75.9% 的 top-1 准确率,bfloat16 和 FP32 都在第 84 个纪元(每 4 个纪元评估一次,评估偏移量为 0)达到了目标准确率。对于 BERT-Large(SQuAD)微调任务,bfloat16 和 FP32 都使用了两个纪元。SSD-ResNet34 在 60 个纪元内完成训练。随着运行时间的提高,使用 bfloat16 的总训练时间比使用 FP32 的训练时间快 1.7 倍到 1.9 倍。

Intel 优化版 TensorFlow 社区构建

Intel 优化版 TensorFlow 现在支持 Intel® 深度学习加速的新 bfloat16 功能,用于在 TensorFlow GitHub 主分支 中进行混合精度训练和低精度推理。有关 Intel 构建的更多信息,请 点击此处。本文中提到的模型以及以 bfloat16 和 FP32 模式运行模型的脚本可通过适用于 Intel 架构的模型库 (v1.6.1 或更高版本) 获得,您可以从 此处 下载并试用。[注意:要运行 bfloat16 模型,您需要使用 Intel Xeon 可扩展处理器 (Skylake) 或更高版本的 Intel Xeon 处理器。但是,要获得 bfloat16 模型的最佳性能,您需要使用第三代 Intel Xeon 可扩展处理器。]

结论

随着深度学习模型越来越大、越来越复杂,最新的第三代 Intel Xeon 可扩展处理器与 Intel 深度学习加速的新 bfloat16 格式的结合可以在第二代 Intel® Xeon® 可扩展处理器上实现高达 1.7 倍到 1.9 倍的性能提升,而不会损失任何精度。我们已经增强了 TensorFlow 的 Intel 优化版构建,以便开发人员可以轻松移植其模型以使用 bfloat16 进行混合精度训练和推理。此外,我们已经证明,自动转换的 bfloat16 模型不需要任何额外的超参数调整即可收敛;您可以使用与用于训练 FP32 模型相同的超参数集。

致谢

本文中展示的结果是包括 Intel TensorFlow 和 oneDNN 团队以及我们与 Google TensorFlow 团队的合作者在内许多人的工作成果。

来自 Intel - Jojimon Varghese、Xiaoming Cui、Md Faijul Amin、Niroop Ammbashankar、Mahmoud Abuzaina、Sharada Shiddibhavi、Chuanqi Wang、Yiqiang Li、Yang Sheng、Guizi Li、Teng Lu、Roma Dubstov、Tatyana Primak、Evarist Fomenko、Igor Safonov、Abhiram Krishnan、Shamima Najnin、Rajesh Poornachandran、Rajendrakumar Chinnaiyan。

来自 Google - Reed Wanderman-Milne、Penporn Koanantakool、Rasmus Larsen、Thiru Palaniswamy、Pankaj Kanwar。

*有关配置详细信息,请访问 www.intel.com/3rd-gen-xeon-configs

注意事项和免责声明

英特尔的编译器可能不会针对非英特尔微处理器优化到相同的程度,以实现并非英特尔微处理器独有的优化。这些优化包括 SSE2、SSE3 和 SSSE3 指令集以及其他优化。英特尔不保证非英特尔制造的微处理器上任何优化的可用性、功能或有效性。此产品中的依赖于微处理器的优化旨在与英特尔微处理器一起使用。某些并非特定于英特尔微架构的优化保留用于英特尔微处理器。有关本通知涵盖的特定指令集的更多信息,请参阅适用的产品用户和参考指南。
下一篇文章
Accelerating AI performance on 3rd Gen Intel® Xeon® Scalable processors with TensorFlow and Bfloat16

来自 Intel 的 Niranjan HasabnisMohammad Ashraf BhuiyanWei WangAG Ramesh 的客座文章
深度学习的快速发展推动了更复杂模型的开发,这些模型需要更强大的计算和内存能力。已经提出了一些低精度数字格式来解决这个问题。Google 的 bfloat16FP16: IEEE 半精度格式是两种最常用的 16 位格式。使用低精度格式的 混合精度 训练和推理已经被开发出来,以减少计算和带宽要求。