使用 julia 连接到 CPLEX 远程 API
Posted
技术标签:
【中文标题】使用 julia 连接到 CPLEX 远程 API【英文标题】:Connecting to the CPLEX remote API with julia 【发布时间】: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),PtrCvoid, (PtrCint,),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),PtrCvoid, (PtrCchar,Cint,PtrPtrCchar,PtrCint,),"processtransport",Int32(4),argv,stats)
问题是 ret=PtrNothing @0x0000000000000000 表示连接没有成功。
我很确定问题在于我将参数提供给 ccall() 以调用 CPXopenCPLEXremote。
有这种电话经验的人可以帮我设置参数吗?
我还在为 ssh 连接配置自动识别。现在我必须在从机器 A 到远程机器 B 的每个 ssh 连接上通知我的用户和密码。(我稍后会更新这个问题)
感谢大家的帮助。如果可行,我将为社区创建库 CPLEXremote.jl。
最好的问候,伊萨亚斯
【问题讨论】:
调用CPXXopenCPLEXremote
后status_p
的值是多少?这可能会为您提供有助于诊断问题的错误代码。如果您还没有看过它,这里有大量关于远程对象 here 的文档。
顺便说一句,听起来您关于配置自动 ssh 连接的后续问题应该在一个新问题中提出,而不是在此处附加。
【参考方案1】:
这里很多事情都可能出错。我不认识 Julia,但这里有一些可以在 Julia 之外尝试解决的方法:
您肯定需要无密码的 ssh 连接。您无法使用 CPLEX 远程对象 API 提供用户名/密码。这在文档here 中有所提及。 确保在两台机器上不仅安装了 CPLEX,还确保包含各种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。
【讨论】:
以上是关于使用 julia 连接到 CPLEX 远程 API的主要内容,如果未能解决你的问题,请参考以下文章