使用 ZenDNN 库在 AMD EPYC™ 处理器上实现最佳推理性能
2023 年 3 月 29 日

AMD 发布的 Sarina Sit

AMD 于 2022 年 11 月推出了第 4 代 AMD EPYC™ 处理器。第 4 代 AMD EPYC 处理器包含许多硬件改进,例如 AVX-512 和 VNNI 指令集扩展,这些扩展非常适合提高推理性能。但是,硬件只是拼图的一部分;软件是有效利用底层硬件的关键组件。

我们很高兴宣布 TensorFlow v2.12 及更高版本的新 TensorFlow-ZenDNN 插件现已推出,这体现了 AMD 不断努力通过框架上游将 ZenDNN 优化功能更方便地提供给社区。此插件支持 AMD EPYC CPU 上使用 AMD ZenDNN 库进行神经网络推理。 

ZenDNN 

ZenDNN 可以在 GitHub以开源形式获得,是一个低级别 AMD 深度神经网络库,其中包含针对 AMD EPYC CPU 优化的基本神经网络构建块。ZenDNN 旨在帮助深度学习应用程序和框架开发人员在各种工作负载(包括计算机视觉、自然语言处理和推荐系统)中提高 AMD EPYC CPU 上的推理性能。

TF-ZenDNN 

为了便于使用,我们已将 ZenDNN 集成到高级 AI 框架中。我们与 TensorFlow 的原型集成称为 TF-ZenDNN,是通过在特定版本处派生 TensorFlow 存储库并直接修改 TensorFlow 代码来完成的。TF-ZenDNN 可作为二进制包从 AMD 的 ZenDNN 开发人员资源页面(下图 1)获得,安装说明可在我们的 TensorFlow + ZenDNN 用户指南 中找到。

AMD Zen Deep Neural Network (ZenDNN) Resources page
图 1. 我们 ZenDNN 开发人员资源页面上提供的 ZenDNN v4.0 二进制包在本博客中称为我们的 TF-ZenDNN 直接集成版本。

TF-ZenDNN 在网络级别优化图形,并在库级别提供经过调整的基元实现,包括卷积、MatMul、逐元素运算和池化(最大值和平均值)。我们已经在各种神经网络模型中看到了性能优势,包括下图 1 中橙色线所示的卷积神经网络范围。 使用 ZenDNN AI 推理库优化腾讯的 AI 应用程序TF-ZenDNN 对 TinyDefectNet 的影响 分别展示了 ZenDNN 的高性能及其与 TensorFlow 的集成。 

AMD Zen Deep Neural Network (ZenDNN) Resources page
图 1. TensorFlow-ZenDNN 插件 v0.1 和 TF-ZenDNN 直接集成 v4.0 与 TF-vanilla(无 ZenDNN)相比的性能提升。随着 TensorFlow-ZenDNN 插件不断添加优化,性能提升程度预计将与 TF-ZenDNN 直接集成相当。请参阅本博客末尾的脚注 ZD-045 到 ZD-051。

TensorFlow-ZenDNN 插件 

如上面部分所述,TF-ZenDNN 直接集成(以二进制形式)需要对 TensorFlow 代码进行重大更改。将这些更改上游到 TensorFlow 存储库将很繁琐且不可持续。TensorFlow v2.5 提供了一种 可插拔设备机制,该机制支持以模块化、即插即用的方式集成特定于设备的代码。AMD 在为 AMD EPYC CPU 实现 **TensorFlow-ZenDNN 插件** 时采用了可插拔设备机制。TensorFlow-ZenDNN 插件通过其内核和操作注册 C API(下图 2)将特定于 AMD EPYC CPU 的自定义内核实现和操作添加到 TensorFlow 中。

AMD Zen Deep Neural Network (ZenDNN) Resources page
图 2. 上游到 TFv2.12 的 TensorFlow-ZenDNN 插件支持添加 AMD 开发的自定义内核和操作,以提高 AMD EPYC 处理器上的性能。

TensorFlow-ZenDNN 插件与 TF-ZenDNN 直接集成之间的主要区别在于与标准 TensorFlow 包的兼容性。TF-ZenDNN 直接集成是一个独立的软件包,它会替换标准 TensorFlow 包。TensorFlow-ZenDNN 插件是一个补充软件包,需要与从 TF 版本 2.12 开始的标准 TensorFlow 包一起安装。

从 TensorFlow 开发人员的角度来看,与 TF-ZenDNN 直接集成方法相比,TensorFlow-ZenDNN 插件方法简化了利用 ZenDNN 优化的过程。使用 TF-ZenDNN 直接集成,开发人员需要下载基础 TensorFlow 构建,然后单独导航到 AMD ZenDNN 开发人员资源页面以下载用于集成的特定 TF-ZenDNN 二进制文件。相反,使用 TensorFlow-ZenDNN 插件方法,用户利用 ZenDNN 所需的一切都位于 TensorFlow 页面上,如下一节“在 AMD EPYC 处理器上使用 ZenDNN 的分步指南”中所述。

