亲手验证:如何充分激发 CPU 的 AI 加速潜能

文章来源:E 企研究院

BUILT IN - ARTICLE INTRO SECOND COMPONENT

黑格尔曾说:“没有冲突不成戏剧。” 观察一下现在的 AI 行业实践,可能有助于你理解这句话内味儿。


就在大家认为 AI 还只是个遥不可及的梦想时,深度学习技术的出现让大家重拾希望;当人们认为 AI 会在实验室里停留更长时间时,它已不声不响地走进了众多行业的实践;当大家还在争论,跑 AI,到底是 GPU 好,还是应该开发更多种类、更专用的 AI 加速芯片时,有人却说:“为什么不先试试 CPU 呢?”,真是戏剧性、转折感爆棚。

说出最后这句话的,正是 IT 圈儿的老朋友英特尔。

从 2017 年第一代至强可扩展处理器集成 AVX-512,开始基于 CPU 对 AI 训练和推理提供加速支持,到 2018 年第二代至强可扩展处理器在 AVX-512 技术之上扩展出深度学习加速技术,主打 INT8 推理加速,再到 2020 年面向多路服务器的第三代至强可扩展处理器新增 BF16 加速,开始兼顾推理和训练的加速,最后再到今年发布的面向单路和双路服务器的第三代至强可扩展处理器(Ice Lake)进一步强化 INT8 推理加速,将推理能力提升到上一代产品的 1.74 倍,这一套连贯的动作下来,足以证明英特尔 “用 CPU 跑 AI ” 并非口嗨。

图注:AVX-512 是英特尔推出的向量计算指令集,既兼顾了过去 SSE 指令集支持的计算类型,也扩展了更多功能,代号为 “Skylake” 的第一代英特尔至强可扩展处理器产品家族是首个全面支持 AVX-512 指令集的至强处理器产品线

图注:BF16(bfloat16)加速是面向多路服务器的第三代英特尔至强可扩展处理器的新增功能,其相比 INT8 和 FP32,在速度和准确性方面能实现更好的平衡

不少英特尔的客户也在说 “用 CPU 跑 AI 效果不错”。但作为极具折腾精神的 E 企研究院,我们更希望为大家亲手验证:
•    至强可扩展处理器,尤其是它最新一代产品,真的能为 AI 提供出色的加速效果么?
•    还有我们需要用什么样的 “姿势”,才能用好 CPU 的这项新能力?

E 企研究院这次用长城超云的双路服务器平台——Ice Lake 架构的第三代英特尔至强可扩展处理器——36 核心 72 线程的至强铂金 8360Y 处理器来进行验证。需要说明的是,这次测试只使用了单颗 CPU。

图注:用于本次测试的长城超云双路服务器,配备了 36 核心 72 线程的英特尔至强铂金 8360Y 处理器,并安装有 8 条 64GB 的 DDR4 2933 MHz 的 DRAM 内存,内存总容量为 512GB。它还支持 PCIe 4.0,可配备最新一代使用 PCIe 4.0 通道的 U.2(NVMe)固态盘,如英特尔的 D7 与 D5 系列产品


摸出底线

我们先来测试 CPU 在无特别优化的情况下,跑 AI 应用时的性能表现。

我们把自己代入成一家主要用 AI 做推理的企业,具体场景是基于训练好的模型,使用来自多个传感器收集的图像或语音数据做推理的过程,因此出场的模型,我们选中了经过预训练的 ResNet50 推理模型。

图注:用于本次测试的 ResNet50(v1.5)模型,是经过预训练的推理模型,可供用户下载使用

测试的主要流程是:在测试环境中安装 TensorFlow 2.5 版本,并使用主流的 ImageNet 2012 数据库,并将 CPU 设置为性能优先模式,然后运行 ResNet 50 推理模型。

结果是每秒处理超过 72 张图片,平均时延在 14ms 以内,这个……也太没吸引力了吧!

图注:让 CPU 处于性能优先模式下,运行原生版 TensorFlow 框架 ResNet50(v1.5)推理模型所获得的结果

先别急,CPU 运行 ResNet 50 推理模型的性能根本还没发挥出来呢。


优化动作开始

我们修改一下测试命令,同一个平台,吞吐性能超过每秒 172 张图片,时延也减少到 6ms 以内,性能一下提升到之前的 2.37 倍。

