我正在使用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。
最诚挚的问候,以赛亚
答案 0 :(得分:2)
许多事情可能在这里出错。我不知道朱莉娅,但以下是可以在朱莉娅之外尝试解决的方法:
libcplex*transport.so
中包含各种libcplex*worker.so
和LD_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。