cvxopt仅使用一个内核,需要在所有/某些内核上运行

时间:2019-12-17 11:00:40

标签: glpk cvxopt

我在Python 3.6.6中调用cvxopt.glpk.ilp,cvxopt == 1.2.3解决了约500k布尔变量的布尔优化问题。它可以在1.5小时内解决,但似乎只能在一个内核上运行!如何使它在所有或特定的一组内核上运行?

装有Linux Ubuntu x86_64的服务器具有16或32个物理核心。我的进程亲和力是64核(我想是由于超线程)。

> grep ^cpu\\scores /proc/cpuinfo | uniq
16
> grep -c ^processor /proc/cpuinfo
64
> taskset -cp <PID>
pid <PID> current affinity list:  0-63

然而,top仅显示我的进程的100%CPU,htop显示只有一个内核100%繁忙(某些内核可能由其他用户稍微加载了)。

我设置了OMP_NUM_THREADS=32并再次启动了程序,但仍然是一个核心。重新启动服务器本身有点困难。我无权访问服务器。

我从公司的内部仓库安装了cvxopt,该仓库应该是PyPI的镜像。 /usr/lib中安装了以下库:liblapack, liblapack_atlas, libopenblas, libblas, libcblas, libatlas

2 个答案:

答案 0 :(得分:2)

Here一些SO用户写道GLPK不是多线程的。这是默认使用的求解器,因为cvxopt没有自己的MIP求解器。

作为cvxopt only supports GLPK作为开源混合整数编程求解器,您很不走运。

或者,您可以使用CoinOR的Cbc,它通常比GLPK更好,但仍是开源的。也可以使用并行化来编译这一代码。参见some benchmarks,这也表明GLPK确实没有并行支持。

但是由于cvxopt不支持,因此您将需要一些备用访问点:

那些:

  • 具有非常不同的建模样式(从完全低级的cylp到非常高级的cvxpy)
  • 我不确定是否所有这些构建都使用 enable-parallel 进行编译(编译Cbx时需要)

此外:不要期望多线程会带来太多收益。通常,它比线性加速要差得多(对于所有并非基于蛮力的组合优化问题)。

(我不知道GIL没关系,因为所有这些都是C扩展,而GIL却没有碍事)

答案 1 :(得分:1)

Python程序的执行仅在单个内核中进行。这是由于臭名昭著的Global Interpreter Lock或GIL造成的。这适用于“常规”顺序程序和多线程程序。

如果要在Python环境中利用多个内核,则有两个选择:

  • 使用multiprocessing模块,该模块可以通过在单独的进程中运行程序来并行化程序
  • 选择另一种不具有GIL并允许多线程的Python实现(即JythonIronPython