PyTorch 在 Windows 上的 CPU 性能低于 Linux 一直是一个重要问题。造成这种性能差异的原因有多种。通过我们的调查,我们已经确定了导致 Windows 上 CPU 性能不佳的几个原因,其中两个主要问题是:Windows 默认的 malloc 内存分配器效率低下,以及 Windows 平台缺少用于向量化优化的SIMD。在本文中,我们将展示 PyTorch 在 Windows 上的 CPU 性能如何从以前的版本中得到改进,以及截至 PyTorch 2.4.1 的现状。
PyTorch 2.1.2 及更高版本中的内存分配优化
在 PyTorch 2.1.2 之前的版本中,PyTorch 依赖操作系统的默认 malloc 函数进行内存分配。Windows 平台上的默认 malloc 内存分配效率低于 Linux 平台上的 malloc 实现机制,导致内存分配时间增加,性能降低。为了解决这个问题,我们用 Microsoft 开发的更高效的内存分配器 mimalloc 替换了默认的 Windows malloc。此更新已包含在 PyTorch 2.1.2 及更高版本中,如 图1.1 所示,它显著提升了 PyTorch 在 Windows 上的 CPU 性能。

通过内存分配优化提升 PyTorch 在 Windows 上的 CPU 性能
图 1.1:通过从 Windows PyTorch 2.0.1 版升级到 2.1.2 版实现的相对吞吐量提升(越高越好)。
该图表明,随着 PyTorch 2.1.2 的发布,Windows 平台上的 CPU 性能有了显著提升。改进程度因模型而异,这可归因于它们执行的操作和相应的内存访问模式的不同组合。虽然 BERT 模型显示出适度的性能提升,但 ResNet50 和 MobileNet-v3 Large 等模型则受益于更显著的改进。
在高性能 CPU 上,内存分配成为性能瓶颈。这也是解决此问题能够带来如此显著性能提升的原因。
如下图所示,我们看到 PyTorch 在 Windows 上的 CPU 性能可以显著提升。然而,与 Linux 上的性能相比,仍然存在明显的差距。PyTorch CPU 的 Windows 版本中缺少向量化优化是造成剩余性能差距的关键因素。

PyTorch 2.0.1 在 Windows 和 Linux 上的性能对比
图 1.2:PyTorch 2.0.1 版在 Windows 和 Linux 上的相对性能(越高越好)。

PyTorch 2.1.2 在 Windows 和 Linux 上的性能对比
图 1.3:PyTorch 2.1.2 版在 Windows 和 Linux 上的相对性能(越高越好)。
PyTorch 2.4.1 及更高版本中的向量化优化
在 PyTorch 2.4.1 之前,PyTorch 的 Windows 构建版本缺少用于向量化优化的SIMD,而 Linux 构建版本则利用了此功能来提高性能。这种差异是由于SLEEF库在 Windows 上的集成问题造成的,该库是一个用于评估基本函数的 SIMD 库、向量化 libm 和 DFT,对于高效的三角函数计算至关重要。通过与 ARM 和高通工程师的合作,这些挑战得以解决,从而将 SIMD 集成到 Windows 版 PyTorch 中。因此,如 图2.1 所示,PyTorch 2.4.1 更新显著提升了 PyTorch 在 Windows 上的 CPU 性能。

通过向量化优化提升 PyTorch 在 Windows 上的 CPU 性能
图 2.1:通过将 PyTorch CPU 版本从 2.1.2 升级到 2.4.1 实现的相对吞吐量提升(越高越好)。
如下图所示,我们看到 PyTorch 在 Windows 上的 CPU 性能已达到 Linux 上的性能。

PyTorch 2.4.1 在 Windows 和 Linux 上的性能对比
图 2.2:PyTorch 2.4.1 版在 Windows 和 Linux 上的相对性能(越高越好)。
结论
从 PyTorch 2.0.1 到 PyTorch 2.4.1,Windows 和 Linux 之间的 CPU 性能差距一直在持续缩小。我们比较了不同版本中 Windows CPU 性能与 Linux CPU 性能的比率,结果如下图所示。

