intelcloud
作者intelcloud·2021-09-28 14:08
intel中国·英特尔中国公司

Bfloat16 优化助力阿里云基于第三代英特尔® 至强® 可扩展处理器提升 BERT 模型性能

字数 6240阅读 1032评论 0赞 0

作者

阿里巴巴集团:Zhao Jiang,高级工程师;Li Ding,工程师;Hao Liang,高级工程师

英特尔公司:Pujiang He,软件架构师;Changqing Li,云软件工程师;

简介

BERT[1] 是阿里云人工智能 (AI) 平台的主要模型之一。在与人工智能相关的各类服务中,它被广泛用于自然语言处理 (NLP) 任务。阿里云希望通过降低延迟来提升用户体验。集成在第三代英特尔® 至强® 可扩展处理器中的英特尔® 深度学习加速技术支持全新 Brain Floating Point (bfloat16,BF16) 指令[2]。阿里云可利用这一性能优势,优化主要人工智能模型的推理性能,进而提升服务体验并降低总体拥有成本 (TCO)。

阿里云团队与英特尔工程师紧密合作,共同推进 BERT 推理优化。在进行 BF16 模型优化之前,我们已经完成了 FP32 BERT 模型优化,将多个 BERT 层融合成一个大算子。因此,这次我们以这一优化后的 FP32 解决方案作为性能基准,将重点放在 BF16 实现工作上。我们在考察研究中对优化后的 FP32 解决方案进行性能分析,结果表明有超过 80% 的热点函数使用了 FP32 MatMul,而这一情况同样适用于阿里云。这使其成为研究支持 BF16 的英特尔® 深度学习加速技术适用性的理想候选对象。支持 BF16 的英特尔® 深度学习加速技术可在将准确率影响降至最低与大幅提高吞吐量之间达成平衡。我们使用 BF16 MatMul 替代了 FP32 MatMul,并在集成英特尔® 深度学习加速技术的第三代英特尔® 至强® 可扩展处理器上使用 oneAPI 深度神经网络库 (oneDNN) 1.3 版本进行测试。结果表明,BF16 解决方案实现了 1.83 倍的增益。此外,在处理用于分类任务的 MRPC 数据集时,BF16 解决方案的准确率与 FP32 解决方案相同(两者对于代理模型的准确率均为 83.59%)。

基准:优化后的 Float32 Bert 模型

我们来快速了解一下当前的性能基准——优化后的 Float32 (FP32) 解决方案:阿里云 BERT 模型基于 google-research/bert[3] 的 12 层 BERT-Base 模型,我们选择 BERT-Base, Uncased:12-layer, 768-hidden, 12-heads, 110M parameters 作为对齐模型。

如图 1 所示,为了提高 BERT 模型的性能,我们首先使用“模型转换”将多层和多算子的复杂 BERT 模型替换为单个 BERT 算子。融合后的部分不但是总运行时中耗时最长的部分,还是不同标准 BERT 上的通用部分。因此我们还可以将其扩展到基于同一骨干网络的其他 BERT 模型。其次,为了在 TensorFlow/TensorFlow Serving 上执行高效的 BERT 算子,我们需要创建一个经过优化的内核,生成一个新的自定义 BERT 算子——它通过 C++ 实现算子融合和优化。

BERT 模型优化解决方案

BERT 模型优化解决方案

图 1.BERT 模型优化解决方案

在 TensorFlow 中,“前端”负责图形描述,“后端”负责执行算子。这样,我们就可以在前端将模型从原 BERT 模型转换为带 BERT 算子的新模型,在后端注册新 BERT 内核实现。因此,无需重装 TensorFlow 框架。我们只需加载实现 BERT 代码的动态库即可快速响应客户请求,并通过使用英特尔® 数学核心函数库(英特尔® MKL)、oneAPI 深度神经网络库 (oneDNN) 等高性能工具来尽可能提高基于第三代英特尔® 至强® 可扩展处理器的模型性能。

针对支持新算子的 TensorFlow,我们分析了 BERT 图以进行层融合及张量融合。图 2 显示了 12 层 BERT 中一层的详情。我们可以看到有三个张量(即查询、键和值)融合成一个算子(即 QKV MatMul & BiasAdd)。另外,我们省略带有大步长 MatMul 的转置算子来减少内存访问。对于经过优化的 FP32 解决方案上的 MatMul 和 BatchMatMul 算子,我们通过数学核心函数库 (MKL) 使用 SGEMM 函数来获得优化的 FP32 BERT 模型性能,并以此作为基准。

新 BERT 算子执行

新 BERT 算子执行

图 2.新 BERT 算子执行

Bfloat16 Bert 模型优化解决方案

