现代 Intel® 架构上的 TensorFlow 优化
本文面向人工智能(AI)社区介绍在基于 Intel® Xeon® 和 Intel® Xeon Phi™ 处理器的平台上对 TensorFlow 进行的优化。
Intel:Elmoustapha Ould-Ahmed-Vall, Mahmoud Abuzaina, Md Faijul Amin, Jayaram Bobba, Roman S Dubtsov, Evarist M Fomenko, Mukesh Gangadhar, Niranjan Hasabnis, Jing Huang, Deepthi Karkada, Young Jin Kim, Srihari Makineni, Dmitri Mishura, Karthik Raman, AG Ramesh, Vivek V Rane, Michael Riera, Dmitry Sergeev, Vamsi Sripathi, Bhavani Subramanian, Lakshay Tokas, Antonio C Valles
Google:Andy Davis, Toby Boyd, Megan Kacholia, Rasmus Larsen, Rajat Monga, Thiru Palanisamy, Vijay Vasudevan, Yao Zhang
TensorFlow* 是领先的深度学习和机器学习框架,因此确保其能够充分发挥 Intel 硬件的性能对 Intel 和 Google 都至关重要。本文面向人工智能(AI)社区介绍在基于 Intel® Xeon® 和 Intel® Xeon Phi™ 处理器的平台上对 TensorFlow 进行的优化。这些优化是 Intel 和 Google 工程师密切合作的成果,Intel 的 Diane Bryant 和 Google 的 Diane Green 在首届 Intel AI Day 上宣布了此次合作。
我们描述了在此优化过程中遇到的各种性能挑战以及所采取的解决方案。我们还报告了在常见神经网络模型样本上的性能改进。这些优化可以带来数量级的性能提升。例如,我们的测量数据显示,在 Intel® Xeon Phi™ 处理器 7250 (KNL) 上,训练性能最高可提高 70 倍,推理性能最高可提高 85 倍。基于 Intel® Xeon® 处理器 E5 v4 (BDW) 和 Intel Xeon Phi 处理器 7250 的平台为 Intel 的下一代产品奠定了基础。特别是,预计用户将在今年晚些时候推出的 Intel Xeon(代号 Skylake)和 Intel Xeon Phi(代号 Knights Mill)上看到性能的提升。
在现代 CPU 上优化深度学习模型的性能面临许多挑战,这些挑战与优化高性能计算(HPC)领域其他性能敏感型应用时遇到的挑战大同小异。
- 需要进行代码重构以利用现代矢量指令。这意味着要确保所有关键的原始操作(例如卷积、矩阵乘法和批量归一化)都已矢量化为最新的 SIMD 指令(Intel Xeon 处理器为 AVX2,Intel Xeon Phi 处理器为 AVX512)。
- 要获得最佳性能,需要特别注意高效地利用所有可用核心。这同样意味着要关注单个层或操作内部的并行化,以及跨层之间的并行化。
- 数据必须尽可能在执行单元需要时可用。这意味着要平衡地使用预取、缓存阻塞技术以及能够促进空间和时间局部性的数据格式。
为了满足这些要求,Intel 开发了许多优化的深度学习原始操作,这些操作可以在不同的深度学习框架中使用,以确保我们能够高效地实现通用构建块。除了矩阵乘法和卷积之外,这些构建块还包括:
- 直接批量卷积
- 内积
- 池化:最大值、最小值、平均值
- 归一化:跨通道局部响应归一化(LRN)、批量归一化
- 激活:ReLU(整流线性单元)
- 数据操作:多维转置(转换)、分割、拼接、求和和缩放。
有关这些 Intel® Math Kernel Library for Deep Neural Networks (Intel® MKL-DNN) 优化原始操作的更多详细信息,请参阅此文章。
在 TensorFlow 中,我们实现了 Intel 优化的操作版本,以确保这些操作尽可能利用 Intel MKL-DNN 原始操作。虽然这是在 Intel® 架构上实现可扩展性能的必要步骤,但我们也必须实施许多其他优化。特别是,出于性能考虑,Intel MKL 使用与 TensorFlow 默认布局不同的布局。我们需要确保两种格式之间的转换开销尽可能小。我们还希望确保数据科学家和其他 TensorFlow 用户不必更改其现有的神经网络模型即可利用这些优化。
图优化
我们引入了多种图优化流程,以
- 在 CPU 上运行时,将默认 TensorFlow 操作替换为 Intel 优化的版本。这确保了用户无需更改其神经网络模型即可运行现有的 Python 程序并获得性能提升。
- 消除不必要且昂贵的数据布局转换。
- 融合多个操作,以实现 CPU 上的高效缓存重用。
- 处理允许更快的反向传播的中间状态。
这些图优化能够在不给 TensorFlow 程序员带来任何额外负担的情况下实现更高的性能。数据布局优化是一项关键的性能优化。通常,对于 CPU 上的某些张量操作,原生 TensorFlow 数据格式并非最高效的数据布局。在这种情况下,我们会插入一个数据布局转换操作,将数据从 TensorFlow 的原生格式转换为内部格式,在 CPU 上执行操作,然后将操作输出转换回 TensorFlow 格式。然而,这些转换会引入性能开销,应尽量减少。我们的数据布局优化识别出可以使用 Intel MKL 优化操作完全执行的子图,并消除了子图内操作之间的转换。自动插入的转换节点负责子图边界处的数据布局转换。另一项关键优化是融合流程,它会自动融合可以作为单个 Intel MKL 操作高效运行的操作。
其他优化
我们还调整了许多 TensorFlow 框架组件,以在各种深度学习模型上实现最高的 CPU 性能。我们利用 TensorFlow 中现有的池分配器开发了一个自定义池分配器。我们的自定义池分配器确保 TensorFlow 和 Intel MKL 共享相同的内存池(使用 Intel MKL imalloc 功能),并且我们不会过早地将内存返回给操作系统,从而避免了昂贵的页面错误和页面清除。此外,我们仔细调整了多个线程库(TensorFlow 使用的 pthreads 和 Intel MKL 使用的 OpenMP),使其能够共存,而不是相互竞争 CPU 资源。
性能实验
我们进行的优化(如上所述)在 Intel Xeon 和 Intel Xeon Phi 平台上都带来了显著的性能提升。为了说明性能提升,我们在此报告了我们最好的已知方法(BKM)以及三个常见ConvNet 基准测试的基线和优化性能数据。
- 以下参数对于 Intel Xeon(代号 Broadwell)和 Intel Xeon Phi(代号 Knights Landing)处理器上的性能至关重要,我们建议根据您的特定神经网络模型和平台进行调整。我们已仔细调整了这些参数,以在 Intel Xeon 和 Intel Xeon Phi 处理器上获得 convnet-benchmarks 的最佳性能。
- 数据格式:我们建议用户为其特定神经网络模型指定 NCHW 格式以获得最佳性能。TensorFlow 默认的 NHWC 格式并非 CPU 的最高效数据布局,它会导致一些额外的转换开销。
- 跨操作/操作内:我们也建议数据科学家和用户试验 TensorFlow 中的操作内和跨操作参数,以针对每个模型和 CPU 平台找到最佳设置。这些设置会影响单个层内的并行化以及跨层的并行化。
- 批处理大小:批处理大小是另一个重要参数,它会影响用于利用所有核心的可用并行性、工作集大小以及总体内存性能。
- OMP_NUM_THREADS:最佳性能要求高效地使用所有可用核心。此设置对于 Intel Xeon Phi 处理器上的性能尤其重要,因为它控制着超线程级别(1 到 4)。
- 矩阵乘法中的转置:对于某些矩阵大小,转置第二个输入矩阵 b 可在 Matmul 层中提供更好的性能(更好的缓存重用)。这适用于下面三个模型中使用的所有 Matmul 操作。用户应尝试为其他矩阵大小调整此设置。
- KMP_BLOCKTIME:用户应尝试各种设置,以确定每个线程在完成并行区域执行后应等待多长时间(以毫秒为单位)。
Intel® Xeon® 处理器(代号 Broadwell - 2 路 - 22 核)上的示例设置
Intel® Xeon Phi™ 处理器(代号 Knights Landing - 68 核)上的示例设置
- Intel® Xeon® 处理器(代号 Broadwell – 2 路 – 22 核)上的性能结果
- Intel® Xeon Phi™ 处理器(代号 Knights Landing – 68 核)上的性能结果
- 在 Intel® Xeon® 处理器(代号 Broadwell)和 Intel® Xeon Phi™ 处理器(代号 Knights Landing)上具有不同批处理大小的性能结果 - 训练
使用 CPU 优化构建和安装 TensorFlow
- 从 TensorFlow 源代码目录运行 "./configure",如果您选择使用 Intel MKL 的选项,它将自动在 _tensorflow/third_party/mkl/mklml_ 中下载最新的 Intel MKL 以用于机器学习。
- 执行以下命令创建可用于安装优化 TensorFlow 版本的 pip 包。
- PATH 可更改为指向特定版本的 GCC 编译器
export PATH=/PATH/gcc/bin:$PATH - LD_LIBRARY_PATH 也可更改为指向新的 GLIBC
export LD_LIBRARY_PATH=/PATH/gcc/lib64:$LD_LIBRARY_PATH。 - 为 Intel Xeon 和 Intel Xeon Phi 处理器构建以获得最佳性能
bazel build --config=mkl --copt="-DEIGEN_USE_VML" -c opt //tensorflow/tools/pip_package
build_pip_package
- PATH 可更改为指向特定版本的 GCC 编译器
- 安装优化的 TensorFlow wheel
- bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/path_to_save_wheel
pip install --upgrade --user ~/path_to_save_wheel /wheel_name.whl
- bazel-bin/tensorflow/tools/pip_package/build_pip_package ~/path_to_save_wheel
系统配置
对 AI 的意义
优化 TensorFlow 意味着使用这个广泛可用且应用广泛的框架构建的深度学习应用程序现在可以在 Intel 处理器上运行得更快,从而提高灵活性、可访问性和可扩展性。例如,Intel Xeon Phi 处理器专为跨核心和节点近乎线性的扩展而设计,可显著缩短训练机器学习模型的时间。随着我们不断提升 Intel 处理器的性能以应对更大、更具挑战性的 AI 工作负载,TensorFlow 也能随着未来性能的提升而扩展。
Intel 和 Google 合作优化 TensorFlow 是使 AI 更易于开发人员和数据科学家使用的持续努力的一部分,并使 AI 应用程序能够在任何需要的地方运行,涵盖从边缘到云的任何设备。Intel 认为这是创建下一代 AI 算法和模型以解决商业、科学、工程、医学和社会领域最紧迫问题的关键。
此次合作已经为领先的 Intel Xeon 和 Intel Xeon Phi 处理器平台带来了显著的性能提升。这些改进现已通过Google 的 TensorFlow GitHub 仓库提供。我们呼吁 AI 社区试用这些优化,并期待反馈和在此基础上进行的贡献。