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 不支持,您将需要一些替代访问点:
- 拥有基于 C/C++ 的包装器
- pulp
- 二进制安装可用
- python-mip
- 二进制安装可用
- Google's ortools
- 二进制安装可用
- cylp
- cvxpy + cylp
- 可用于 cvxpy 的二进制安装;没有 cylp-build
那些:
- 有非常不同的建模风格(从完全低级的:cylp 到非常高级的:cvxpy)
- 我不确定是否所有这些构建都是使用 enable-parallel 编译的(编译 Cbx 时需要)
此外:不要期望从多线程中获得太多收益。它通常比线性加速更糟糕(对于所有不基于蛮力的组合优化问题)。
(恕我直言,GIL 并不重要,因为所有这些都是 GIL 不妨碍的 C 扩展)
我在 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
。
作为开源混合整数规划求解器的 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 不支持,您将需要一些替代访问点:
- 拥有基于 C/C++ 的包装器
- pulp
- 二进制安装可用
- python-mip
- 二进制安装可用
- Google's ortools
- 二进制安装可用
- cylp
- cvxpy + cylp
- 可用于 cvxpy 的二进制安装;没有 cylp-build
那些:
- 有非常不同的建模风格(从完全低级的:cylp 到非常高级的:cvxpy)
- 我不确定是否所有这些构建都是使用 enable-parallel 编译的(编译 Cbx 时需要)
此外:不要期望从多线程中获得太多收益。它通常比线性加速更糟糕(对于所有不基于蛮力的组合优化问题)。
(恕我直言,GIL 并不重要,因为所有这些都是 GIL 不妨碍的 C 扩展)