linux-anaconda中mkl库的一个坑

66次阅读

共计 808 个字符,预计需要花费 3 分钟才能阅读完成。

问题

anaconda3 中默认链接了一个自己的 mkl 库。代码中使用到 mkl 时,会报以下错误:

INTEL MKL ERROR: ~/anaconda3/envs/py27/bin/../lib/libmkl_avx2.so: undefined symbol: mkl_sparse_optimize_bsr_trsm_i8.
Intel MKL FATAL ERROR: Cannot load libmkl_avx2.so or libmkl_def.so.

解决方法

从现象看是找不到符号表。检查 envs/py27/lib/ 目录,可以看到 libmkl* 开头的 lib 有好多。至少 libmkl_avx2.so 和 libmkl_def.so 都在。排除缺少库的问题。

nm -D 查看 libmkl 开头的库,可以看到 mkl_sparse_optimize_bsr_trsm_i8 这个 symbol 出现了很多次,带实现的也有,找不到符号怎么看都不应当。

去 anaconda 官方文档看了下。有提到 mkl 模式默认安装的,如果出问题建议安装 nomkl 这个包,然后卸载所有 mkl,mkl-service 两个包。这个方法实际是用另一个同样功能的库取代 mkl。部分应用场景能解决问题,然后我的问题用该方法不能解决。

find libmkl 试了下,发现在 anaconda3/lib/ 目录下也有 mkl 相关的 lib,而且多了一个 libmkl-core.so 的 so,查了下,这个是 mkl 官方的包。对比了 env 下的 mkl 和这个 mkl 包的区别,发现很多包都是不一样大小的,想到以前做嵌入式开发时遇到的包中的符号表被删除的现象,决定使用这个官方包试试。

设置 LB_PRELOAD 环境变量,使用以下两个包替换默认的 env 下的包,问题解决。

export LD_PRELOAD=~/anaconda3/lib/libmkl_core.so:~/anaconda3/lib/libmkl_sequential.so

正文完
 0