为了账号安全,请及时绑定邮箱和手机立即绑定

为什么带有 Ryzen Threadripper 的 Numpy 比 Xeon 慢得多?

为什么带有 Ryzen Threadripper 的 Numpy 比 Xeon 慢得多?

慕尼黑8549860 2023-02-22 15:12:15
我知道 Numpy 可以使用不同的后端,如 OpenBLAS 或 MKL。我还读到 MKL 针对 Intel 进行了大量优化,所以通常人们建议在 AMD 上使用 OpenBLAS,对吗?我使用以下测试代码:import numpy as npdef testfunc(x):     np.random.seed(x)     X = np.random.randn(2000, 4000)     np.linalg.eigh(X @ X.T) %timeit testfunc(0)我已经使用不同的 CPU 测试了这段代码:在Intel Xeon E5-1650 v3上,此代码使用12 个内核中的 6 个在0.7 秒内执行。在AMD Ryzen 5 2600上,此代码使用所有 12 个内核在1.45 秒内执行。在AMD Ryzen Threadripper 3970X上,此代码使用所有 64 个内核在1.55 秒内执行。我在所有三个系统上使用相同的 Conda 环境。根据np.show_config(),Intel 系统使用 Numpy ( libraries = ['mkl_rt', 'pthread']) 的 MKL 后端,而 AMD 系统使用 OpenBLAS ( libraries = ['openblas', 'openblas'])。CPU 内核使用情况是通过top在 Linux shell 中观察来确定的:对于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 上的线性代数比六年前的英特尔至强处理器慢得多?(也在更新 3 中解决)从对 CPU 负载的观察来看,Numpy 似乎在所有三种情况下都利用了多核环境。Threadripper 怎么可能比 Ryzen 5 还要慢,尽管它的物理内核数量几乎是 Ryzen 5 的六倍?(另见更新 3)有什么办法可以加快 Threadripper 的计算速度吗?(在更新 2 中部分回答)更新 1: OpenBLAS 版本为 0.3.6。testfunc我在某处读到,升级到更新版本可能会有所帮助,但是,随着 OpenBLAS 更新到 0.3.10,在 AMD Ryzen Threadripper 3970X 上的性能仍然是 1.55s。更新 2:将 Numpy 的 MKL 后端与环境变量结合使用MKL_DEBUG_CPU_TYPE=5(如此处所述)将 AMD Ryzen Threadripper 3970X 上的运行时间减少testfunc到仅 0.52 秒,这实际上或多或少令人满意。FTR,通过在 Ubuntu 20.04 上设置此变量~/.profile对我不起作用。此外,从 Jupyter 中设置变量也不起作用。所以我~/.bashrc现在把它放到 which works 中。无论如何,比旧的 Intel Xeon 快 35%,这是我们所能得到的,还是我们能从中得到更多?更新 3:我研究 MKL/OpenBLAS 使用的线程数:运行时间以秒为单位报告。每列的最佳结果都带有下划线。我使用 OpenBLAS 0.3.6 进行此测试。本次测试得出的结论:使用 OpenBLAS 的 Threadripper 的单核性能比 Xeon 的单核性能好一点(快 11%),但是使用 MKL 时其单核性能甚至更好(快 34%)。使用 OpenBLAS 的 Threadripper 的多核性能比 Xeon 的多核性能差得离谱。这里发生了什么?当使用 MKL 时,Threadripper 的整体性能优于 Xeon (比 Xeon 快 26% 到 38%)。Threadripper 使用 16 个线程和 MKL(比 Xeon 快 36%)实现了整体最佳性能。
查看完整描述

3 回答

?
慕慕森

TA贡献1856条经验 获得超17个赞

截至 2021 年,英特尔不幸删除了MKL_DEBUG_CPU_TYPE防止 AMD 用户使用已接受答案中提供的解决方法。这意味着解决方法不再有效,AMD 用户必须切换到 OpenBLAS 或继续使用 MKL。

要使用解决方法,请遵循以下方法

  1. 使用 和 NumPy 的 MKL=2019创建conda环境。conda

  2. 激活环境

  3. 设置MKL_DEBUG_CPU_TYPE= 5

上述步骤的命令:

  1. conda create -n my_env -c anaconda python numpy mkl=2019.* blas=*=*mkl

  2. conda activate my_env

  3. conda env config vars set MKL_DEBUG_CPU_TYPE=5

就是这样!


查看完整回答
反对 回复 2023-02-22
?
蓝山帝景

TA贡献1843条经验 获得超7个赞

尝试使用 AMD 优化的 BLIS 库是否有意义?

也许我遗漏(误解)了某些东西,但我认为您可以使用 BLIS 而不是 OpenBLAS。唯一的潜在问题可能是 AMD BLIS 针对 AMD EPYC 进行了优化(但您使用的是 Ryzen)。我对结果非常好奇,因为我正在为工作购买服务器,并且正在考虑 AMD EPYC 和 Intel Xeon。

以下是各自的 AMD BLIS 库: https ://developer.amd.com/amd-aocl/


查看完整回答
反对 回复 2023-02-22
?
慕勒3428872

TA贡献1848条经验 获得超6个赞

我认为这应该有所帮助:

“图表中最好的结果是 TR 3960x 使用 MKL 和环境 var MKL_DEBUG_CPU_TYPE=5。它比单独使用 MKL 的低优化代码路径要好得多。而且,OpenBLAS 几乎和 MKL 一样好 MKL_DEBUG_CPU_TYPE=5放。” 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/?排序=新


查看完整回答
反对 回复 2023-02-22
  • 3 回答
  • 0 关注
  • 368 浏览
慕课专栏
更多

添加回答

举报

0/150
提交
取消
微信客服

购课补贴
联系客服咨询优惠详情

帮助反馈 APP下载

慕课网APP
您的移动学习伙伴

公众号

扫描二维码
关注慕课网微信公众号