如何更改NumPy和conda MKL版本

ukqbszuj  于 12个月前  发布在  其他
关注(0)|答案(3)|浏览(166)

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

英特尔的MKL表现不佳,因为在AMD处理器上,MKL故意选择非英特尔CPU上最慢的路径,“削弱”AMD处理器上的数字处理。这对于AMD CPU上的科学工作来说是非常有问题的,因为使用NumPy的数值计算受到这种“削弱AMD”功能的极大影响。
我使用的Python(Python 3.9.5)是由Miniconda发布的,NumPy是使用conda install numpy安装的。这安装了NumPy与MKL版本2021.0.3。
以前的一种解决方法是设置一个环境变量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是由英特尔为英特尔处理器编写的,所以可以削弱其他处理器!“,请记住,在竞争中应该有竞争精神,例如惊人的创新,而不是反竞争行为,例如故意降低竞争对手CPU的性能。如果你想赢得比赛,练习和提高你的跑步技术,不要打断你竞争对手的腿。
请避免争论,如果可以的话,请回答我的问题。如果你不能,就无视并离开。

jutyujz0

jutyujz01#

我会做一个新的环境,可能来源于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']

备注

我把这个作为一个“原样”的答案留在这里,因为似乎有一些复杂的问题超出了我的能力。也就是说,Anaconda和Conda Forge在NumPy + MKL方面似乎有不同的集成策略。Anaconda通过直接集成构建NumPy(包括np.__mkl_version__扩展); Conda Forge似乎一般使用BLAS/LAPACK构建NumPy,然后基于MKL实现构建libblasliblapack变体。不知道这些策略会带来什么不同。
Anaconda频道目前只有Python 3.8-但无论如何,这符合预期的MKL 2019。Python 3.9是2020年底发布的。
blas=*=*mkl非常重要:这就是对NumPy使用MKL构建的限制。
这是在OSX-64平台上-希望,差异不是很大。

2vuwiymt

2vuwiymt2#

根据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"
sczxawaw

sczxawaw3#

如果您可以根据Numpy的文档为不同的目的使用单独的Conda环境,则可以使用conda/pip安装Numpy。

  • OpenBLAS来源pip install numpy
  • (默认为的虚拟BLAS)OpenBLAS通过使用conda-forge通道conda install -c conda-forge numpy
  • 使用默认(=anaconda)通道conda install -c anaconda numpy的MKL

我不是特别喜欢最后一个选项,因为anaconda的问题是商业上不允许的。一个商业上可行的替代方案是

  • 使用英特尔通道conda install -c intel -c conda-forge intelpython3_full的MKL

它内置了Numpy(和Scipy,和xgboost,...)。请参阅英特尔here工具包文档。

相关问题