1、问题背景
近期在使用faiss包构建knn索引的时候,经常会抛出一个Error:Intel MKL FATAL ERROR: Cannot load libmkl_avx512.so or libmkl_def.so
Intel MKL FATAL ERROR: Cannot load libmkl_avx512.so or libmkl_def.so
应该是faiss包在导入mkl包时出现了异常,解决这个问题的方法是在python脚本中导入mkl包:
import mkl
mkl.get_max_threads()
添加这两行代码之后,faiss抛出的问题理论上可解决,但是如果服务器上的mkl包不完整或者版本较低,就会遇到新的问题,解决方案通常都是Google之然后改之。
假设服务器上没有mkl包或者缺少mkl-service包(此时的服务器上有mkl-fft和mkl-random),那么抛出的Error变成:ImportError: No module named mkl
import mkl
ImportError: No module named mkl
2、解决mkl包的问题
赶紧查看一下是否安装了mkl:
pip list|grep 'mkl'
抓到两个python包:
- mkl-fft(1.0.10)
- mkl-random(1.0.2)
在python环境import mkl直接Error:ImportError: libmkl_rt.so: cannot open shared object file: No such file or directory
是不是缺了一个mkl-service包?
解决流程:
# python/pip版本
which python # ~/anaconda2/bin/python
python -V # Python 2.7.16 :: Anaconda, Inc.
which pip # ~/anaconda2/bin/pip
pip -V # pip 20.2.3 from /home/work/anaconda2/lib/python2.7/site-packages/pip (python 2.7)
1、Github给出的安装mkl-service的方法是使用下面两条conda命令中的一条,但是直接使用github提供的命令安装失败,一步一步来吧。。。
conda install -c intel mkl-service
conda install -c conda-forge mkl-service
2、直接更新mkl
这里其实有点凌乱,conda list是有完整的mkl+mkl-service+mkl_fft+mkl_random四个包,但是pip list只有mkl_fft+mkl_random两个包...
conda update mkl
Error:CondaMultiError: RemoveError: 'setuptools' is a dependency of conda and cannot be removed from
conda's operating environment.
解决这个问题的方法一般是更新conda:
conda update conda
继续报出同样的Error(不确定error,有的时候conda能更新成功,有的时候就失败了,可理解为是玄学)。
Google说加上--force参数可行:
conda update --force conda
conda更新成功。
3、如果mkl包的版本较低的话,可以进行一下升级
conda update mkl
没有抛出Error,升级成功。
3、升级conda触发的pip问题
升级了conda之后,pip命令居然不能使用了,pip list命令Error如下:ImportError: cannot import name PackageFinder
ImportError: cannot import name PackageFinder
解决方法:安装或者升级pip
curl https://bootstrap.pypa.io/get-pip.py -o get-pip.py
python get-pip.py
done。
查看下mkl,原来缺少的mkl-service包也安装上了。