cvxopt 仅使用一个核心,需要 运行 all / some

cvxopt uses just one core, need to run on all / some

我在 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

some SO-user writes, that GLPK 不是多线程的。这是默认使用的求解器,因为 cvxopt 没有自己的 MIP 求解器。

作为开源混合整数规划求解器的 cvxopt only supports GLPK,你真倒霉。

或者你可以使用 CoinOR 的 Cbc, which is usually a much better solver than GLPK while still being open-source. This one also can be compiled with parallelization. See some benchmarks 这也表明 GLPK 确实没有并行支持。

但由于 cvxopt 不支持,您将需要一些替代访问点:

那些:

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

此外:不要期望从多线程中获得太多收益。它通常比线性加速更糟糕(对于所有不基于蛮力的组合优化问题)。

(恕我直言,GIL 并不重要,因为所有这些都是 GIL 不妨碍的 C 扩展)