不同版本 PyTorch 在 Windows 和 Linux 上的性能对比
图 3:不同版本 PyTorch 在 Windows 和 Linux 上的性能比率(越高越好)。
该图显示,使用 PyTorch 2.4.1,Windows 上的 CPU 性能几乎与 Linux 上的性能趋于一致,在某些模型上甚至超越了 Linux。例如,在 DistillBERT 和 RoBERTa 模型的情况下,Windows 与 Linux 的 CPU 性能比达到了惊人的 102%。然而,包括 MobileNet-v3 在内的某些模型仍然存在性能差异。英特尔工程师将继续与 Meta 工程师合作,以缩小 PyTorch CPU 在 Windows 和 Linux 之间的性能差距。
如何利用这些优化
从官方仓库在 Windows 上安装 PyTorch CPU 2.4.1 或更高版本,您可能会自动体验到内存分配和向量化的性能提升。
致谢
本博客文章中展示的结果是通过英特尔 PyTorch 团队和 Meta 的协作努力实现的。我们衷心感谢许汉、宫炯、朱浩哲、马明飞、王传旗、陈国兵和王一侃。他们的专业知识和奉献精神对于实现本文讨论的优化和性能改进至关重要。感谢社区的浦佳辰参与问题讨论并建议使用mimalloc。我们还要感谢 Microsoft 提供了这样一个易于集成且性能卓越的内存分配库。感谢 ARM 的Pierre Blanchard、Nathan Sircombe以及 Adobe 的Alex Reinking为克服sleef集成到 PyTorch Windows 时的兼容性问题所做出的贡献。最后,我们要感谢徐晶、张卫卓和郑兆琼对本博客文章的贡献。
产品与性能信息
表中的配置是使用svr-info收集的。由英特尔于2024年8月30日进行测试。
| 规格 | 配置1 | 配置2 |
| 名称 | ThinkBook 14 G5+ IRH | ThinkBook 14 G5+ IRH |
| 时间 | 2024年8月30日星期五下午02:43:02 UTC | 2024年8月30日星期五下午02:43:02 UTC |
| 系统 | 联想 | 联想 |
| 主板 | 联想 | 联想 |
| 机箱 | 联想 | 联想 |
| CPU 型号 | 第13代英特尔(R) 酷睿(TM) i7-13700H | 第13代英特尔(R) 酷睿(TM) i7-13700H |
| 微架构 | 未知英特尔 | 未知英特尔 |
| 插槽 | 1 | 1 |
| 每插槽核心数 | 14 | 14 |
| 超线程 | 已启用 | 已启用 |
| CPU | 20 | 20 |
| 英特尔睿频加速技术 | 已启用 | 已启用 |
| 基频 | 2.4GHz | 2.4GHz |
| 全核最大频率 | 4.7GHz | 4.7GHz |
| 最大频率 | 4.8GHz | 4.8GHz |
| NUMA 节点 | 1 | 1 |
| 预取器 | L2 HW: 已启用, L2 Adj.: 已启用, DCU HW: 已启用, DCU IP: 已启用 | L2 HW: 已启用, L2 Adj.: 已启用, DCU HW: 已启用, DCU IP: 已启用 |
| PPIN | – | – |
| 加速器 | DLB, DSA, IAA, QAT | DLB, DSA, IAA, QAT |
| 已安装内存 | 32GB (8x4GB LPDDR4 7400 MT/s [5200 MT/s]) | 32GB (8x4GB LPDDR4 7400 MT/s [5200 MT/s]) |
| 大页大小 | 2048kb | 2048kb |
| 透明大页 | madvise | madvise |
| 自动 NUMA 平衡 | 已禁用 | 已禁用 |
| 网卡 | “1. Raptor Lake PCH CNVi WiFi 2. 英特尔公司” | “1. Raptor Lake PCH CNVi WiFi 2. 英特尔公司” |
| 硬盘 | Micron MTFDKBA512TFH 500G | Micron MTFDKBA512TFH 500G |
| BIOS | LBCN22WW | LBCN22WW |
| 微码 | 0x411c | 0x411c |
| 操作系统 | Windows 11 桌面版 | Ubuntu 23.10 |
| 内核 | 操作系统版本 19045.4412 | 6.5.0-27-generic |
| TDP | 200 瓦 | 200 瓦 |
| 电源与性能策略 | 正常节能 (7) | 正常节能 (7) |
| 频率调节器 | performance | performance |
| 频率驱动程序 | intel_pstate | intel_pstate |
| 最大 C 状态 | 9 | 9 |
声明与免责
性能因使用情况、配置及其他因素而异。请访问性能指标网站了解更多信息。
性能结果基于配置中所示日期的测试,可能无法反映所有公开可用的更新。有关配置详情,请参阅备份。任何产品或组件都无法做到绝对安全。您的成本和结果可能会有所不同。英特尔技术可能需要启用硬件、软件或服务激活。
英特尔公司。英特尔、英特尔徽标和其他英特尔标志是英特尔公司或其子公司的商标。其他名称和品牌可能属于他人所有。