跳转到主要内容
博客

用新性能特性庆祝 PyTorch 2.0,面向 AI 开发者

作者: 2023 年 4 月 7 日2024 年 11 月 14 日暂无评论

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

  1. TorchInductor
  2. GNN
  3. INT8 推理优化
  4. oneDNN Graph API

我们英特尔很高兴能成为 PyTorch 社区的一员,并感谢与 Meta 同事在共同开发这些功能方面的协作和反馈。

让我们开始吧。

1. TorchInductor CPU FP32 推理优化

作为 PyTorch 2.0 编译堆栈的一部分,TorchInductor CPU 后端优化通过图编译显著提升了 PyTorch 即时模式的性能。

TorchInductor CPU 后端通过利用 Intel® Extension for PyTorch 的技术,加速了 Conv/GEMM 操作的后处理融合和权重预打包,并利用 PyTorch ATen CPU 内核对内存密集型操作进行显式向量化,同时采用基于 OpenMP* 的线程并行化。

通过这些优化以及 TorchInductor 代码生成中强大的循环融合,我们在 TorchBench、HuggingFace 和 timm1 这三个代表性深度学习基准测试中,FP32 推理性能提升了高达 1.7 倍。训练和低精度支持正在开发中。

查看改进

各项后端上的性能改进都在这个 TouchInductor CPU 性能仪表板上进行跟踪。

改进 PyG 中 GNN 的 CPU 推理和训练性能

GNN 是分析图结构数据的强大工具。此功能旨在提高 Intel® CPU(包括新的第四代 Intel® Xeon® 可扩展处理器)上 GNN 的推理和训练性能。

PyTorch Geometric (PyG) 是一个非常流行的基于 PyTorch 构建的库,用于执行 GNN 工作流。目前在 CPU 上,由于缺乏 GNN 相关的稀疏矩阵乘法操作(即 SpMM_reduce)以及缺乏针对 GNN 计算优化的几个关键内核级优化(散布/聚集等),PyG 的 GNN 模型运行缓慢。

为了解决这个问题,我们对相邻神经网络节点之间的消息传递进行了优化

  • scatter_reduce:当边缘索引以坐标格式 (COO) 存储时,消息传递中的性能热点。
  • gather:scatter_reduce 的反向计算,专门针对索引为扩展张量时的 GNN 计算进行调优。
  • torch.sparse.mm with reduce flag:当边缘索引以压缩稀疏行 (CSR) 存储时,消息传递中的性能热点。支持的归约标志包括:sum、mean、amax、amin。

加速 PyG 在 Intel CPU 上的运行 中讨论了第三代 Intel® Xeon® 可扩展处理器 8380 平台和第四代 8480+ 平台上的推理和训练的端到端性能基准测试结果。

通过 x86 CPU 平台的统一量化后端优化 int8 推理

新的 X86 量化后端是 FBGEMM(Facebook 通用矩阵乘法)和 oneAPI 深度神经网络库 (oneDNN) 后端的组合,它取代 FBGEMM 成为 x86 平台的默认量化后端。结果:比 FBGEMM 更好的端到端 int8 推理性能。

用户默认访问 x86 平台的 x86 量化后端,不同内核之间的选择在后台自动完成。选择规则基于英特尔在功能开发期间进行的先前的性能测试数据。因此,x86 后端取代了 FBGEMM,并且根据用例可能会提供更好的性能。

选择规则是:

  • 在没有 VNNI 的平台(例如 Intel® Core™ i7 处理器)上,始终使用 FBGEMM。
  • 在具有 VNNI 的平台(例如第二代至第四代 Intel® Xeon® 可扩展处理器和未来平台)上
    • 对于线性层,始终使用 FBGEMM。
    • 对于卷积层,如果深度卷积层数 > 100,则使用 FBGEMM;否则,使用 oneDNN。

请注意,随着内核的不断发展。

上述选择规则可能会更改以获得更好的性能。统一 x86 后端与纯 FBGEMM 的吞吐量加速比的性能指标在 [RFC] 用于 x86 CPU 平台的统一量化后端 #83888 中进行了讨论。

利用 oneDNN Graph API 加速 CPU 上的推理

oneDNN Graph API 通过灵活的图 API 扩展了 oneDNN,以最大限度地利用优化机会,为 Intel® AI 硬件生成高效代码。它自动识别要通过融合加速的图分区。融合模式 侧重于融合卷积、矩阵乘法及其相邻操作等计算密集型操作,适用于推理和训练用例。

目前,支持 BFloat16 和 Float32 数据类型,并且只能优化推理工作负载。BF16 仅在支持 Intel® Advanced Vector Extensions 512 (Intel® AVX-512) BF16 的机器上进行优化。

PyTorch 中几乎不需要修改即可支持更新的 oneDNN Graph 融合/优化内核。要使用 oneDNN Graph,用户可以

  • 在 JIT 跟踪模型之前使用 API torch.jit.enable_onednn_fusion(True),或者……
  • 使用其上下文管理器,即 with torch.jit.fuser(“fuser3”)。
  • 为了加速 BFloat16 推理,我们依赖于 PyTorch 中的即时模式 AMP(自动混合精度)支持,并禁用 JIT 模式的 AMP。

请参阅 PyTorch 性能调优指南

下一步

获取软件

试用 PyTorch 2.0,亲身体验英特尔贡献的这些功能带来的性能优势。

我们鼓励您查看英特尔的其他 AI 工具框架 优化,并了解构成英特尔 AI 软件组合基础的开放、基于标准的 oneAPI 多架构、多供应商编程模型。

有关第四代 Intel Xeon 可扩展处理器的更多详细信息,请访问 AI 平台,在那里您可以了解英特尔如何赋能开发人员运行高性能、高效的端到端 AI 流水线。

PyTorch 资源