恭喜 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 eager 模式的性能。
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 是分析图结构数据的强大工具。此功能旨在提高 GNN 在英特尔® CPU(包括新的第四代英特尔® 至强® 可扩展处理器)上的推理和训练性能。
PyTorch Geometric (PyG) 是一个非常流行的基于 PyTorch 构建的库,用于执行 GNN 工作流。目前在 CPU 上,由于缺乏 GNN 相关的稀疏矩阵乘法操作(即 SpMM_reduce)以及缺乏针对 GNN 计算优化的几个关键内核级优化(scatter/gather 等),PyG 的 GNN 模型运行缓慢。
为了解决这个问题,我们对相邻神经网络节点之间的消息传递提供了优化
- scatter_reduce:当边索引以坐标格式 (COO) 存储时,消息传递中的性能热点。
- gather:scatter_reduce 的反向计算,当索引是扩展张量时,专门为 GNN 计算进行了优化。
- torch.sparse.mm with reduce flag:当边索引以压缩稀疏行 (CSR) 存储时,消息传递中的性能热点。支持的 reduce 标志包括:sum、mean、amax、amin。
有关在第三代英特尔® 至强® 可扩展处理器 8380 平台和第四代 8480+ 平台上推理和训练的端到端性能基准测试结果,请参见 在英特尔 CPU 上加速 PyG。
通过统一量化后端优化 x86 CPU 平台的 int8 推理
新的 x86 量化后端是 FBGEMM(Facebook 通用矩阵乘法)和 oneAPI 深度神经网络库 (oneDNN) 后端的结合,并取代 FBGEMM 成为 x86 平台的默认量化后端。结果:比 FBGEMM 更好的端到端 int8 推理性能。
x86 平台的用户默认访问 x86 量化后端,不同内核之间的选择在后台自动完成。选择规则基于英特尔在功能开发过程中进行的先前性能测试数据。因此,x86 后端取代 FBGEMM,并可能根据用例提供更好的性能。
选择规则是
- 在没有 VNNI 的平台(例如 Intel® Core™ i7 处理器)上,始终使用 FBGEMM。
- 在具有 VNNI 的平台(例如第二代到第四代 Intel® Xeon® Scalable 处理器和未来平台)上
- 对于线性层,始终使用 FBGEMM。
- 对于卷积层,当层数 > 100 的深度卷积时,使用 FBGEMM;否则,使用 oneDNN。
请注意,随着内核的不断发展。
上述选择规则可能会更改以获得更好的性能。统一 x86 后端与纯 FBGEMM 的吞吐量加速比的性能指标在 [RFC] x86 CPU 平台的统一量化后端 #83888 中讨论。
利用 oneDNN Graph API 加速 CPU 上的推理
oneDNN Graph API 扩展了 oneDNN,提供灵活的图形 API,以最大限度地提高在英特尔® 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 中的 eager 模式 AMP(自动混合精度)支持,并禁用 JIT 模式的 AMP。
请参阅 PyTorch 性能调优指南。
下一步
获取软件
试用 PyTorch 2.0,亲身体验英特尔贡献的这些功能带来的性能优势。
我们鼓励您查看英特尔的其他 AI 工具和 框架优化,并了解开放的、基于标准的 oneAPI 多架构、多供应商编程模型,它构成了英特尔 AI 软件组合的基础。
有关第四代英特尔至强可扩展处理器的更多详细信息,请访问 AI 平台,您可以了解英特尔如何赋能开发者运行高性能、高效的端到端 AI 流水线。