【问题标题】:cvxopt uses just one core, need to run on all / somecvxopt 只使用一个核心,需要在所有/一些上运行
【发布时间】:2019-12-17 11:00:40
【问题描述】:

我在 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 并再次启动我的程序,但仍然是一个核心。重新启动服务器本身有点困难。我没有对服务器的 root 访问权限。

我从一家公司的内部仓库安装了cvxopt,它应该是 PyPI 的镜像。以下库安装在/usr/libliblapack, liblapack_atlas, libopenblas, libblas, libcblas, libatlas

【问题讨论】:

    标签: glpk cvxopt


    【解决方案1】:

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

    作为 cvxopt only supports GLPK 作为开源混合整数编程求解器,你运气不好。

    您也可以使用 CoinOR 的 Cbc,它通常是比 GLPK 更好的求解器,同时仍然是开源的。这个也可以用并行化编译。请参阅some benchmarks,这也表明 GLPK 确实没有并行支持。

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

    那些:

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

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

    (恕我直言,GIL 无关紧要,因为所有这些都是 C 扩展,而 GIL 不在其中)

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2016-10-29
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多