HTCondor でMATLAB を実行するとリターンコード1 の結果

クラスターサーバーでの並列処理の技術支援をしていると、たいていの場合はPBS Pro とかTorque 、SLURM 、Grid Engine 、LSF 、のジョブスケジューラを使っていることが多く、システム構築をおこなうSIer が富士通やNEC の場合だと、前者は富士通TCS 、後者だとNQS というお抱えのジョブスケジューラを使っていることもあります。

やはりWeb での情報量だとPBS やSLURM が多く、エラーで困ったときもググればたいていはStack Overflow で解決方法を見つけることができます。

しかし、今回は「HTCondor」の案件が来ました。こちらもオープンソースのジョブスケジューラですが、これまでも存在は知っていましたが、5年以上クラスターサーバーに関わってきましたが、使っているユーザーに出会ったことがなく、初の案件となりました。

まずはテスト環境を構築しようと思い、Debian 10 のマシンにHTCondor をインストールしました。

こちらの記事でvisudo のエディターを変更したことをまとめましたが、そのときと同じDebian です。

HTCondor の公式のインストールガイドに基づき、以下のコマンドを実行します。

curl -fsSL https://get.htcondor.org | sudo /bin/bash -s ----no-dry-runCode language: Bash (bash)

ダウンロードとインストールがおこなわれ、嘘みたいに簡単にセットアップできました。

動作確認をしてみます。

condor_statusCode language: Bash (bash)

【実行結果】

※ホスト名とドメインの表記は変更しています。

Name OpSys Arch State Activity LoadAv Mem ActvtyTime
slot1@hostname.domain.com LINUX X86_64 Unclaimed Idle 0.000 5345 0+00:02:25
slot2@hostname.domain.com LINUX X86_64 Unclaimed Idle 0.000 5345 0+00:02:25
slot3@hostname.domain.com LINUX X86_64 Unclaimed Idle 0.000 5345 0+00:02:25
slot4@hostname.domain.com LINUX X86_64 Unclaimed Idle 0.000 5345 0+00:02:25
slot5@hostname.domain.com LINUX X86_64 Unclaimed Idle 0.000 5345 0+00:02:25
slot6@hostname.domain.com LINUX X86_64 Unclaimed Idle 0.000 5345 0+00:02:25
Total Owner Claimed Unclaimed Matched Preempting Backfill Drain
X86_64/LINUX 6 0 0 6 0 0 0 0
Total 6 0 0 6 0 0 0 0Code language: CSS (css)

CPU が6 コアのマシンなのですが、スロットが1から6まで作られていますね。

続いてキューの確認をします。

condor_qCode language: Bash (bash)

【実行結果】

※ホスト名、ドメイン、ユーザー名の表示は変更しています。

--Schedd: hostname.domain.com : <127.0.0.1:9618?... @ 10/21/21 16:35:28
OWNER BATCH_NAME SUBMITTED DONE RUN IDLE HOLD TOTAL JOB_IDS
Total for query: 0 jobs; 0 completed, 0 removed, 0 idle, 0 running, 0 held, 0 suspended
Total for username: 0 jobs; 0 completed, 0 removed, 0 idle, 0 running, 0 held, 0 suspended
Total for all users: 0 jobs; 0 completed, 0 removed, 0 idle, 0 running, 0 held, 0 suspendedCode language: Bash (bash)

キューのステータス確認も問題なしですね。続いてジョブを投げてみます。

Pythonスクリプトのジョブサンプルはネブラスカ大学のHolland Computer Center のドキュメントを参考にしました。

【ネブラスカ大学】A SIMPLE EXAMPLE OF SUBMITTING AN HTCONDOR JOB

Python スクリプト (hello.py)

#!/usr/bin/env python
import sys
import time
i=1
while i<=6:
        print i
        i+=1
        time.sleep(1)
print 2**8
print "hello world received argument = " +sys.argv[1]Code language: Python (python)

サブミットファイル (hello.sub)

