作者:懒得张开眼睛看你 | 来源:互联网 | 2023-09-25 17:39
由于算法计算量太大,电脑单核的计算能力已经无法满足我的需求,于是我考虑用并行计算,使用matlab中提供的local调度器,配和parfor语句,很方便的在一台服务器上实现了8核并行计算,但是很快,我觉得光用一台电脑跑太有限,8核已经很高,而且local调度器上限是有的,现在好像最高12个线程。于是我转而考虑使用分布式计算。matlab提供一个jobmanager调度器,支持一个几十台电脑的小规模计算机集群。一些基本的,按部就班的东西我这里就不说了,看看说明就能懂,我想趁热打铁,把一些容易使人迷茫,出错的地方记录下来。
一、认真看matlab的帮助,特别是链接,一定要看,网页帮助要比本地帮助全很多。
网页帮助中有个pdf文件,会教你如何一步一步使用各种调度器建立计算机集群,这个文件在2011a的帮助中有。之前看的的2008b中没有。
二、matlab中jobmanager调度器所支持的架构
在一个计算机集群(本文中的计算机集群特指基于jobmanager调度器的计算机集群)中,存在三种角色的电脑,一种是cluster,一种是jobmanager,另一种是client。我现在的情况是这样,一台电脑充当cluster、jobmanager和client角色,其他电脑则只扮演cluster,所有电脑通过以太网协议连接。
cluster中通常跑上几个worker,数量一般和cup的核数一样,worker的任务就是完成jobmanager分配给他的计算任务。理论上这些个worker可以在jobmanager上远程建立和销毁。
jobmanager其实就是计算机上跑的一个程序,他管理用户预先设置好的,可以并行计算的任务。我目前发现,计算机集群是一个动态的系统,他是可以动态添加和删除集群中的计算机的。在任务执行期间,是可以添加新的cluster的,这个我试过,删除没试过,我认为应该是可以的,要不然要调度器干嘛。
client就是用户程序所在电脑。程序需要寻找网络中可用的jobmanager,创建任务队列等等。
三、如何节约通信带宽
分布式计算是需要通信支持的,如果每个任务需要同步的数据(包括代码)太多,就挺浪费时间的。最好的办法就是在开启worker之前,先将需要使用的代码数据等都同步到每台cluster上,设置好path,记住,一定是在work打开之前做好同步工作,不然work使用的path是同步之前的路径,无法使用同步好的数据和代码。当然work是可以重启的。如果忘了这个关键的步骤,只能等到程序出错了才知道什么情况,这个代价太大。我现在使用的方法是在每个cluster上,把需要使用的第三方工具都事先安装好,而我经常需要改写的代码则是在任务开启前同步过去的,同步通常需要40s钟时间。代码同步过去之后,每次启动一个任务,只需要同步一个代码所在的path,这个数据量是很少的。
四、练手
如果手头么有建好的计算机集群,那就只能自己建了。如果上来就弄一堆电脑,接网线,上交换机,会有很多不确定因素。我建议先用一台电脑练手。也就是一台电脑扮演cluster、jobmanager以及client角色。 使用127.0.0.1地址寻找本台计算机。
五、其他
有些东西是需要牢记心里的。集群中的电脑matlab版本必须一样,操作系统版本无所谓,第三方工具要在worker开启前就装好,防火墙要小心设置,如果闲麻烦就直接关掉得了。最好的方法是进本地连接的属性的高级选项卡,里面有个关于防火墙的选项,从这里关防火墙最好。 有些杀毒软件会在计算机进入屏保时启动杀毒,这个会抢占计算机资源,是要关掉的。
以上只是个人一些经验总结,不对之处请大家多多指正。我刚起步的时候也是苦于没有方便的文献能够快速入门。我觉得大家可以多多补充,丰富这方面的内容。