在没有 MKL 的情况下为 AMD Ryzen 设置 Anaconda

Setting up Anaconda for AMD Ryzen without MKL

像许多其他人一样,我给自己买了一个新的 Ryzen CPU。我需要使用 Anaconda Python 来攻读博士学位(连同 Tensorflow 等)。由于 Anaconda 现在预打包了 MKL,这在 AMD CPUs 上很慢,使用 openblas、link numpy 和 scikit-learn 设置 Anaconda 环境的最佳方法是什么,同时保持所有其他包一样吗?

我发现以下帖子都指向以某种方式安装某些软件包。

https://anaconda.org/anaconda/nomkl

https://anaconda.org/anaconda/openblas

How to install scipy without mkl

放弃 MKL 的替代方法是通过告诉 MKL 使用与 Ryzen 更兼容的指令集,使其 运行 在 Ryzen CPU 上更快。通过

conda install mkl -c intel --no-update-deps
set MKL_DEBUG_CPU_TYPE=5

我看到在我的 Ryzen CPU 上使用 numpy/theano/PyMC3 在 Windows 10 下与默认的初始 miniconda 安装相比大约有 15 倍的加速。

来自 reddit 的 post 对正在发生的事情有更详尽的解释,但它只是您终端中的一行代码,可以欺骗 MKL 认为您是 Intel 系统,因为 MKL 会对非英特尔设备: https://www.reddit.com/r/MachineLearning/comments/f2pbvz/discussion_workaround_for_mkl_on_amd/

WINDOWS:

使用 admin 权限打开命令提示符 (CMD) 并输入:

setx /M MKL_DEBUG_CPU_TYPE 5

这样做将使更改永久生效,并可供系统上使用 MKL 的所有程序使用,直到您再次从变量中删除该条目。

LINUX:

只需在终端中输入:

export MKL_DEBUG_CPU_TYPE=5 

在 运行 来自同一终端实例的脚本之前。

Linux的永久解决方案:

echo 'export MKL_DEBUG_CPU_TYPE=5' >> ~/.profile

将在配置文件范围内应用设置。

一些要点,因为我认为如果有兴趣,您可以单击 link 阅读整篇文章:

"但是,默认情况下,许多软件包附带的数字库是 Intel MKL。众所周知,MKL 在 AMD CPUs 上的某些操作运行速度非常慢。这是因为 Intel MKL 使用判别式 CPU 调度程序根据 CPU 的 SIMD 支持不使用有效的代码路径,而是基于供应商字符串查询的结果。如果 CPU 来自 AMD,则 MKL 会不使用 SSE3-SSE4 或 AVX1/2 扩展,但无论 AMD CPU 是否支持更高效的 SIMD 扩展(如 AVX2),都会回退到 SSE。

此处提供的方法通过 MKL 强制执行 AVX2 支持,独立于供应商字符串结果,并且应用时间不到一分钟。如果您有基于 Zen/Zen+/Zen2 µArch Ryzen/Threadripper 的 AMD CPU,这将极大地提高您的性能。"

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

要使用解决方法,请遵循此方法

  1. 使用 conda 和 NumPy 的 MKL=2019 创建一个 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

就是这样!