如何更改 NumPy 和 conda MKL 版本

问题描述 投票:0回答:3

如何更改 NumPy 和 Miniconda 使用的 MKL(数学内核库)版本?

Intel 的 MKL 表现不佳是因为在 AMD 处理器上,MKL 故意选择非 Intel CPU 上最慢的路径,“削弱”AMD 处理器上的数值处理。这对于 AMD CPU 上的科学工作来说是一个很大的问题,因为使用 NumPy 的数值计算受到这种“削弱 AMD”功能的极大影响。

我使用的Python(Python 3.9.5)是由Miniconda分发的,NumPy是使用

conda install numpy
安装的。这安装了带有 MKL 版本 2021.0.3 的 NumPy。

以前“削弱 AMD”功能的解决方法是设置一个环境变量

MKL_DEBUG_CPY_TYPE=5
。但从 MKL 2020 开始,这个变量被删除了(英特尔,为什么??),所以它不再能够让这个解决方法发挥作用。

所以现在的解决方案是将 NumPy 的(和 conda 的)MKL 版本降级到 2019。如何实现这一点?如何将 NumPy 和 Conda 使用的 MKL 版本从 2021.0.3 更改为 2019?

系统信息:

  • Python:3.9.5
  • conda
    :4.10.3
  • NumPy:1.20.3
  • MKL(
    mkl.get_version_string()
    ):2021.3
  • NumPy MKL(
    np.__mkl_version__
    ):2021.0.3

请告诉我,因为这是 AMD CPU 上科学计算的关键问题。

提前谢谢您!!!

PS:在你说“MKL是Intel为Intel处理器编写的,所以瘫痪其他处理器是可以的!”之前,请记住,竞争时应该有竞争精神,比如惊人的创新,而不是反竞争行为比如故意降低竞争对手 CPU 的性能。如果您想赢得比赛,请练习并提高跑步技术,不要打断竞争对手的腿。

请避免争论,如果可以的话尽量回答我的问题。如果做不到,请忽略并离开。

performance numpy conda intel-mkl
3个回答
5
投票

我会创建一个新环境,并且可能来自 Anaconda 频道。以下对我有用:

猛击

## create environment
conda create -n foo -c anaconda python numpy mkl=2019.* blas=*=*mkl

## activate and launch python
conda activate foo
python

Python

import mkl
import numpy as np

mkl.get_version()
## 'Intel(R) Math Kernel Library Version 2019.0.4 Product Build 20190411 for Intel(R) 64 architecture applications'

np.__mkl_version__
## '2019.4'

np.show_config()
## blas_mkl_info:
##     libraries = ['mkl_rt', 'pthread']
##     library_dirs = ['/Users/mfansler/miniconda3/envs/foo/lib']
##     define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
##     include_dirs = ['/Users/mfansler/miniconda3/envs/foo/include']
## blas_opt_info:
##     libraries = ['mkl_rt', 'pthread']
##     library_dirs = ['/Users/mfansler/miniconda3/envs/foo/lib']
##     define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
##     include_dirs = ['/Users/mfansler/miniconda3/envs/foo/include']
## lapack_mkl_info:
##     libraries = ['mkl_rt', 'pthread']
##     library_dirs = ['/Users/mfansler/miniconda3/envs/foo/lib']
##     define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
##     include_dirs = ['/Users/mfansler/miniconda3/envs/foo/include']
## lapack_opt_info:
##     libraries = ['mkl_rt', 'pthread']
##     library_dirs = ['/Users/mfansler/miniconda3/envs/foo/lib']
##     define_macros = [('SCIPY_MKL_H', None), ('HAVE_CBLAS', None)]
##     include_dirs = ['/Users/mfansler/miniconda3/envs/foo/include']

注释

我将其留在这里作为“as-is”答案,因为似乎有些复杂性超出了我的范围。也就是说,Anaconda 和 Conda Forge 在 NumPy + MKL 方面似乎有不同的集成策略。 Anaconda 通过直接集成构建 NumPy(包括

np.__mkl_version__
扩展); Conda Forge 似乎一般使用 BLAS/LAPACK 构建 NumPy,然后基于 MKL 实现构建
libblas
liblapack
变体。不确定这些策略可能会产生什么差异。

Anaconda 通道目前只有 Python 3.8 - 但无论如何,它符合预期的 MKL 2019.*。 Python 3.9 是 2020 年末发布的版本。

blas=*=*mkl
至关重要:这就是限制使用 NumPy 的 MKL 构建的原因。

这是在 osx-64 平台上 - 希望差异不大。


2
投票

根据 conda-forge 文档

您可以通过执行以下操作来切换 BLAS 实现,

conda install "libblas=*=*mkl"
conda install "libblas=*=*openblas"
conda install "libblas=*=*blis"
conda install "libblas=*=*accelerate"
conda install "libblas=*=*netlib"

这将更改 BLAS 实现,而无需更改取决于 BLAS 的 conda 包。

还支持以下旧命令。

conda install "blas=*=mkl"
conda install "blas=*=openblas"
conda install "blas=*=blis"
conda install "blas=*=accelerate"
conda install "blas=*=netlib"

0
投票

这可能会帮助目前(2023 年)尝试获得此功能的人。

对于一些准系统计算并确保使用 MKL,以下 conda 环境设置可能有用。这确实包括 MKL。更进一步,该设置使用当前的英特尔 Python 发行版,并且仅从英特尔渠道安装。

--override-channels 确保仅搜索指定通道(本例中为 Intel 通道)

conda 搜索允许查看相应频道可用的所有 Python 版本

Intel渠道的一些库有点过时,比如pandas是1.5,而最新版本是2,但这至少保证了尽可能多的包来自Intel的编译)

参见文章这里

conda config --add channels intel
conda search --full-name python
conda create --name intelpy3test --channel intel --override-channels intelpython3_core
conda install numba pandas --channel intel --override-channels 
© www.soinside.com 2019 - 2024. All rights reserved.