gpt4 book ai didi

python - 为什么带有 Ryzen Threadripper 的 Numpy 比 Xeon 慢这么多?

转载 作者:行者123 更新时间:2023-12-01 07:25:05 32 4
gpt4 key购买 nike

我知道 Numpy 可以使用不同的后端,如 OpenBLAS 或 MKL。我还读到 MKL 针对英特尔进行了大量优化,所以通常人们建议在 AMD 上使用 OpenBLAS,对吗?
我使用以下测试代码:

import numpy as np

def testfunc(x):
np.random.seed(x)
X = np.random.randn(2000, 4000)
np.linalg.eigh(X @ X.T)

%timeit testfunc(0)
我已经使用不同的 CPU 测试了这段代码:
  • 英特尔至强 E5-1650 v3 ,此代码在 中执行0.7s 使用 12 个内核中的 6 个 .
  • AMD 锐龙 5 2600 ,此代码在 中执行1.45s 使用 全 12 核 .
  • AMD 锐龙线程撕裂者 3970X ,此代码在 中执行1.55s 使用 全部 64 核 .

  • 我在所有三个系统上都使用相同的 Conda 环境。根据 np.show_config() ,Intel 系统为 Numpy 使用 MKL 后端( libraries = ['mkl_rt', 'pthread'] ),而 AMD 系统使用 OpenBLAS( libraries = ['openblas', 'openblas'] )。 CPU 核心使用率是通过观察 top 确定的在 Linux shell 中:
  • 对于 英特尔至强 E5-1650 v3 CPU(6 个物理内核),它显示 12 个内核(6 个空闲)。
  • 对于 AMD 锐龙 5 2600 CPU(6 个物理内核),它显示 12 个内核(无空闲)。
  • 对于 AMD 锐龙线程撕裂者 3970X CPU(32 个物理内核),它显示 64 个内核(无空闲)。

  • 上述观察引起以下问题:
  • 使用 OpenBLAS 的最新 AMD CPU 上的线性代数比使用 6 年历史的 Intel Xeon 慢得多,这正常吗? (也在更新 3 中解决)
  • 从 CPU 负载的观察来看,看起来 Numpy 在所有三种情况下都利用了多核环境。尽管 Threadripper 的物理内核数量几乎是 Ryzen 5 的六倍,但它怎么可能比 Ryzen 5 还要慢? (另见更新 3)
  • 有什么办法可以加快 Threadripper 的计算速度吗? (在更新 2 中部分回答)

  • 更新 1: OpenBLAS 版本为 0.3.6。我在某处读到,升级到较新版本可能会有所帮助,但是,随着 OpenBLAS 更新到 0.3.10, testfunc 的性能提高了。在 AMD Ryzen Threadripper 3970X 上仍然是 1.55s。

    更新 2:将 MKL 后端用于 Numpy 并结合环境变量 MKL_DEBUG_CPU_TYPE=5 (如 here 所述)减少了 testfunc 的运行时间在 AMD Ryzen Threadripper 3970X 上只有 0.52s,这实际上或多或少令人满意。 FTR,通过 ~/.profile 设置此变量在 Ubuntu 20.04 上对我不起作用。此外,从 Jupyter 内部设置变量不起作用。所以我把它放进 ~/.bashrc现在有效。无论如何,性能比旧的英特尔至强快 35%,这就是我们所得到的,还是我们可以从中获得更多?

    更新 3:我玩弄 MKL/OpenBLAS 使用的线程数:
    run time by the number of threads and library
    运行时间以秒为单位报告。每列的最佳结果都带有下划线。我在这个测试中使用了 OpenBLAS 0.3.6。本次测试的结论:
  • 使用OpenBLAS的Threadripper单核性能好一点比至强的单核性能(快 11%),然而,使用 MKL 时,它的单核性能甚至更好(快 34%)。
  • 使用 OpenBLAS 的 Threadripper 的多核性能差得离谱超过至强的多核性能。这里发生了什么?
  • Threadripper 的整体性能优于至强 ,当使用 MKL 时(比至强快 26% 到 38%)。使用 16 个线程和 MKL(比 Xeon 快 36%)的 Threadripper 实现了整体最佳性能。

  • 更新 4:只是为了澄清。不,我不认为 (a) this或 (b) that回答这个问题。 (a) 表明“OpenBLAS 的表现几乎和 MKL 一样好”,这与我观察到的数字强烈矛盾。根据我的数据,OpenBLAS 的性能比 MKL 差得离谱。问题是为什么。 (a) 和 (b) 都建议使用 MKL_DEBUG_CPU_TYPE=5与 MKL 结合以实现最佳性能。这可能是对的,但这并不能解释为什么 OpenBLAS 如此缓慢。它没有解释,为什么即使使用 MKL 和 MKL_DEBUG_CPU_TYPE=5 32 核 Threadripper 仅比使用了 6 年的 6 核 Xeon 快 36% .

    最佳答案

    我认为这应该有帮助:
    “图表中的最佳结果是使用 MKL 和环境变量 MKL_DEBUG_CPU_TYPE=5 的 TR 3960x。它明显优于仅来自 MKL 的低优化代码路径。并且,OpenBLAS 在 MKL_DEBUG_CPU_TYPE=5 的情况下几乎与 MKL 一样好放。”
    https://www.pugetsystems.com/labs/hpc/How-To-Use-MKL-with-AMD-Ryzen-and-Threadripper-CPU-s-Effectively-for-Python-Numpy-And-Other-Applications-1637/
    如何设置:
    '通过在系统环境变量中输入 MKL_DEBUG_CPU_TYPE=5 使设置永久化。这有几个优点,其中之一是它适用于 Matlab 的所有实例,而不仅仅是使用 .bat 文件打开的实例。
    https://www.reddit.com/r/matlab/comments/dxn38s/howto_force_matlab_to_use_a_fast_codepath_on_amd/?sort=new

    关于python - 为什么带有 Ryzen Threadripper 的 Numpy 比 Xeon 慢这么多?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/62783262/

    32 4 0
    Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
    广告合作:1813099741@qq.com 6ren.com