Universe        = vanilla
Executable      = hello.py
Output          = OUTPUT/hello.out.$(Cluster).$(Process).txt
Error           = OUTPUT/hello.error.$(Cluster).$(Process).txt
Log             = OUTPUT/hello.log.$(Cluster).$(Process).txt
notification = Never
Arguments = $(Process)
PeriodicRelease = ((JobStatus==5) && (CurentTime - EnteredCurrentStatus) > 30)
OnExitRemove = (ExitStatus == 0)
Queue 4Code language: JavaScript (javascript)

それでは実行してみます。

condor_submit hello.subCode language: Bash (bash)

【実行結果】

Submitting job(s)....
4 job(s) submitted to cluster 19.Code language: Bash (bash)

よしよし、と思ったのですが、出力ファイル(この場合hello.log.19.0.txt)をcat hello.log.19.0.txtで見てみると、

000 (019.000.000) 2021-10-22 09:38:03 Job submitted from host: <127.0.0.1:9618?addrs=127.0.0.1-9618&alias=hostname.domain.com&noUDP&sock=schedd_144957_0602>
...
001 (019.000.000) 2021-10-22 09:38:09 Job executing on host: <127.0.0.1:9618?addrs=127.0.0.1-9618&alias=hostname.domain.com&noUDP&sock=startd_144957_0602>
...
007 (019.000.000) 2021-10-22 09:38:09 Shadow exception!
Error from slot1@hostname.domain.com: Failed to execute '/home/username/HTCondorTest/hello.py' with arguments 0: (errno=13: 'Permission denied')
0 - Run Bytes Sent By Job
0 - Run Bytes Received By Job
...
012 (019.000.000) 2021-10-22 09:38:09 Job was held.
Error from slot1@hostname.domain.com: Failed to execute '/home/username/HTCondorTest/hello.py' with arguments 0: (errno=13: 'Permission denied')
Code 6 Subcode 13Code language: Bash (bash)

hello.py への実行権限がなくてエラーが出ていました。

ファイルパーミッションに注意

確かに ls -l で確認すると、実行権限(x) が付いていません。chmod で実行権限を付与してみて再度トライすると、cat hello.out.20.0.txt

1
2
3
4
5
6
256
hello world received argument = 0Code language: AsciiDoc (asciidoc)

今度は大丈夫ですね。Python スクリプトをHTCondor に投げるのも確認できました。

続いてMATLAB のジョブをHTCondor に投げてみます。MATLAB にはMATLAB Parallel Server というサーバー製品もあって、そちらはR2020b からHTCondor をサポートしていて、File Exchange でアドオンをダウンロードできます。

ただ、今回のケースはそこまで規模も大きくなく、MATLAB で並列計算させたいということだったので、condor_submit でMATLAB を呼び出すようにします。簡単な例として、バージョン情報を出力させるver コマンドを実行したいと思います。

vi myjob.subCode language: Bash (bash)

でサブミットファイルを以下のように記述します。

executable = matlab
arguments = "-batch 'ver'"
log = myjob.$(Cluster).$(Process).log
output = outfile.$(Cluster).$(Process).txt
error = errors.$(Cluster).$(Process).txt
OnExitRemove = (ExitStatus == 0)
queueCode language: AsciiDoc (asciidoc)

MATLAB を画面無しで呼び出すときはこれまでは「-nodesktop -nosplash -r “コマンド” 」のオプションを付けて実行していましたが、R2019a からは「-batch」という便利なオプションができたのでこれを使います。

これでジョブを投げてみます。

condor_submit myjob.subCode language: Bash (bash)

【実行結果】

しかし、処理はすぐに終わってしまって、出力ファイルのoutfile.x.x.txt は0バイトの空ファイル。

何かがおかしいんです。こちらがログファイル(myjob.x.x.log)の後半部分。

HTCondor でMATLAB を実行するとリターンコード1 の結果
HTCondor でMATLAB を実行するとリターンコード1 の結果

「Job terminated」とか「exit-code 1」とかのログが出ています。batch オプションを付けて実行すると正常終了のリターンコードは0 になるので、何か設定が必要なようです。