TensorFlow-ZenDNN 插件在其第一个版本(v0.1)中目前提供 16 个常见的 ZenDNN 操作,包括 Conv2D、MatMul、BatchMatMul、FusedBatchNorm、AvgPool 和 MaxPool。未涵盖的其他操作将回退到 TensorFlow 的本机内核。TensorFlow-ZenDNN 插件为 ResNet、Inception 和 VGG 变体等模型提供了与 TF-ZenDNN 直接集成软件包相当的性能,如上图 1 所示,蓝色条代表 TensorFlow-ZenDNN 插件性能,橙色线代表 TF-ZenDNN 直接集成性能。但是,对于 MobileNet 和 EfficientNet 等其他模型,TF-ZenDNN 直接集成仍然优于插件,因为插件尚不支持目前 TF-ZenDNN 直接集成软件包中包含的图形优化。预计一旦 TensorFlow-ZenDNN 插件的功能与 TF-ZenDNN 直接集成相当,性能将更加接近。

在 AMD EPYC 处理器上使用 ZenDNN 的分步指南
在 AMD EPYC 处理器上 

在 TensorFlow 中利用 ZenDNN 优化非常简单:  

1. 从 TensorFlow 社区支持的构建网页 下载 ZenDNN 插件 CPU 轮子文件。

2. 使用以下命令安装 ZenDNN 插件

pip install tensorflow-cpu==2.12.0 

pip install tensorflow_zendnn_plugin-0.1.0-cp38-cp38-manylinux_2_17_x86_64.manylinux2014_x86_64.whl

 
3. 通过设置以下环境变量,在推理流程中启用 ZenDNN 优化

export TF_ENABLE_ZENDNN_OPTS=1

export TF_ENABLE_ONEDNN_OPTS=0

要禁用推理执行中的 ZenDNN 优化,可以将相应的 ZenDNN 环境变量设置为 0

export TF_ENABLE_ZENDNN_OPTS=0.  

TensorFlow-ZenDNN 插件支持 ZenDNN v3.3。请参阅 TensorFlow-ZenDNN 插件用户指南 第 5 章,了解性能调整指南。 

为了获得最佳推理性能,AMD 建议使用 AMD ZenDNN 开发人员资源页面 上提供的 TF-ZenDNN 直接集成二进制文件。 

ZenDNN 的未来发展 

TensorFlow v2.12 标志着我们 TensorFlow-ZenDNN 插件的第一个版本。AMD 打算通过在后续 TensorFlow-ZenDNN 插件版本中支持更多 ZenDNN 操作、图形优化和量化,继续提高 TensorFlow-ZenDNN 插件在当前和下一代 AMD EPYC 处理器上的性能。这些增强功能包括计划将插件版本从 ZenDNN v3.3 过渡到 ZenDNN v4.0,以启用利用第 4 代 EPYC 处理器中 AVX-512 和 VNNI 功能的优化。

我们致力于不断为社区改进 TensorFlow-ZenDNN 插件,鼓励 TensorFlow 开发人员测试这款全新的 TensorFlow-ZenDNN 插件,并在我们的 ZenDNN GitHub 页面上分享意见和问题。可以通过以下电子邮件地址联系技术支持资源: [email protected].

我们很高兴能继续与 TensorFlow 合作,为更广泛的 TensorFlow 开发人员社区改进 ZenDNN 体验!

致谢

TensorFlow-ZenDNN 插件的开发和上游是 AMD 和 Google TensorFlow 团队中许多人的共同努力。

**来自 AMD 的人员:**Chandra Kumar Ramasamy、Aakar Dwivedi、Savan Anadani、Arun Ramachandran、Avinash-Chandra Pandey、Ratan Prasad、Aditya Chatterjee、Alok Ranjan Srivastava、Prakash Raghavendra、Pradeep Kumar Sinha、Vincent Dee。

**来自 Google 的人员:**Penporn Koanantakool、Eugene Zhulenev、Douglas Yarrington。

法律脚注

ZD-045 到 ZD-051

测试由 AMD 性能实验室于 2023 年 2 月 7 日星期二在包含以下内容的测试系统上进行

AMD 系统:AMD EPYC™ 9004 96 核处理器的 AMD 工程样品,双插槽,超线程开启,CPU 频率 2150 MHz(最大 3700 MHz),768GB RAM,768MB L3 缓存,NPS1 模式,Ubuntu® 20.04.5 LTS 版本,内核版本 5.4.0-131-generic,BIOS TQZ1000F,GCC/G++ 版本 11.1.0,GNU ID 2.31,Python 3.8.15。对于无 ZenDNN,Tensorflow 2.12。对于 ZenDNN 插件,AOCL BLIS 3.0.6,Tensorflow 2.12,ZenDNN 版本 3.3;对于直接集成,AOCL BLIS 4.0,Tensorflow 版本 2.10,ZenDNN 4.0。

所有测试都来自 Unified Inference Frontend 1.1 (UIF1.1) 模型动物园

  • FP32 EfficientNet
  • FP32 Inception v3
  • FP32 MobileNet v1
  • FP32 VGG16
  • FP32 RefineDet
  • FP32 BERT Base
  • FP32 ResNet50

结果可能因软件版本和 BIOS 设置等因素而异。ZD-045 到 ZD-051

下一篇文章
Enabling Optimal Inference Performance on AMD EPYC™ Processors with the ZenDNN Library

AMD 发布的 Sarina Sit AMD 于 2022 年 11 月推出了第四代 AMD EPYC™ 处理器。第四代 AMD EPYC 处理器包含许多硬件改进,例如 AVX-512 和 VNNI 指令集扩展,这些扩展非常适合提高推理性能。但是,硬件只是拼图的一部分;软件是有效利用底层硬件的关键组件……