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

通过内存分配优化提升 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 CPU 在 Windows 上的性能可以显著提升。然而,与 Linux 上的性能相比,仍然存在明显的差距。Windows 版 PyTorch CPU 中缺乏向量化优化是导致剩余性能差距的关键因素。

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 上的集成问题造成的,该库是一个用于评估基本函数、向量化 libm 和 DFT 的 SIMD 库,对于高效的三角函数计算至关重要。通过与 ARM 和高通的工程师协作,这些挑战得以解决,从而实现了 SIMD 在 Windows 版 PyTorch 中的集成。因此,PyTorch 2.4.1 更新显著提升了 PyTorch 在 Windows 上的 CPU 性能,如图 2.1 所示。

通过向量化优化提升 PyTorch 在 Windows 上的 CPU 性能
图 2.1:通过从 PyTorch CPU 2.1.2 版升级到 2.4.1 版实现的相对吞吐量提升(越高越好)。
如下图所示,我们看到 PyTorch CPU 在 Windows 上的性能已达到 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。我们还要感谢微软提供了这样一个易于集成且性能卓越的内存分配库。感谢来自 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 代英特尔® 酷睿™ i7-13700H | 第 13 代英特尔® 酷睿™ 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: 已启用 |
PPINs | -- | -- |
加速器 | 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]) |
Hugepagesize | 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 |
内核 | OS 构建 19045.4412 | 6.5.0-27-generic |
TDP | 200 瓦 | 200 瓦 |
电源与性能策略 | 正常省电 (7) | 正常省电 (7) |
频率调节器 | 性能 | 性能 |
频率驱动程序 | intel_pstate | intel_pstate |
最大 C 状态 | 9 | 9 |
注意事项和免责声明
性能因使用、配置和其他因素而异。有关更多信息,请访问 性能指标网站。
性能结果基于 配置 中所示日期的测试,可能无法反映所有公开可用的更新。有关配置详情,请参阅备份。任何产品或组件都不能做到绝对安全。您的成本和结果可能会有所不同。英特尔技术可能需要启用硬件、软件或服务激活。
英特尔公司。英特尔、英特尔徽标和其他英特尔标志是英特尔公司或其子公司的商标。其他名称和品牌可能属于他人所有。