Подключение к удаленному API CPLEX с помощью julia - PullRequest
0 голосов
/ 24 мая 2019

Я настраиваю среду параллельной оптимизации, используя IBM CPLEX 12.9, Julia Language v1.1.0 и JuMP. Чтобы начать локальную оптимизацию, я в настоящее время использую библиотеку CPLEX.jl, которая обеспечивает соединение (с использованием вызовов C на фоне) для локальной оптимизации некоторой модели. Назовем эту машину А.

Однако я пытаюсь запустить оптимизацию на удаленном компьютере, что означает, что когда я запускаю оптимизацию на A, Джулия вызовет CPLEX, установленный на компьютере B (в котором больше памяти, процессорных ресурсов и т. Д.).

Просматривая документацию 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", а статистика представляет собой массив {Int32,1}. Эта команда находится в файле cpx_env.jl пакета CPLEX.jl.

Я попытался реализовать аналогичную функцию, которая будет вызывать CPXopenCPLEX для удаления вместо 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. Сейчас я должен сообщать свой пользователь и пароль при каждом ssh-соединении с компьютера A на удаленный компьютер B. (Я обновлю этот вопрос позже)

Спасибо всем за любую помощь. Если это сработает, я собираюсь создать lib CPLEXremote.jl для сообщества.

С наилучшими пожеланиями, Исайя

1 Ответ

2 голосов
/ 25 мая 2019

Здесь многое может пойти не так. Я не знаю Джулию, но вот что можно попробовать за пределами Джулии, чтобы разобраться в этом:

  • Тебе определенно нужно безшумное ssh-соединение. Вы не можете предоставить имя пользователя / пароль с помощью API удаленного объекта CPLEX. Это упоминается в документации здесь .
  • На обеих машинах убедитесь, что установлен не только 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. Рекомендуется начать с этого и попытаться изменить его, чтобы он не только работал на вашем локальном хосте, но и правильно подключался к удаленной машине. Это убирает Джулию из картины. Когда у вас все получится, вернитесь к Джулии и выясните, как оттуда вызвать CPLEX.
...