このトラブルシューティングに数時間掛かってしまったのですが、原因はサブミットファイルでのgetenv オプションの追加が必要、ということが分かりました。

こちらが問題なく実行できるサブミットファイル(myjob.sub)ですが、ハイライトしたgetenv のオプションを入れればOK です。

executable = matlab
arguments = "-batch 'ver'"
log = myjob.$(Cluster).$(Process).log
output = outfile.$(Cluster).$(Process).txt
error = errors.$(Cluster).$(Process).txt
getenv = true
OnExitRemove = (ExitStatus == 0)
queue
Code language: AsciiDoc (asciidoc)

【実行結果】

ログファイル (myjob.x.x.log)

000 (041.000.000) 2021-10-22 11:09:56 Job submitted from host: <127.0.0.1:9618?addrs=127.0.0.1-9618&alias=hostname.domain.com&noUDP&sock=schedd_144957_0602>
...
001 (041.000.000) 2021-10-22 11:09:59 Job executing on host: <127.0.0.1:9618?addrs=127.0.0.1-9618&alias=hostname.domain.com&noUDP&sock=startd_144957_0602>
...
006 (041.000.000) 2021-10-22 11:10:05 Image size of job updated: 1616592
371 - MemoryUsage of job (MB)
379052 - ResidentSetSize of job (KB)
...
005 (041.000.000) 2021-10-22 11:10:07 Job terminated.
(1) Normal termination (return value 0)
Usr 0 00:00:06, Sys 0 00:00:00 - Run Remote Usage
Usr 0 00:00:00, Sys 0 00:00:00 - Run Local Usage
Usr 0 00:00:06, Sys 0 00:00:00 - Total Remote Usage
Usr 0 00:00:00, Sys 0 00:00:00 - Total Local Usage
0 - Run Bytes Sent By Job
0 - Run Bytes Received By Job
0 - Total Bytes Sent By Job
0 - Total Bytes Received By Job
Partitionable Resources : Usage Request Allocated
Cpus : 0.74 1 1
Disk (KB) : 75 75 56167050
Memory (MB) : 371 1 5345
Job terminated of its own accord at 2021-10-22T02:10:07Z with exit-code0.
Code language: AsciiDoc (asciidoc)

最後の行で、リターンコードが0 (正常終了)になっていますね。

続いて、出力ファイル(outfile.x.x.txt)を見てみましょう。

-----------------------------------------------------------------------------------------------------
MATLAB Version: 9.10.0.1739362 (R2021a) Update 5
MATLAB License Number: xxxxx
Operating System: Linux 4.19.0-17-amd64 #1 SMP Debian 4.19.194-3 (2021-07-18) x86_64
Java Version: Java 1.8.0_202-b08 with Oracle Corporation Java HotSpot(TM) 64-Bit Server VM mixed mode
-----------------------------------------------------------------------------------------------------
MATLAB Version 9.10 (R2021a)
Simulink Version 10.3 (R2021a)
Embedded Coder Version 7.6 (R2021a)
MATLAB Coder Version 5.2 (R2021a)
MATLAB Compiler Version 8.2 (R2021a)
MATLAB Compiler SDK Version 6.10 (R2021a)
Parallel Computing Toolbox Version 7.4 (R2021a)
Signal Processing Toolbox Version 8.6 (R2021a)
Simulink Coder Version 9.5 (R2021a)
Statistics and Machine Learning Toolbox Version 12.1 (R2021a)
Text Analytics Toolbox Version 1.7 (R2021a)Code language: AsciiDoc (asciidoc)

ver コマンドの実行結果であるMATLAB のバージョンが出力されました。

これでHTCondor にMATLAB のジョブが投げられるようになりました。

ここでは、サブミットファイルのarguments に実行したいコマンドを書きましたが、スクリプト(.m)を指定することもできます。

ただ、test.m というスクリプトを実行させたい場合はarguments = "-batch 'test.m'"ではなくarguments = "-batch 'test'"とすることに留意してください。batch オプションでmスクリプトを実行する場合は、拡張子の「.m」を除いた「ファイル名」だけにします。

Categories:

No responses yet

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です