以上文提到的经过优化的 FP32 BERT 解决方案为基准,我们发现对于 Bert,模型参数庞大且固定在推理过程中。如图 3 所示,BERT 的 FP32 MatMul 数据流图具有 FP32 权重和 FP32 输入。当我们分析优化后的 FP32 BERT 模型时,我们注意到推理过程中有超过 80% 的运行时都花在 MatMul 算子上。如何优化 MatMul 算子以减少延迟已成为十分严峻的挑战之一。

BERT 的 FP32 MatMul 数据流图

BERT 的 FP32 MatMul 数据流图

图 3. BERT 的 FP32 MatMul 数据流图

众所周知,减少内存访问、优化缓存同时提高并行度能够优化程序性能。如下方表 1 所示,得益于第三代英特尔® 至强® 可扩展处理器和英特尔® 深度学习加速技术 bfloat16 指令的加入,理论上我们可以将 BF16 的点积计算速度提高为 FP32 的 2 倍[2]。此外,我们可以将一、两个打包的浮点数转换为一个打包的 bfloat16 数,然后计算两个 bfloat16 对的点积,并将结果累加为一个浮点数。

表 1. 英特尔® 深度学习加速技术 bfloat16 指令

指令描述
VCVTNE2PS2BF16将两个打包的单精度数值转换为一个打包的 bfloat16 数值
VCVTNEPS2BF16将一个打包的单精度数值转换为一个打包的 bfloat16 数值
VDPBF16PS计算两个 bfloat16 对的点积,并将结果累加为一个打包的单精度数值

为了减少内存访问,我们尝试将 FP32 权重转换为 BF16 权重,如图 4 所示。我们将 FP32 权重转换为 BF16 权重,并以 BF16 MatMul 算子的形式将 BF16 权重缓存以供重复使用,并在每次并行执行时将 FP32 输入转换为 BF16 输入。然后,就可以使用 bfloat16 的点积(从 BF16 输入到 FP32 输出)来计算 MatMul 算子。这些实现都由 oneDNN 提供支持。因此,我们只需要创建一个新 BF16 MatMul 算子来替换优化后 FP32 解决方案(基准)的 MatMul 算子,之后就能实现比 FP32 优化解决方案更高的性能。

BERT 的 BF16 MatMul 数据流图

BERT 的 BF16 MatMul 数据流图

图 4. BERT 的 BF16 MatMul 数据流图

另一方面,对于 BF16 优化解决方案,我们可在通过简单的算子替换来提高性能的同时,尽可能保持高准确率[4]。对于 BiasAdd 算子,我们仍然保留 FP32 运算以减少对准确率的影响。

性能和准确率验证

为了对未优化的 TensorFlow v1.14 (Eigen)、优化后的 FP32 和优化后的 BF16 三种不同解决方案进行比较,我们使用相同的第三代英特尔® 至强® 可扩展处理器进行测试,结果如下方表 2 和表 3 所示。“默认”表示未优化的 TensorFlow* v1.14 (Eigen) 解决方案。

表 2. 硬件配置

默认、FP32 和 BF16 配置
平台WhiteCloudCity4S
节点数1
路数4
CPU第三代英特尔® 至强® 可扩展处理器
内核/路,线程/路24/48

显示更多

表 3. 软件配置

默认、FP32 和 BF16 配置
框架TensorFlow v1.14.0
拓扑阿里自定义 BERT
编译器gcc 8.3.1
库(包括版本),如9 MKL DNN 或 DAALEigen 3.3,MKL 2020.1.217 对比 oneDNN 1.3
数据集(大小,形状)MRPC
精度(FP32、INT8、BF16)FP32 对比 BF16
KMP 相似性粒度 = 精细、紧凑、1、0
NUMACTL0-23、24-47、48-71、72-95
OMP_NUM_THREADS24

收起

为了比较优化后的 FP32 Bert 和优化后的 BF16 Bert 之间的性能差异,我们将批处理样本数设置为 1,标记样本数设置为 128。这也与阿里云的在线业务保持一致。为了实现最低延迟,我们使用 24 核单路系统对每个 BERT 模型实例进行推理,输入是 TensorFlow v1.14 上的 MRPC 数据集。以延迟为 21.70ms 的优化后 FP32 解决方案作为基准。优化后的 BF16 解决方案的延迟为 11.83ms。与作为基准的优化后 FP32 解决方案相比,延迟性能提高了 1.83 倍,如表 4 所示。这些性能数据是整个模型中端到端的数据,因此颇具意义。

表 4. BERT 模型推理性能测试结果

BERT 模型平均延迟 (ms)
优化后的 FP32 解决方案21.70基准
优化后的 BF16 解决方案11.83提高 1.83 倍

为了评估优化后的 FP32 和优化后的 BF16 的准确率,我们在代理模型上以未优化的 TensorFlow v1.14 (Eigen) 解决方案为对比对象,使用 MRPC 数据集来测试准确率。结果如表 5 所示。与未优化的 TensorFlow v1.14 (Eigen) 解决方案相比,优化后的 FP32 和优化后的 BF16 解决方案的准确率并没有降低。

