跳转到主要内容
博客

在 Windows CPU 上实现 PyTorch 性能提升的路径

作者: 2024年10月15日2024年11月11日暂无评论

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 性能。

Figure 1.1: Relative throughput improvement achieved by upgrading from Windows PyTorch version 2.0.1 to 2.1.2 (higher is better).

通过内存分配优化提升 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 版本中缺少向量化优化是造成剩余性能差距的关键因素。

Figure 1.2: Relative performance of Windows vs Linux with PyTorch version 2.0.1 (higher is better).

PyTorch 2.0.1 在 Windows 和 Linux 上的性能对比

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

performance comparison chart

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 性能。

performance comparison chart

通过向量化优化提升 PyTorch 在 Windows 上的 CPU 性能

图 2.1:通过将 PyTorch CPU 版本从 2.1.2 升级到 2.4.1 实现的相对吞吐量提升(越高越好)。

如下图所示,我们看到 PyTorch 在 Windows 上的 CPU 性能已达到 Linux 上的性能。

Windows vs Linux Performance on PyTorch 2.4.1

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 性能的比率,结果如下图所示。

performance comparison chart

不同版本 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 BlanchardNathan Sircombe以及 Adobe 的Alex Reinking为克服sleef集成到 PyTorch Windows 时的兼容性问题所做出的贡献。最后,我们要感谢徐晶张卫卓郑兆琼对本博客文章的贡献。

产品与性能信息

表中的配置是使用svr-info收集的。由英特尔于2024年8月30日进行测试。

规格配置1配置2
名称ThinkBook 14 G5+ IRHThinkBook 14 G5+ IRH
时间2024年8月30日星期五下午02:43:02 UTC2024年8月30日星期五下午02:43:02 UTC
系统联想联想
主板联想联想
机箱联想联想
CPU 型号第13代英特尔(R) 酷睿(TM) i7-13700H第13代英特尔(R) 酷睿(TM) i7-13700H
微架构未知英特尔未知英特尔
插槽11
每插槽核心数1414
超线程已启用已启用
CPU2020
英特尔睿频加速技术已启用已启用
基频2.4GHz2.4GHz
全核最大频率4.7GHz4.7GHz
最大频率4.8GHz4.8GHz
NUMA 节点11
预取器L2 HW: 已启用, L2 Adj.: 已启用, DCU HW: 已启用, DCU IP: 已启用L2 HW: 已启用, L2 Adj.: 已启用, DCU HW: 已启用, DCU IP: 已启用
PPIN
加速器DLB, DSA, IAA, QATDLB, DSA, IAA, QAT
已安装内存32GB (8x4GB LPDDR4 7400 MT/s [5200 MT/s])32GB (8x4GB LPDDR4 7400 MT/s [5200 MT/s])
大页大小2048kb2048kb
透明大页madvisemadvise
自动 NUMA 平衡已禁用已禁用
网卡“1. Raptor Lake PCH CNVi WiFi 2. 英特尔公司”“1. Raptor Lake PCH CNVi WiFi 2. 英特尔公司”
硬盘Micron MTFDKBA512TFH 500GMicron MTFDKBA512TFH 500G
BIOSLBCN22WWLBCN22WW
微码0x411c0x411c
操作系统Windows 11 桌面版Ubuntu 23.10
内核操作系统版本 19045.44126.5.0-27-generic
TDP200 瓦200 瓦
电源与性能策略正常节能 (7)正常节能 (7)
频率调节器performanceperformance
频率驱动程序intel_pstateintel_pstate
最大 C 状态99

声明与免责

性能因使用情况、配置及其他因素而异。请访问性能指标网站了解更多信息。

性能结果基于配置中所示日期的测试,可能无法反映所有公开可用的更新。有关配置详情,请参阅备份。任何产品或组件都无法做到绝对安全。您的成本和结果可能会有所不同。英特尔技术可能需要启用硬件、软件或服务激活。

英特尔公司。英特尔、英特尔徽标和其他英特尔标志是英特尔公司或其子公司的商标。其他名称和品牌可能属于他人所有。