我知道Numpy可以使用OpenBLAS或MKL等不同的后端。我还读到MKL已针对Intel进行了优化,因此通常人们建议在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测试了此代码:
  • 上,英特尔Xeon E5-1650 v3 上的代码在 0.7s 中使用在12个内核中执行6个。
  • 上,AMD Ryzen 5 2600 上,此代码在 1.45s 中使用所有12个内核执行。
  • 上,AMD Ryzen Threadripper 3970X 上,此代码在 1.55s 中使用执行所有64核

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

  • 上述观察结果引起以下问题:
  • 是正常的吗,使用OpenBLAS的最新AMD CPU上的线性代数比六年前的Intel Xeon慢得多吗? (也在更新3中解决)
  • 从对CPU负载的观察来看,Numpy似乎在所有三种情况下都使用了多核环境。即使Threadripper的物理核心几乎是Ryzen 5的六倍,它又怎么可能比Ryzen 5慢呢? (另请参阅更新3)
  • 是否可以做些事情来加快Threadripper上的计算速度? (在更新2中得到部分答复)

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

    更新2:将Numpy的MKL后端与环境变量MKL_DEBUG_CPU_TYPE=5(如here所述)结合使用,可将AMD Ryzen Threadripper 3970X上testfunc的运行时间缩短至仅0.52s,这实际上或多或少地令人满意。 FTR,通过~/.profile设置此变量在Ubuntu 20.04上对我不起作用。同样,从Jupyter内部设置变量也不起作用。因此,我将其放入现在可以使用的~/.bashrc中。无论如何,执行速度比旧的Intel Xeon快35%,这是我们所能得到的,还是可以从中得到更多?

    更新3:我玩MKL/OpenBLAS使用的线程数:
    python - 为什么Ryzen Threadripper的Numpy比Xeon慢得多?-LMLPHP
    运行时间以秒为单位报告。每栏的最佳结果都带有下划线。我为此测试使用了OpenBLAS 0.3.6。该测试的结论:
  • 使用OpenBLAS的Threadripper的单核性能比Xeon的单核性能(快11%)更好,但是,使用MKL时,其单核性能甚至更好(快34%) 。
  • 使用OpenBLAS的Threadripper的多核性能比Xeon的多核性能差很多。这里发生了什么?
  • 使用MKL时,Threadripper的整体性能优于Xeon (比Xeon快26%至38%)。使用16个线程和MKL的Threadripper实现了总体最佳性能(比Xeon快36%)。

  • 更新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%。

    最佳答案

    我认为这应该有所帮助:
    “图表中最好的结果是TR 3960x使用环境变量为MKL_DEBUG_CPU_TYPE = 5的MKL。它明显优于仅来自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

    10-04 10:59
    查看更多