【发布时间】:2019-05-24 12:40:56
【问题描述】:
我正在使用 IBM CPLEX 12.9、Julia Language v1.1.0 和 JuMP 设置并行优化环境。为了开始本地优化,我目前正在使用库 CPLEX.jl,它提供连接(在后台使用 C 调用)以在本地优化某些模型。我们称这台机器为 A。
但是,我正在尝试在远程机器上启动优化,这意味着当我在 A 上启动优化时,Julia 将调用安装在机器 B(具有更多内存、cpu 等)上的 CPLEX。
查看 CPLEX 文档,我看到对于局部优化,我们调用函数
CPXopenCPLEX(int * status_p)
由 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 中。
我尝试的是实现一个类似的函数,该函数将使用正确的值调用 CPXopenCPLEXremote 代替 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 连接上通知我的用户和密码。(我稍后会更新这个问题)
感谢大家的帮助。如果可行,我将为社区创建库 CPLEXremote.jl。
最好的问候,伊萨亚斯
【问题讨论】:
-
调用
CPXXopenCPLEXremote后status_p的值是多少?这可能会为您提供有助于诊断问题的错误代码。如果您还没有看过它,这里有大量关于远程对象 here 的文档。 -
顺便说一句,听起来您关于配置自动 ssh 连接的后续问题应该在一个新问题中提出,而不是在此处附加。
标签: julia cplex julia-jump