Как вызвать исполняемый файл 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 ответа:
Шаг 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
.