如何在集群上为 Python 调用 MATLAB 可执行文件?

How to call MATLAB executable for Python on cluster?

我正在使用 python-matlab-bridge,它通过在 ZMQ 套接字上启动它从 python 调用 MATLAB。在我自己的计算机上,我将可执行文件(在本例中为 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 可执行文件。如何进行?

第 0 步:

检查负责 "remote" 启动 MATLAB 的代码段是否正常 - 有关参数的详细信息,请检查 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:// } 传输-类 可用于大规模分布式计算)不应该受到指责。

第 1 步:

如果步骤 0(subprocess.Popen(...) 调用)在所有远程节点上运行良好,请检查所有 ZeroMQ/pymatbridge 先决条件(动态加载程序设置 - 添加的行到所有远程集群节点的 .bash_profile(或相应 shell 的类似文件)。

是的,证明集群上的所有远程节点都满足这些是一项繁琐的任务,但如果不检查这些,就无法保证远程节点可以操作通过其他智能且强大的工具连接的远程 MATLAB 进程,例如 pymatbridge是。

最后我找到了一个非常简单有效的方法。在 .pbs 脚本中,我使用

加载 MATLAB 模块
module load matlab/2015a

然后在 Python 脚本中执行命令

mlab = Matlab()

自动检测正确的 MATLAB 路径。因此,我不需要使用可选的 executable 参数指定路径。