表 5. MRPC 数据集上的 BERT 模型准确率测试结果

BERT 模型Accuracy (Predict Correct/Total)
未优化的 TensorFlow v1.14 (Eigen) 解决方案83.59% (1442/1725)基准
优化后的 FP32 解决方案83.59% (1442/1725)无损失
优化后的 BF16 解决方案83.59% (1442/1725)无损失

结论

与优化后的 FP32 解决方案相比,第三代英特尔® 至强® 可扩展平台搭载的英特尔® 深度学习加速技术借助全新 bfloat16 功能,在不降低准确率的情况下,将 BERT 模型推理性能提高了 1.83 倍。阿里云预计这些性能提升将有助于为在线和离线 BERT 任务提速,进而提供更高效的服务。将来,阿里云工程团队希望将更多 FP32 算子转为 bfloat16 算子,以进一步提高性能。阿里云还希望这一优化解决方案可以扩展到其他业务,由此帮助提高公司业绩并满足客户需求。

[1] Bert:Pre-training of deep bidirectional transformers for language understanding(Bert:通过预训练深度双向变换器帮助理解语言)

[2] Leveraging the bfloat16 Artificial Intelligence Datatype For Higher-Precision Computations(利用 bfloat16 人工智能数据类型进行高精度计算)

[3] https://github.com/google-research/bert

[4] A study of bfloat16 for deep learning training(有关将 bfloat16 用于深度学习训练的研究)

配置详情

阿里云 PAI 自定义 BERT 在第三代英特尔® 至强® 可扩展处理器上的 TF1.14 延迟情况:

新平台:基于英特尔 2020 年 4 月 23 日进行的测试。4 路英特尔® 至强® 铂金 83xx(阿里定制 SKU)处理器,使用英特尔® 参考平台,24 核,启用超线程技术,启用睿频,总内存 384 GB(24 插槽/16 GB/2933 MHz),BIOS:WCCCPX6.RPB.0018.2020.0410.1316 (ucode:0x7000017),存储:英特尔® SSDPE2KX010T7,网卡:2 个英特尔® 以太网控制器 10G x550T,操作系统:CentOS 8.1, 4.18.0-147.5.1.el8_1.x86_64,深度学习框架:TF1.14 https://pypi.tuna.tsinghua.edu.cn/packages/4a/f4/e70311ed73205b12793660641e878810f94fca7d1a9dbb6be6148ec4f971/intel_tensorflow-1.14.0-cp36-cp36m-manylinux1_x86_64.whl,编译器:gcc 8.3.1,oneDNN 版本:DNNLv1.3,自定义 BERT(机密),BS=1,MRPC 数据,12 个实例/4 路,数据类型:BF16

基准平台:基于英特尔 2020 年 4 月 23 日进行的测试。4 路英特尔® 至强® 铂金 83xx(阿里定制 SKU)处理器,使用英特尔® 参考平台,24 核,启用超线程技术,启用睿频,总内存 384 GB(24 插槽/16 GB/2933 MHz),BIOS:WCCCPX6.RPB.0018.2020.0410.1316 (ucode:0x7000017),存储:英特尔® SSDPE2KX010T7,网卡:2 个英特尔® 以太网控制器 10G x550T,操作系统:CentOS 8.1, 4.18.0-147.5.1.el8_1.x86_64,深度学习框架:TF1.14 https://pypi.tuna.tsinghua.edu.cn/packages/4a/f4/e70311ed73205b12793660641e878810f94fca7d1a9dbb6be6148ec4f971/intel_tensorflow-1.14.0-cp36-cp36m-manylinux1_x86_64.whl,编译器:gcc 8.3.1,MKL 版本:2020.1.217,自定义 BERT(机密),BS=1,MRPC 数据,12 个实例/4 路,数据类型:FP32

一般提示和法律声明

性能测试中使用的软件和工作负荷可能仅在英特尔微处理器上进行了性能优化。
性能测试均系基于特定计算机系统、硬件、软件、操作系统及功能。上述任何要素的变动都有可能导致测试结果的变化。请参考其他信息及性能测试(包括结合其他产品使用时的运行性能)以对目标产品进行全面评估。更多信息,详见 www.intel.cn/benchmarks。
性能测试结果基于 2020 年 4 月 23 日进行的测试,且可能并未反映所有公开可用的安全更新。没有任何产品或组件是绝对安全的。 _您的成本和结果可能会有所不同。
英特尔技术可能需要支持的硬件、软件或服务得以激活。
_© 英特尔公司版权所有。英特尔、英特尔标识以及其他英特尔商标是英特尔公司或其子公司在美国和/或其他国家的商标。

如果觉得我的文章对您有用,请点赞。您的支持将鼓励我继续创作!

0

添加新评论0 条评论

Ctrl+Enter 发表

作者其他文章

相关文章

相关问题

相关资料

X社区推广