You need to enable JavaScript to run this app.
最新活动
大模型
产品
解决方案
定价
生态与合作
支持与服务
开发者
了解我们

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脚本

另外,MKL有时会优先读取OMP_NUM_THREADS变量,也可以同时设置:

export OMP_NUM_THREADS=4

2. 检查普通用户的系统资源限制

普通用户可能受到系统资源限制,导致无法创建多线程:

  • 运行ulimit -u查看最大用户进程数,普通用户的数值通常远低于root
  • 如果数值过小,修改/etc/security/limits.conf,添加:
    username soft nproc 4096
    username hard nproc 16384
    
    username替换成你的普通用户名,之后重新登录普通用户即可生效

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

火山引擎 最新活动