祝贺 PyTorch 基金会发布 PyTorch 2.0!在这篇博客中,我讨论了英特尔为 PyTorch 2.0 做出的四个重要贡献:
- TorchInductor
- GNN
- INT8 推理优化
- oneDNN 图形 API
我们在英特尔很高兴成为 PyTorch 社区的一员,并感谢 Meta 的同事们与我们共同开发这些功能时的合作与反馈。
让我们开始吧。
1. TorchInductor CPU FP32 推理优化
作为 PyTorch 2.0 编译栈的一部分,TorchInductor CPU 后端通过图编译在 PyTorch eager 模式之上带来了显著的性能提升。
通过利用 Intel® Extension for PyTorch 在 Conv/GEMM 操作中的后操作融合和权重预打包技术,以及 PyTorch ATen CPU 内核在基于 OpenMP*的线程并行化之上的显式向量化技术,TorchInductor CPU 后端得到了加速。对于内存绑定操作,使用了 PyTorch ATen CPU 内核。
在 TorchInductor 代码生成中的强大循环融合之上,我们实现了在三个代表性的深度学习基准测试(TorchBench、HuggingFace 和 timm1)上高达 1.7 倍的 FP32 推理性能提升。训练和低精度支持正在开发中。
查看改进
在这个 TouchInductor CPU 性能仪表板上跟踪了各种后端上的性能改进。
在 PyG 中改进图神经网络(GNN)的推理和训练性能
GNN 是分析图结构数据的有力工具。本功能旨在提高 GNN 在 Intel® CPU 上的推理和训练性能,包括新的第 4 代 Intel® Xeon®可扩展处理器。
PyTorch Geometric(PyG)是一个基于 PyTorch 构建的非常流行的库,用于执行 GNN 工作流程。目前,由于缺乏 GNN 相关的稀疏矩阵乘法操作(即 SpMM_reduce)以及缺乏针对 GNN 计算进行优化的几个关键内核级优化(scatter/gather 等),PyG 的 GNN 模型在 CPU 上运行缓慢。
为了解决这个问题,提供了相邻神经网络节点之间消息传递的优化:
- scatter_reduce:当边索引以坐标格式(COO)存储时的消息传递性能热点。
- gather:scatter_reduce 的反向计算,特别针对索引为展开张量的 GNN 计算进行了优化。
- torch.sparse.mm 与 reduce 标志:当边索引以压缩稀疏行(CSR)存储时的消息传递性能热点。支持的 reduce 标志为:sum、mean、amax、amin。
在《加速 PyG 在 Intel CPU 上的性能》一文中,讨论了在 3 代 Intel® Xeon®可扩展处理器 8380 平台和第 4 代 8480+平台上进行的推理和训练的端到端性能基准测试结果。
使用统一量化后端优化 x86 CPU 平台的 int8 推理
新的 X86 量化后端是 FBGEMM(Facebook 通用矩阵-矩阵乘法)和 oneAPI 深度神经网络库(oneDNN)后端的组合,并取代 FBGEMM 成为 x86 平台的默认量化后端。结果是:比 FBGEMM 更好的端到端 int8 推理性能。
用户默认使用 x86 量化后端访问 x86 平台,不同内核之间的选择在幕后自动完成。选择规则基于英特尔在功能开发期间进行的先前性能测试数据。因此,x86 后端取代 FBGEMM,可能提供更好的性能,具体取决于用例。
选择规则如下:
- 在没有 VNNI(例如,Intel® Core™ i7 处理器)的平台,始终使用 FBGEMM。
- 在具有 VNNI(例如,第 2-4 代 Intel® Xeon®可扩展处理器和未来平台)的平台:
- 对于线性操作,始终使用 FBGEMM。
- 对于卷积层,当层数超过 100 时使用 FBGEMM 进行深度卷积,否则使用 oneDNN。
注意,随着内核的不断进化。
上述选择规则将根据性能进行更改。统一 x86 后端与纯 FBGEMM 吞吐量加速比的性能指标在[RFC]统一量化后端用于 x86 CPU 平台#83888 中进行讨论。
利用 oneDNN Graph API 加速 CPU 上的推理
oneDNN Graph API 扩展了 oneDNN,提供了一个灵活的图 API,以最大化生成高效代码在 Intel® AI 硬件上的优化机会。它自动识别要加速融合的图分区。融合模式专注于融合计算密集型操作,如卷积、矩阵乘法及其相邻操作,适用于推理和训练用例。
目前支持 BFloat16 和 Float32 数据类型,并且只有推理工作负载可以优化。BF16 仅在具有 Intel®高级矢量扩展 512 (Intel® AVX-512) BF16 支持的机器上优化。
在 PyTorch 中支持新的 oneDNN Graph 融合/优化内核时,通常不需要或只需要很少的修改。要使用 oneDNN Graph,用户可以:
- 在 JIT 跟踪模型之前,使用 API torch.jit.enable_onednn_fusion(True)启用 oneDNN 融合,或者……
- 使用其上下文管理器,即使用 torch.jit.fuser(“fuser3”)。
- 为了加速 BFloat16 推理,我们依赖 PyTorch 的 eager-mode AMP(自动混合精度)支持并禁用 JIT 模式的 AMP。
请参阅 PyTorch 性能调优指南。
下一步
获取软件
尝试使用 PyTorch 2.0,并从这些英特尔贡献的特性中亲自体验性能优势。
我们鼓励您查看英特尔的其他 AI 工具和框架优化,并了解作为英特尔 AI 软件组合基础的开放、基于标准的 oneAPI 多架构、多厂商编程模型。
想了解更多关于第 4 代英特尔至强可扩展处理器的详细信息,请访问 AI 平台,在那里您可以了解英特尔如何赋能开发者运行高性能、高效的端到端 AI 管道。