让所有的MATLAB用户都能用集群做并行计算

时间:2024-03-19 12:46:57

学院的计算平台(一期)运行已经一年了,麻雀虽小五脏俱全。本来以为大家有GPU需求的差不多都会自己买上一两台GPU服务器(我自己还有一台K40×2的古董呢),所以一期建设只有刀片和FPGA,但是现在大家都玩深度学习了,对GPU的需求很旺,赶紧二期来一台V100×4,下学期应该就能跑起来啦。

言归正传,虽然目前没有GPU,但是CPU上跑MATLAB的需求还是有的,但是目前的用户们,仅停留在写串行的MATLAB程序,最多把能够数据并行的程序多提交几个作业,每个处理一部分数据,算是实现手工并行。我个人对MATLAB不是很熟,但是也看到了它能够配置集群系统,而且有parfor的并行方式。而且,印象中工程师已经对MATLAB做了初步的并行配置,但需要具体的应用实践检验。正好最近有用户提出了这个需求,于是期末稍闲下来,决定把MATLAB的集群并行计算搞定。

共用配置

首先,解决多用户共用配置的问题。默认,在每个用户的家目录下,会有个隐藏目录.matlab,里面再有一个MATLAB版本号的目录,如R2017b,这个目录里面保存了当前用户的配置,包括parallel.settings这个关于并行配置的XML文件。在下图的界面中做的配置,都会保存在这个文件中。
让所有的MATLAB用户都能用集群做并行计算
为了能够让所有用户共享同一个集群配置,我把这个配置文件的目录复制到/opt下,然后各个用户家目录下相应的位置通过软链链接过去,如下图所示。
让所有的MATLAB用户都能用集群做并行计算

这里注意两点:

  1. 为了不让普通用户随意修改配置,配置文件全都设置为644的root权限。
  2. 为了保留备份、方便测试等,root下的配置没有做软链,还在自己家目录下。如果有修改,手工将相应文件复制到/opt下。

只有root能够启动并行池。。。

其实,这个才是这篇博客想要记录的核心问题。也是困扰了我三天最后终于解决的问题。
先描述一下:用root用户启动的MATLAB,可以正常启动并行池,如下图所示。
让所有的MATLAB用户都能用集群做并行计算
然而,换成普通用户,就变成下图的熊样子。。。。
让所有的MATLAB用户都能用集群做并行计算
最下面的错误信息很有迷惑性:无效的属性默认值。翻遍了配置文件也没看出来哪里无效,而且人家root怎么就有效呢?

那个警告很惹人注目:无法打开伪tty(MATLAB was unable to open a pseudo-tty)。一开始不懂这个伪tty是啥,但看得出来是类似于linux中的用户会话、控制台等之类的东西。这个信息反复出现,困扰我很久。百度、谷歌查到的不多,老外有遇到这个问题解决了的,却是因为盘没挂好。。。但既然root能行而普通用户不行,感觉应该是权限上的问题,最后证明这个大方向把握得还是准确的。

后来,试图顺着警告信息,点开代码看,发现发生警告的地方,都是类似于system(cmd)这种语句,也就是在系统里执行cmd命令。给代码文件增加写权限,在执行命令之前增加disp(cmd)显示命令,发现无非是调用脚本查询MATLAB自己的进程信息之类的操作,复制出来在linux下执行,完全没有问题。这说明命令本身没有权限问题。

查到tty等会话的位置,是在/dev下,于是进去查看一大堆终端、控制台,根据它们时间的变化,找出了一个目录shm和一个文件ptmx,会在MATLAB创建并行池时时间发送变化。这里,还发现目录shm的权限,最后一个字符是t,感觉很奇怪,于是搜到这篇博文《linux权限补充:rwt rwT rws rwS 特殊权限》学习了一下,并按照里面的说法,给ptmx文件增加s权限,但没解决问题。

通过各种关键词组合搜索,最终终于明白了所谓伪tty的概念,其中最有用的要数这个邮件《Re: sarge in chroot》和这篇文档《ptmx(4) - Linux man page》,通过它们,了解了伪tty的概念、原理,以及涉及到的文件和目录。到这里,我才知道/dev下还有个目录pts,是保存新建的tty会话的,但该目录本身的日期时间没有变化,所以上面在/dev目录下的查找才没注意到它。查看/dev/pts目录下的文件,果然有几个由普通用户创建的文件。除了上面两个文档,还有《[Solved] No /dev/ptmx in FreeBSD 10》和《Konsole (and some other virtual terminals) not working correctly.》也都提到了相关内容。

经过分析,整个的问题,应该是MATLAB在初始化并行池时,需要在系统中执行一些命令,而这个操作是要先创建一个伪tty会话,然后在里面执行命令的。普通用户就卡在创建伪tty这步上,而创建伪tty的过程,无非是要写/dev/ptmx文件、/dev/pts目录,那么一定是这里的权限出了问题。ptmx文件和pts目录的权限如下图所示。
让所有的MATLAB用户都能用集群做并行计算
让所有的MATLAB用户都能用集群做并行计算
看上去没什么问题,666的权限,相当于所有用户都有读写权限了,但是最后还是抱着试一试的心态,把当前的普通用户加入tty组了,然后重新登录——果然OK了!

到这里,问题算是解决了。但是还是不太明白,为什么666的权限还会卡住普通用户呢?不知哪位大神能为我解惑?

接下来,需要把系统中的所有普通用户都加到tty组中,还要修改初始化用户脚本,把这个操作加进去。