使用julia连接到CPLEX远程API

时间:2019-05-24 12:40:56

标签: julia cplex julia-jump

我正在使用IBM CPLEX 12.9,Julia语言v1.1.0和JuMP设置并行优化环境。要开始局部优化,我目前正在使用库CPLEX.jl提供连接(在后台使用C调用)以局部优化某些模型。我们称这台机器为A。

但是,我试图在远程计算机上启动优化,这意味着当我在A上启动优化时,Julia将调用安装在计算机B上的CPLEX(具有更多的内存,cpus等)。 / p>

查看CPLEX文档,我已经看到对于局部优化,我们将函数称为

CPXopenCPLEX(int * status_p)

由lib libcplex1290.so提供。对于远程连接,CPLEX通过功能

提供了另一个接口来连接到外部服务器。
CPXopenCPLEXremote(char const * transport, int argc, char const *const * argv, int * status_p)

CPLEX.jl软件包仅支持本地优化,并且使用CPXopenCPLEX()函数。在寻找此软件包时,通过以下命令与本地CPLEX安装进行连接:

ccall(("CPXopenCPLEX",libcplex),Ptr{Cvoid}, (Ptr{Cint},),stats)

其中libcplex =“ / opt / ibm / ILOG / CPLEX_Studio129 / cplex / bin / x86-64_linux / libcplex1290.so”,而stats是一个数组{Int32,1}。该命令位于程序包CPLEX.jl的cpx_env.jl文件中。

我尝试过的是实现一个类似的函数,该函数将使用正确的值调用CPXopenCPLEX的远程实例。我的Julia1.1代码如下:

const libcplex = "/opt/ibm/ILOG/CPLEX_Studio129/cplex/bin/x86-64_linux/libcplex1290remote.so"

 argv=["/usr/bin/ssh", "IP_OF_REMOTE_MACHINE","/opt/ibm/ILOG/CPLEX_Studio129/cplex/bin/x86-64_linux/cplex", "-worker=process"]


ret= ccall(("CPXopenCPLEXremote",libcplex),Ptr{Cvoid}, (Ptr{Cchar},Cint,Ptr{Ptr{Cchar}},Ptr{Cint},),"processtransport",Int32(4),argv,stats)

问题是ret = Ptr {Nothing} @ 0x0000000000000000,表示连接未成功。

我很确定问题出在给ccall()调用CPXopenCPLEXremote的方式上。

在通话中有经验的人可以帮我提供参数吗?

我还在为ssh连接配置自动识别。现在,我必须在从机器A到远程机器B的每个ssh连接上通知我的用户名和密码。(我将在稍后更新此问题)

谢谢大家的帮助。如果可以的话,我将为社区创建lib CPLEXremote.jl。

最诚挚的问候,以赛亚

1 个答案:

答案 0 :(得分:2)

许多事情可能在这里出错。我不知道朱莉娅,但以下是可以在朱莉娅之外尝试解决的方法:

  • 您肯定需要无密码的ssh连接。您无法通过CPLEX远程对象API提供用户名/密码。 here文档中对此进行了提及。
  • 在两台机器上,请确保不仅安装了CPLEX,而且还包含libcplex*transport.so中包含各种libcplex*worker.soLD_LIBRARY_PATH库的文件夹。远程目标代码必须在运行时动态加载这些库。
  • 出于调试目的,将环境变量ILOG_CPLEX_REMOTE_OBJECT_TRACE设置为99。这应该提供有关发生的错误的更多信息。
  • 尝试将-stdio-namedpipes=.添加到命令行。
  • 看一下示例cplex/examples/src/remotec/parmipopt.c。这基本上可以完成您打算做的事情。它还涉及用户功能,因此它比您计划的要复杂一些。
  • 看示例cplex/examples/src/remotec/parbenders.c,这在求解过程中做的事情比较复杂,但是远程求解器的设置非常简单。您可以通过转到cplex/examples/x86-64_linux/static_pic并说出make -f Makefile.remote remote-run-parbenders来运行此示例。从此开始并尝试对其进行修改是一个好主意,以便它不仅可以在您的本地主机上运行,​​而且实际上可以正确连接到远程计算机。这使茱莉亚脱离了画面。完成这项工作后,请回到Julia并找出如何从那里调用CPLEX。