图注:划横线部分就是增加的代码,意思是启用 TensorFlow 中的 oneDNN 功能。oneDNN 全称为 oneAPI Deep Neural Network Library,即 oneAPI 深度神经网络库,它是从面向深度神经网络的英特尔数学核心函数库(Intel MKL-DNN)发展而来的,是一个开源平台(open-source cross-platform)性能库,主要用于深度学习应用程序,面向基于英特尔架构的处理器进行了优化,可充分利用其硬件加速特性提升运行 AI 应用的效率

一句简单的命令居然有这么大威力?原因何在?

秘密就是:即便是在原生版的 TensorFlow 中,英特尔也贡献了不少优化代码,其中很多都是来自 oneDNN,这是英特尔开发和开源的面向深度神经网络的数学核心函数库,包含了高度矢量化和线程化的构建模块,可帮助深度神经网络调优,来充分利用英特尔架构 CPU 集成的 AI 加速能力。上面这句命令的作用就是开启了 oneDNN 的优化功能,可大大提升 CPU 运行 AI 推理类应用的效率。

图注:oneDNN 的主要概念包括原语(primitives),引擎(engines),流(streams)和内存对象(memory objects)。针对基元和内存对象具有多个抽象级别,从而为用户提供更高灵活性


再进一步会怎样

还有更多、更神奇的功能吗?

接下来,我们使用英特尔自己发布的,专门且更为全面地面向英特尔架构优化的 TensorFlow 框架,切换到这个环境再来运行 ResNet 50 推理模型。

性能果然又有提升,又涨了约 17%。

图注:在面向英特尔架构优化的 TensorFlow 框架上运行 ResNet50(v1.5)推理模型,吞吐性能提升到每秒超 202 张图像,平均时延不到 5ms。这种充分优化后的 TensorFlow 框架及模型库(model zoo)都已开源在 GitHub 上,任何人都可下载使用。安装和使用方式与原生 TensorFlow 并无区别

让我们再算算:与最开始的、未经优化的 TensorFlow 环境相比,在面向英特尔架构优化的 TensorFlow 框架的加持下,运行 ResNet 50 的推理性能,已达到前者的 2.77 倍以上。

上述三轮测试考验的,都是 ResNet 50 模型在全新第三代至强可扩展处理器上运行时的 FP32 性能。不难看出,只要优化动作到位,性能提升也会立即到位,况且这还只是单颗 CPU 的性能表现。

这意味着,企业用户基本不需要对既有的 IT 基础设施做大的改动,也不需要急着导入异构,只要你现在用的 CPU 是至强可扩展处理器,那么,你就具备了执行 AI 推理的主要条件。


再放大招,大大招

你以为这就结束了么?并没有,接下来才是大招。

我们将开始在 CPU 上执行 INT8 推理加速的测试。由于很多企业在使用 AI 推理时,并不需要 FP32 这么高的精度,我们可以把数据格式转变为 INT8,在确保准确率不明显下降的情况下,看看性能会发生怎样的变化。

这轮测试我们必须要激活英特尔深度学习加速,也就是 DL Boost 技术中的 INT8 加速功能,同样基于面向英特尔架构优化的 TensorFlow 框架。结果是,时延降至 3ms 内,吞吐则超过了每秒 391 张图片。

图注:在面向英特尔架构优化的 TensorFlow 中使用 ResNet50(v1.5) 运行 INT8 推理的结果

终于,我们迎来了最后一轮测试。由于上面多轮测试都在考虑单路推理的性能,而在实际应用中,很多用户都会跑多路推理,那么在这种情况下,用户更希望在可接受的时延水平——譬如 30ms 上下——尽可能提升吞吐性能。

这组测试中我们使用的至强铂金 8360Y 处理器终于火力全开,单颗 CPU 36 个物理核心对应 36 个 INT8 实例。

结果是:平均时延约为 27ms,但总计吞吐能力超过每秒 1300 张图片,这意味着用户真的能用可接受的时延提升,换回 3 倍以上的性能输出,多核威力有目共睹。

图注:使用 36 个 INT8 实例并行运行(所使用的英特尔至强铂金 8360Y 处理器具有 36 核心,每核心运行一个 INT8 实例)的测试结果

要知道,直到现在我们使用的都是单颗至强铂金 8360Y 处理器,如果在一个双路服务器中采用两颗全上的策略,那么性能理论上是能够翻倍,可见英特尔官宣的 AI 加速性能指标绝非空穴来风。

看到这里,你对至强 CPU 的 AI 加速能力是否有了更为直观的体验呢?你是否也有使用 CPU 加速 AI 应用的独到经验或问题呢?欢迎大家和我们分享,也欢迎大家一起动手探索验证。