由英特尔提供

祝贺 PyTorch 基金会发布 PyTorch 2.0!在这篇博客中,我讨论了英特尔为 PyTorch 2.0 做出的四个重要贡献:

  1. TorchInductor
  2. GNN
  3. INT8 推理优化
  4. 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 管道。

PyTorch 资源