MATLAB Parallel ServerをLinuxを使って構築する方法

MATLAB

はじめに

最近はCPUのコア数も多いので計算量が多くても並列処理で処理速度が上がっています。
MATLABを使うことが多いのでParallel Computing Toolboxを使っていますが、計算量が多いと1台の計算機では遅いことがあります。
MATLABにはクラスターを組むためのMATLAB Parallel Serverがあることを知ったので構築しましたが、Webにあるマニュアルではさっぱり分からず、試行錯誤して動くようになったのでまとめておきます。

MATLAB Parallel Serverとは

以下に詳しく掲載されています。
WindowsとLinuxの混在でも構成でき、ライセンスはworker数で契約します。
1個のworkerがCPUの物理コア1個と対応します。

契約したworkerは、Head nodeやnodeに自由に割り振ることが可能です。
MATLAB Parallel ServerとクライアントPCで使うMATLABは、同じバージョンに揃える必要があります。
クライアントPCではMATLAB Parallel ServerにアクセスするためにParallel Computing Toolboxが必須です。

インストール - MATLAB & Simulink - MathWorks 日本
MATLAB Parallel Server を既存のクラスター インフラストラクチャと統合する

構成

ハードとソフトウェアの構成です。

ハード

Head nodeとnodeにはすべてLinuxを使いました。

- Head node: Linux(Ubuntu 22.04.1 LTS)
- Node: Linux(Ubuntu 22.04.1 LTS)
- Node: Linux(Ubuntu 22.04.1 LTS)
- Node: Linux(Ubuntu 22.04.1 LTS)

ソフトウェア

ソフトウェアの構成です。
ジョブスケジューラはMATLABジョブスケジューラを使います。

- MATLAB R2022b 64bit

Head nodeにライセンスマネージャーもインストールします。
Head nodeとnodeのディレクトリ構成は同じにします。

- Head node
  MATLAB
     /usr/local/MATLAB/R2022b_MPS
     /usr/local/MATLAB/R2022b_MPS/licenses/network.lic
     /usr/local/MATLAB/R2022b_MPS/toolbox/parallel/bin/mjs_def.sh
     /usr/local/MATLAB/R2022b_MPS/toolbox/parallel/bin/admincenter

  Matlab License Manager
     /usr/local/MATLAB/R2022b_LM/etc/license.dat
     /usr/local/MATLAB/R2022b_LM/etc/lmstart
     /usr/local/MATLAB/R2022b_LM/etc/lmdown
     /usr/local/MATLAB/R2022b_LM/etc/lmstat

- node
     /usr/local/MATLAB/R2022b_MPS
     /usr/local/MATLAB/R2022b_MPS/licenses/network.lic
     /usr/local/MATLAB/R2022b_MPS/toolbox/parallel/bin/mjs_def.sh

GUIの設定

MATLABのインストールにGUIが必要なのでLinuxで使えるようにします。

apt install xrdp
systemctl enable xrdp

apt install task-mate-desktop
reboot

また、rootで作業したいのでrootにパスワードを設定します。

sudo passwd root

GUIにrootでログインする設定

デスクトップにMATEを使う場合はディスプレイマネージャーにLightDMを使いますが、GUIにrootでログインする場合はgdm3の方が便利なので変更します。

sudo apt install task-mate-desktop
sudo apt install gdm3


gdm3を設定します。

sudo vi /etc/gdm3/custom.conf

security項目に追記します。

 [security]
 AllowRoot=true

rootでログインできるように、gdm3のパスワード認証を設定します。

sudo vi /etc/gdm3/custom.conf

以下の行をコメントします。

#auth   required        pam_succeed_if.so user != root quiet_success


OSを再起動してrootでログインできるか確認します。

sudo reboot

Matlab License Managerのインストール

Head nodeにライセンスマネージャーをインストールします。
インストールするディレクトリは「/usr/local/MATLAB/R2022b_LM」です。
Mathworksライセンスセンターでライセンスマネージャーをインストールする計算機のMACアドレスをアクティベーションで登録します。
また、MATLAB Parallel Server(ZIPファイル)とライセンスファイル(license.lic)をダウンロードします。

ライセンスマネージャーはroot権限では動作しないので、Head nodeにユーザ(matlab)を追加します。

adduser matlab

ダウンロードしたインストーラーを起動して、右上の「詳細オプション」→「ネットワークライセンスマネージャー」を選択します。
ライセンスファイルは、ダウンロードしたライセンスファイル(license.lic)を指定します。

./install

インストール後、ネットワークライセンスファイル(network.lic)にホスト名などが記述されているかを確認します。
server_nameは/etc/hostnameの内容と同じにします。
ホストIDはMathWorksライセンスセンターで確認できる「ホストID」で、登録したMACアドレスから区切り文字を除いたものです。
27000はポート番号なので、複数のライセンスマネージャーを起動、参照している場合は重複しないように変更します。

cd /usr/local/MATLAB/R2022b_LM/licenses
cat network.lic

以下のようなっているか確認します。

SERVER [server_name] [ホストID] 27000
USE_SERVER
ライセンスマネージャのインストール後に、network.licファイルが作成されません。
Linux/UNIX OSに、ライセンスマネージャのみをインストール・アクティベーションすると、MATLABインストールディレクトリ内にlicensesディレクトリが作成されますが、その中にnetwo...

ライセンスマネージャーを起動します。

cd /usr/local/MATLAB/R2022b_LM/etc
/usr/local/MATLAB/R2022b_LM/etc/lmstart -u matlab

エラーの場合は/var/tmp/lm_TMW.logを確認します。
ライセンスマネージャーを停止後、すぐに起動するとTCPポートのエラーが出ることがあります。
そのときは少し待ってから起動します。

起動後に状態を確認します。

cd /usr/local/MATLAB/R2022b_LM/etc
/usr/local/MATLAB/R2022b_LM/etc/lmstat -a

ライセンスマネージャーを停止します。

cd /usr/local/MATLAB/R2022b_LM/etc
/usr/local/MATLAB/R2022b_LM/etc/lmdown -u matlab
rm -fr /var/tmp/lm_TMW*
rm -fr /var/tmp/lockMLM

DebianやUbuntu20以降で使うとき

MATLABライセンスマネージャーの起動にはLSB(Linux Standard Base)が必要ですが、Debian buster以降やUbuntu20以降ではインストールされていないことがあります。
以下のように/lib64に「ld-lsb-」で始まるファイルがない場合はlsbパッケージのインストールが必要です。

cd /lib64
ls -la

以下のようにインストールします。

Ubuntuの場合
apt install lsb-core

Debianの場合
apt install lsb-base

パッケージをインストールしても/lib64に「ld-lsb」で始まるファイルが存在しない場合は以下の操作が必要です。

cd /lib64
ln -s ld-linux-x86-64.so.2 ld-lsb-x86-64.so.2
ln -s ld-linux-x86-64.so.2 ld-lsb-x86-64.so.3

OS起動時にライセンスマネージャーを自動起動する設定

OSの起動時にライセンスマネージャーが自動で起動するように設定します。
systemdを使うので、新規にファイルを作成します

vi /etc/systemd/system/matlab.service

ファイルの内容は以下のようにします。

[Unit]
Description=MATLAB FlexLM License Manager
After=network.target

[Service]
ExecStart=/usr/local/MATLAB/R2022b_LM/etc/lmstart
ExecStop=/usr/local/MATLAB/R2022b_LM/etc/lmdown
User=matlab
RemainAfterExit=yes

[Install]
WantedBy=multi-user.target

daemonのリロードを行います。

systemctl daemon-reload

作成したスクリプトをテストします。

systemctl status matlab
systemctl enable matlab
systemctl start matlab

エラーが表示されなかったら、OSを再起動して自動起動するかテストします。

reboot

systemctl status matlab

MATLAB Parallel Serverのインストールと設定

Head nodeとnodeで共通です。
root権限でinstallファイルを実行してインストールします。
インストールするディレクトリは「/usr/local/MATLAB/R2022b_MPS」です。

全ての製品をチェックしてインストールします。
インストールでは、ライセンスを購入したメールアドレスとパスワードを入力します。
ライセンスファイルは、ダウンロードした(license.lic)を指定します。

mkdir MATLAB_MPS
cd MATLAB_MPS
unzip matlab_R2022b_glnxa64.zip
./install

network.licの確認

ライセンスマネージャーを参照する設定ファイルnetwork.licの内容を確認します。
SERVER行をライセンスマネージャーの/usr/local/MATLAB/R2022b_LM/etc/license.datと同じにします。

cd /usr/local/MATLAB/R2022b_MPS/licenses
vi network.lic

以下のようにします。

SERVER [server_name] [ホストID] 27000
USE_SERVER

ユーザ作成・設定

MATLABジョブスケジューラーを起動するユーザ(mjsuser)を追加し、必要なディレクトリを作成します。
また、sudoに追記します。

adduser mjsuser
mkdir /home/mjsuser/var
chown -R mjsuser.mjsuser /home/mjsuser/var
visudo

以下を追記。

mjsuser ALL=(ALL:ALL) ALL

SSHの設定

SSHでパスワード認証ができるように設定します。

vi /etc/ssh/sshd_config

以下のように設定します。

PasswordAuthentication yes

sshdを再起動します。

systemctl start sshd

mjs_def.shの設定

MATLABジョブスケジューラやworkerの設定を行います。

cd /usr/local/MATLAB/R2022b_MPS/toolbox/parallel/bin
vi mjs_def.sh

以下を追記します。

PIDBASE="/home/mjsuser/var/run"
LOCKBASE="/home/mjsuser/var/lock/subsys"
LOGBASE="/home/mjsuser/var/log/mjs"
CHECKPOINTBASE="/home/mjsuser/var/lib/mjs"

ジョブスケジューラとworkerの起動

Head nodeからAdminCenterを起動してジョブスケジューラとworkerを制御します。
コマンドラインでも可能ですが、OSの起動時に実行したい場合はコマンドラインで起動スクリプトを作る必要があります。

cd /usr/local/MATLAB/R2022b_MPS/toolbox/parallel/bin
./admincenter

Nodeの追加

「ホスト」→「追加または検索」でHead nodeのIPアドレスを入力します。
「SSH – ユーザ名とパスワードを使用」でユーザ名にmjsuser、mjsuserのパスワードを入力します。
MATLAB Parallel Serverをインストールしたディレクトリが正しいことを確認して登録します。

MATLABジョブスケジューラの追加

MATLABジョブスケジューラで「開始」をクリックします。
スケジューラの名前を入力して、「このMATLABジョブスケジューラを起動するホスト」でHead nodeを選択してOKをクリックします。

workerの登録

ワーカーで「開始」をクリックします。
「新規ワーカーのホスト」でHead nodeにチェックします。
起動するワーカー数を指定してOKをクリックします。

クライアントからの接続テスト

WindowsなどからライセンスがあるMATLAB(Parallel Computing Toolboxは必須)を起動して「ホーム」→「並列」→「クラスターの作成と管理」をクリックします。

クラスターの検出(ネットワーク上にチェック)して作成したクラスターを検出して登録します。
「検証」タブで検証します。

nodeの追加

Head nodeだけの状態で全ての項目でパスしたら、AdminCenterでnodeを追加して同様に検証します。
nodeの設定は既に完了しているのでAdminCenterでnodeを追加するだけとなります。
手順はHead nodeを追加したときと同じです。

ただし、nodeはMATLABジョブスケジューラは不要でworkerだけ登録、起動します。
nodeを追加した状態で全項目でパスしたら完成です。
さらにnodeを増やしたい場合、同様に繰り返して検証します。

動作しない場合の対処

AdminCenterで起動しているworkerを停止してからジョブスケジューラを停止します。
最後に登録しているホストを削除します。

ライセンスサーバーを停止します。

cd /usr/local/MATLAB/R2022b_LM/etc
/usr/local/MATLAB/R2022b_LM/etc/lmdown -u matlab
rm -fr /var/tmp/lm_TMW*
rm -fr /var/tmp/lockMLM

headと全てのnodeで残っているプロセスをkillします。

ps -ef | grep mjsuser
kill -9 [number]

headと全てのnodeで、下記のディレクトリ以下に存在するファイル、ディレクトリを消去します。

rm -fr /home/mjsuser/var/run
rm -fr /home/mjsuser/var/lock/subsys
rm -fr /home/mjsuser/var/log/mjs
rm -fr /home/mjsuser/var/lib/mjs

対象nodeの/usr/local/MATLAB/R2022b_MPS/licenses/network.licの内容を確認します。
ライセンスサーバーを起動します。

sudo systemctl start matlab

AdminCenterでホストを登録、ジョブスケジューラとworkerを開始します。

それでも動作しない場合は対象nodeの/usr/local/MATLAB/R2022b_MPSをリネーム、不要なファイル、ディレクトリを削除してから、MATLAB Parallel Serverをインストールして設定をやり直します。

それでも動作しない場合

上記の設定を行っても動作しない場合は、Linuxのネットワーク設定に誤りがある場合が多いですので、以下の設定を見直してください。

/etc/hosts

設定したホスト名と割り当てたIPアドレスを記述します。

127.0.0.1       localhost
192.168.100.11    aaa.bbb.ccc.ddd       aaa

/etc/hostname

ホスト名「aaa」を記述します。

ネットワーク設定(netplan)

netplanの場合は以下のように設定します。
環境によってeno1は変わります。

vi /etc/netplan/xxx.yaml

内容は以下の通りです。

network:
    version: 2
    renderer: networkd
    ethernets:
        eno1:
            dhcp4: false
            dhcp6: false
            addresses: [192.168.100.11/24]
            routes:
            - to: default
              via: 192.168.100.1
            nameservers:
                addresses: [192.168.100.2, 192.168.100.3]
                search: [bbb.ccc.ddd]

反映させます。

netplan apply

ネットワーク設定(interfaces)

Debianのようにinterfacesで設定する場合は以下の通りです。
環境によってeno1は変わります。

vi /etc/network/interfaces

内容は以下の通りです。

source /etc/network/interfaces.d/*
auto lo
iface lo inet loopback
allow-hotplug eno1
#iface eno1 inet dhcp
auto eno1
iface eno1 inet static
  address 192.168.100.11
  netmask 255.255.255.0
  gateway 192.168.100.1
  dns-domain bbb.ccc.ddd
  dns-nameservers 192.168.100.2 192.168.100.3

内容を反映させます。

ifdown eno1
ifup eno1

/etc/resolv.confも編集します。

domain bbb.ccc.ddd
search bbb.ccc.ddd
nameserver 192.168.100.2
nameserver 192.168.100.3

さいごに

Webのマニュアルを熟読して、動作させるまでが大変でした。
お役に立てれば幸いです。
以下、覚え書きです。

MATLAB Parallel Server

ネットワークライセンスで動作するのでライセンスマネージャーが必須です。
MATLAB Parallel ServerにはMATLABと全てのToolboxが含まれており、(ハードディスクの容量が許すなら)全てインストールすることでクライアントPCで使っている様々なToolboxに対応できます。

AdminCenterでworkerの挙動を見ると、初めにHead nodeのworkerを使い、足りなければ各nodeのworkerにjobを割り振るようです。
また、ぱっと見たところ、MATLABの並列処理に関連する関数には指定したnodeにjobを割り振る機能はありませんでした。
ただ、調べてはいませんが、サードパーティー製のジョブスケジューラを使えばできるかもしれません。

OSの起動時にMATLABジョブスケジューラ、workerが起動するようにスクリプトを作っても良いが、どちらにしても正常に動作しているか確認する必要があるので、コマンドラインでは状態が分かりにくい。
AdminCenterではworkerなどの起動も状態も一目で分かるので、不本意ながらGUIを使うことにしました。

クライアントPCからのアクセスを制限するにはmjs_def.shでSECURITY_LEVELを設定します。
パスワードが必要になり手間が増えるので、今回は利便性を考慮してLevel0で運用しています。

クライアントPC

MATLAB Parallel ServerにアクセスするためにParallel Computing Toolboxが必須です。
MATLAB Parallel Serverにアクセスすると、クライアントPCが使っているMATLABとToolboxのライセンスでMATLAB Parallel ServerのMATLABとToolboxが起動して計算を行います。

Comments