我知道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测试了此代码:我在所有三个系统上都使用相同的Conda环境。根据
np.show_config()
的说法,英特尔系统使用Numpy的MKL后端(libraries = ['mkl_rt', 'pthread']
),而AMD系统使用OpenBLAS(libraries = ['openblas', 'openblas']
)。 CPU核心使用情况是通过观察Linux shell中的top
来确定的:上述观察结果引起以下问题:
更新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使用的线程数:
运行时间以秒为单位报告。每栏的最佳结果都带有下划线。我为此测试使用了OpenBLAS 0.3.6。该测试的结论:
更新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