2023 年 3 月 29 日 — AMD 发布的 Sarina Sit AMD 于 2022 年 11 月推出了第四代 AMD EPYC™ 处理器。第四代 AMD EPYC 处理器包含许多硬件改进,例如 AVX-512 和 VNNI 指令集扩展,这些扩展非常适合提高推理性能。但是,硬件只是拼图的一部分;软件是有效利用底层硬件的关键组件……
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 可以在 GitHub上以开源形式获得,是一个低级别 AMD 深度神经网络库,其中包含针对 AMD EPYC CPU 优化的基本神经网络构建块。ZenDNN 旨在帮助深度学习应用程序和框架开发人员在各种工作负载(包括计算机视觉、自然语言处理和推荐系统)中提高 AMD EPYC CPU 上的推理性能。
为了便于使用,我们已将 ZenDNN 集成到高级 AI 框架中。我们与 TensorFlow 的原型集成称为 TF-ZenDNN,是通过在特定版本处派生 TensorFlow 存储库并直接修改 TensorFlow 代码来完成的。TF-ZenDNN 可作为二进制包从 AMD 的 ZenDNN 开发人员资源页面(下图 1)获得,安装说明可在我们的 TensorFlow + ZenDNN 用户指南 中找到。
图 1. 我们 ZenDNN 开发人员资源页面上提供的 ZenDNN v4.0 二进制包在本博客中称为我们的 TF-ZenDNN 直接集成版本。 |
TF-ZenDNN 在网络级别优化图形,并在库级别提供经过调整的基元实现,包括卷积、MatMul、逐元素运算和池化(最大值和平均值)。我们已经在各种神经网络模型中看到了性能优势,包括下图 1 中橙色线所示的卷积神经网络范围。 使用 ZenDNN AI 推理库优化腾讯的 AI 应用程序 和 TF-ZenDNN 对 TinyDefectNet 的影响 分别展示了 ZenDNN 的高性能及其与 TensorFlow 的集成。
图 1. TensorFlow-ZenDNN 插件 v0.1 和 TF-ZenDNN 直接集成 v4.0 与 TF-vanilla(无 ZenDNN)相比的性能提升。随着 TensorFlow-ZenDNN 插件不断添加优化,性能提升程度预计将与 TF-ZenDNN 直接集成相当。请参阅本博客末尾的脚注 ZD-045 到 ZD-051。 |
如上面部分所述,TF-ZenDNN 直接集成(以二进制形式)需要对 TensorFlow 代码进行重大更改。将这些更改上游到 TensorFlow 存储库将很繁琐且不可持续。TensorFlow v2.5 提供了一种 可插拔设备机制,该机制支持以模块化、即插即用的方式集成特定于设备的代码。AMD 在为 AMD EPYC CPU 实现 **TensorFlow-ZenDNN 插件** 时采用了可插拔设备机制。TensorFlow-ZenDNN 插件通过其内核和操作注册 C API(下图 2)将特定于 AMD EPYC CPU 的自定义内核实现和操作添加到 TensorFlow 中。
图 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 直接集成相当,性能将更加接近。
在 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 直接集成二进制文件。
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) 模型动物园
结果可能因软件版本和 BIOS 设置等因素而异。ZD-045 到 ZD-051