祝贺 PyTorch 基金会发布了 PyTorch 2.0!在这篇博客中,我将讨论英特尔为 PyTorch 2.0 做出重大贡献的四个特性:
- TorchInductor
- GNN
- INT8 推理优化
- 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 流水线。