我在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
。
答案 0 :(得分:2)
Here一些SO用户写道GLPK不是多线程的。这是默认使用的求解器,因为cvxopt没有自己的MIP求解器。
作为cvxopt only supports GLPK作为开源混合整数编程求解器,您很不走运。
或者,您可以使用CoinOR的Cbc,它通常比GLPK更好,但仍是开源的。也可以使用并行化来编译这一代码。参见some benchmarks,这也表明GLPK确实没有并行支持。
但是由于cvxopt不支持,因此您将需要一些备用访问点:
那些:
此外:不要期望多线程会带来太多收益。通常,它比线性加速要差得多(对于所有并非基于蛮力的组合优化问题)。
(我不知道GIL没关系,因为所有这些都是C扩展,而GIL却没有碍事)
答案 1 :(得分:1)
Python程序的执行仅在单个内核中进行。这是由于臭名昭著的Global Interpreter Lock或GIL造成的。这适用于“常规”顺序程序和多线程程序。
如果要在Python环境中利用多个内核,则有两个选择: