はじめに
最近は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が必須です。
構成
ハードとソフトウェアの構成です。
ハード
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
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
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
ライセンスマネージャーを起動します。
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