使用julia连接到CPLEX远程API

使用julia连接到CPLEX远程API,julia,cplex,julia-jump,Julia,Cplex,Julia Jump,我正在使用IBMCPlex12.9、JuliaLanguageV1.1.0和JuMP建立一个并行优化环境。为了启动本地优化,我目前正在使用库CPLEX.jl,该库提供连接(在后台使用C调用)以本地优化某些模型。我们把这台机器叫做A 但是,我正在尝试在远程机器上启动优化,这意味着当我在a上启动优化时,Julia将调用机器B上安装的CPLEX(具有更多内存、CPU等) 查看CPLEX文档,我发现对于局部优化,我们称之为函数 CPXopenCPLEX(int * status_p) CPXopenC

我正在使用IBMCPlex12.9、JuliaLanguageV1.1.0和JuMP建立一个并行优化环境。为了启动本地优化,我目前正在使用库CPLEX.jl,该库提供连接(在后台使用C调用)以本地优化某些模型。我们把这台机器叫做A

但是,我正在尝试在远程机器上启动优化,这意味着当我在a上启动优化时,Julia将调用机器B上安装的CPLEX(具有更多内存、CPU等)

查看CPLEX文档,我发现对于局部优化,我们称之为函数

CPXopenCPLEX(int * status_p)
CPXopenCPLEXremote(char const * transport, int argc, char const *const * argv, int * status_p)
由lib libcplex1290.so给出。对于远程连接,CPLEX提供另一个接口,通过该功能连接到外部服务器

CPXopenCPLEX(int * status_p)
CPXopenCPLEXremote(char const * transport, int argc, char const *const * argv, int * status_p)
软件包CPLEX.jl仅支持局部优化,并使用cpxopensplex()函数。查找此软件包时,通过以下命令与本地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中

我尝试的是实现一个类似的函数,用正确的值调用CPXOPENPLEXREMOTE而不是CPXOPENPLEXE。我的1.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()提供参数以调用cpxOpenPlexRemote的方式上

有这方面经验的人能帮我确定参数吗

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

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


致以最良好的祝愿,Isaias

这里可能会出很多问题。我不知道Julia,但这里有一些东西可以尝试在Julia之外解决这个问题:

  • 您肯定需要无密码ssh连接。无法使用CPLEX远程对象API提供用户名/密码。文档中提到了这一点
  • 在这两台机器上,确保不仅安装了CPLEX,而且还安装了包含各种
    libcplex*传输.so
    libcplex*工作程序的文件夹。因此
    库位于
    LD\u库路径中。远程对象代码必须在运行时动态加载这些库
  • 出于调试目的,将环境变量ILOG\U CPLEX\U REMOTE\U OBJECT\U TRACE设置为99。这将提供有关所发生错误的更多信息
  • 尝试将
    -stdio
    -namedpipes=。
    添加到命令行
  • 看看示例
    cplex/examples/src/remotec/parmiopt.c
    。这基本上就是你计划做的。它还涉及用户功能,因此比您计划的要复杂一些
  • 看看示例
    cplex/examples/src/remotec/parbenders.c
    这在解决方案过程中会做更复杂的事情,但远程解算器的设置非常简单。您可以通过转到
    cplex/examples/x86-64\u linux/static\u pic
    并说出
    make-f Makefile.remote-run parbenders
    来运行此示例。从这个开始并尝试修改它是一个好主意,这样它不仅可以在本地主机上运行,而且可以正确地连接到远程机器。这让茱莉亚从照片中消失了。一旦你完成了这项工作,回到Julia那里,找出如何从那里调用CPLEX

    • 在这里,很多事情都可能出错。我不知道Julia,但这里有一些东西可以尝试在Julia之外解决这个问题:

      • 您肯定需要无密码ssh连接。无法使用CPLEX远程对象API提供用户名/密码。文档中提到了这一点
      • 在这两台机器上,确保不仅安装了CPLEX,而且还安装了包含各种
        libcplex*传输.so
        libcplex*工作程序的文件夹。因此
        库位于
        LD\u库路径中。远程对象代码必须在运行时动态加载这些库
      • 出于调试目的,将环境变量ILOG\U CPLEX\U REMOTE\U OBJECT\U TRACE设置为99。这将提供有关所发生错误的更多信息
      • 尝试将
        -stdio
        -namedpipes=。
        添加到命令行
      • 看看示例
        cplex/examples/src/remotec/parmiopt.c
        。这基本上就是你计划做的。它还涉及用户功能,因此比您计划的要复杂一些
      • 看看示例
        cplex/examples/src/remotec/parbenders.c
        这在解决方案过程中做了更复杂的事情,但远程解算器的设置非常简单。您可以通过转到
        cplex/examples/x86-64\u linux/static\u pic
        并说出
        make-f Makefile.remote-run parbenders
        来运行此示例。从这个开始并尝试修改它是一个好主意,这样它不仅可以在本地主机上运行,而且可以正确地连接到远程机器。这让茱莉亚从照片中消失了。一旦你完成了这项工作,回到Julia那里,找出如何从那里调用CPLEX

      调用
      CPXXopenCPLEXremote
      后,
      状态p
      的值是多少?这可能会给您一个错误代码,有助于诊断问题。如果您还没有看到,有大量关于远程对象的文档。顺便说一句,关于配置自动ssh连接的后续问题应该在一个新问题中提出,而不是附加在这里。问题是什么