Как вызвать исполняемый файл MATLAB для Python на кластере?


Я использую python-matlab-bridge, который вызывает MATLAB из python, запуская его на сокете ZMQ. На моем собственном компьютере я передаю мосту расположение исполняемого файла (в данном случае MATLAB 2014B):

executable='/Applications/MATLAB_R2014b.app/bin/matlab'

И все работает так, как требуется, и печатное утверждение:

Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge-49ce56ed-f5b4-43c4-8d53-8ae0cd30136d
Теперь я хочу сделать то же самое на кластере. Через module avail я нахожу, что есть две версии MATLAB (2015a и 2016b), доступные и расположенные по следующему пути:
/opt/ud/LOCAL/etc/modulefiles/matlab.

Когда я сейчас вызовите MATLAB с помощью:

executable='/opt/ud/LOCAL/etc/modulefiles/matlab/MATLAB_R2015a.app/bin/matlab'

Ошибка:

 Starting MATLAB on ZMQ socket ipc:///tmp/pymatbridge-95775445-359d-441f-803a-7193eedbf215    
Send 'exit' command to kill the server
............................................................MATLAB session timed out after 60 seconds
Возвращается

. Он не может найти исполняемый файл MATLAB. Как действовать дальше?

2 2

2 ответа:

Шаг 0:

Проверьте, хорошо ли работает сегмент кода, отвечающий за "удаленный" запуск MATLAB - подробнее о params, проверьте pymatbridge.py:

    ### class _Session( object ): _____________________________
    ...

    def _run_server(self):
        code = self._preamble_code()
        code.extend([
            "matlabserver('%s')" % self.socket_addr
        ])
        command = '%s %s %s "%s"' % ( self.executable,
                                      self.startup_options,
                                      self._execute_flag(),
                                      ','.join( code )
                                      )
        subprocess.Popen( command,
                          shell  = True,
                          stdin  = subprocess.PIPE,
                          stdout = subprocess.PIPE
                          )

Если такой вызов работает на любом узле кластера, который вы попытаетесь использовать в массово распределенном сценарии MATLAB, проблема переходит в часть обмена сообщениями ZeroMQ, если нет, удаленный сервер просто не может запустить _Session, в то время как обмен сообщениями ( и все это { ipc:// | tcp:// | pgm:// | epgm:// | vmci:// } транспортные классы, доступные для a массово-распределенные вычисления) не стоит винить.

Шаг 1:

Если на шаге 0 ( в subprocess.Popen(...) вызова ) хорошо работает на всех удаленных узлах, проверьте все ZeroMQ / pymatbridge предпосылки ( динамический загрузчик настройки - добавлены строки для всех удаленных узлах кластера' .bash_profile ( или похожий файл для соответствующей оболочки ).

Да, утомительная задача-доказать, что все удаленные узлы в кластере отвечают этим требованиям, но без проверки этих требований нет гарантии, что удаленный узел сможет управлять удаленный процесс MATLAB, подключенный с помощью умного и мощного инструмента, такого как pymatbridge is.

В конце концов я нашел метод, который работает очень просто. В.скрипт pbs я загружаю модуль MATLAB с помощью

module load matlab/2015a

Затем в скрипте Python команда

mlab = Matlab()

Автоматически определяет правильный путь MATLAB. Таким образом, мне не нужно указывать путь, используя необязательный аргумент executable.