Ubuntu下Intel Python的MKL多线程权限异常:普通用户线程数受限
解决Intel Python在普通用户下MKL线程数受限的问题
针对你在Ubuntu 16.04.4 + Intel Python 3.6.3环境中遇到的问题——root身份运行时MKL_NUM_THREADS正常生效,但普通用户运行时mkl_get_max_threads返回1、矩阵乘法仅用单线程,且调用mkl_set_num_threads始终无效,我整理了几个实用的排查和解决方向:
1. 确认环境变量的全局生效性
首先要确保普通用户的MKL_NUM_THREADS是真正全局生效的:
- 先在普通用户终端执行
echo $MKL_NUM_THREADS,确认输出是你期望的线程数(比如4、8) - 如果输出为空或不符合预期,把变量添加到普通用户的shell配置文件里:
- 若是bash环境,编辑
~/.bashrc,添加一行:export MKL_NUM_THREADS=4(把4换成你的CPU核心数) - 执行
source ~/.bashrc让配置立即生效,再重新运行Python脚本
- 若是bash环境,编辑
另外,MKL有时会优先读取OMP_NUM_THREADS变量,也可以同时设置:
export OMP_NUM_THREADS=4
2. 检查普通用户的系统资源限制
普通用户可能受到系统资源限制,导致无法创建多线程:
- 运行
ulimit -u查看最大用户进程数,普通用户的数值通常远低于root - 如果数值过小,修改
/etc/security/limits.conf,添加:
把username soft nproc 4096 username hard nproc 16384username替换成你的普通用户名,之后重新登录普通用户即可生效
3. 调整mkl_set_num_threads的调用时机
mkl_set_num_threads必须在导入任何依赖MKL的库(比如numpy、scipy)之前调用,否则MKL已经完成初始化,设置不会生效。正确的代码示例:
import ctypes # 加载MKL核心库 mkl_rt = ctypes.CDLL('libmkl_rt.so') # 设置线程数为4 mkl_rt.mkl_set_num_threads(ctypes.byref(ctypes.c_int(4))) # 之后再导入numpy等依赖库 import numpy as np # 验证线程数是否生效 print(mkl_rt.mkl_get_max_threads())
4. 排查MKL配置文件的差异
Intel MKL会读取特定路径下的配置文件,root和普通用户的配置可能存在差异:
- 检查普通用户home目录下是否有
~/.intel/mkl.conf,如果存在,查看里面是否有MKL_NUM_THREADS=1这类限制线程数的配置 - 同时检查系统级的MKL配置文件
/etc/intel/mkl.conf,确保没有全局限制线程数的设置
5. 对比root与普通用户的MKL配置信息
运行以下代码,分别在root和普通用户身份下执行,对比输出差异,确认普通用户的MKL是否正确加载了多线程支持:
import numpy as np np.__config__.show()
重点关注blas_mkl_info部分的线程相关配置,看两者是否一致
内容的提问来源于stack exchange,提问作者novog




