Twitterに投稿 はてなブックマークに追加 Google Bookmarksに追加

目次 >> AWS >> AWS ParallelClusterへのジョブの投入

AWS ParallelClusterへのジョブの投入

ジョブの投入

qhostでクラスターのノードの立ち上がり状況を見ることができる。

あとは、プログラムを書いて、gcc、g++などでコンパイルし、qsubでジョブを投入する。
この際に
Unable to run job: warning: ec2-user's job is not allowed to run in any queue
と出るかもしれないが、しばらくすると計算ノードが立ち上がり実行される。
計算ノードにスポットインスタンスを使うと立ち上がりが少し遅いようである。今回はジョブの投入から最初の計算ノードが立ち上がるのに10分ほどかかった。

シングルスレッドのいわゆる通常のジョブの実行方法

a.outを実行ファイルとする。
まず、a.outのあるディレクトリに下記のようなテキストファイルを作る。ここでは、ファイル名はjobscrpt.shとする。

#!/bin/bash
#$ -cwd
#$ -o out.log
#$ -e err.log
./a.out

#$でオプションを指定する。

-cwdはカレントディレクトリを示す。これをつけないと、ホームディレクトリにすべてのファイルが出力されてしまう。

-oは標準出力(すなわち通常は画面に表示されるもの)を書き込むファイルを指定する。

-eは標準エラー出力を書き込むファイルを指定する。

最後は、実行ファイルである、-cwdが指定されているので、./でよいが、-cwdを指定していない場合はルートディレクトリからフルパスで書く必要がある。

ジョブの投入はqsubコマンドで

$ qsub jobscrpt.sh

のようにする。

ジョブの状況は、

$ qstat

で表示できる。statusがrになっていれば実行中である。qwであれば、キュー内で待機中である。

OpenMPを使ったジョブの実行方法

マルチスレッドのジョブを投入するには-pe smpオプションを使う。

#!/bin/bash
#$ -cwd
#$ -o out.log
#$ -e err.log
#$ -pe smp 4
./a.out

ここれは4スレッドを使うよう指示している。これにより、4つ以上空きのある計算ノードを順次埋めていくことになる。

この-peオプションの詳細は

$ qconf -sp smp
pe_name            smp
slots              999
user_lists         NONE
xuser_lists        NONE
start_proc_args    NONE
stop_proc_args     NONE
allocation_rule    $pe_slots
control_slaves     TRUE
job_is_first_task  TRUE
urgency_slots      min
accounting_summary TRUE
qsort_args         NONE

OpenMPIを使う

AWS ParallelClusterのマスターノードにはMPIに関するコマンドなどは既にインストールされているが、デフォルトの状態ではmpic++などは使えない。
MPI関連のコマンドを有効にするにはマスターノードで

$  load_openmpi 

と打つ。これでmpic++などを使ってコンパイルできるようになる。ログインするたびに打つ必要があるので、頻繁に使う場合は.bash_profileなどに書いておくとよい。

OpenMPIの環境に関する詳細な情報は

$ ompi_info

コマンドで表示することができる。

OpenMPIを使ったジョブの実行方法

MPIを使ったジョブを投入するには、-pe mpiで使用するCPU数を指定する。(SGEで一般的な-pe orteではないので注意)
そして、mpiexecは古パスで記述する。

#!/bin/bash
#$ -cwd
#$ -o out.log
#$ -e err.log
#$ -pe mpi 8
/usr/lib64/openmpi/bin/mpiexec -np 8 ./a.out

ここでは、8つのCPUを使用するよう指定している。
mpiexecで-npでも同じ数を指定するのを忘れずに!

この-peオプションの詳細は

$ qconf -sp mpi
pe_name            mpi
slots              99999
user_lists         NONE
xuser_lists        NONE
start_proc_args    NONE
stop_proc_args     NONE
allocation_rule    $fill_up
control_slaves     TRUE
job_is_first_task  FALSE
urgency_slots      min
accounting_summary FALSE
qsort_args         NONE

OpenMPIとOpenMPを併用したジョブの実行方法

MPIとOpenMPを併用したジョブを投入するには、-pe makeオプションを指定する。

#!/bin/bash
#$ -cwd
#$ -o out.log
#$ -e err.log
#$ -pe mpi 64
/usr/lib64/openmpi/bin/mpiexec --bynode -np 8 ./ucc

こうすると、8つのノードにジョブが投入され、それぞれのノードではOpenMPを使って、マルチスレッドで実行することができる。-pe mpiの後には、トータルでのCPU数を指定(ノード数×各ノードのCPU数)する。なお、この数値が大きい場合、1時間以内に指定のノード数が立ち上がらない場合がある。その場合、最初に立ち上がったノードから削除されていくので永遠に指定ノード数に達しないことになる。その場合は、AWSのAuto Scalingグリープの設定画面で、「希望」数を指定し、手動で立ち上げてやればよい。また、最後の行の--bynodeは各ノードに一つずつ実行することを指定している。この指定がないと、一つのノードに多数(CPU数分)が実行されることになる。

ジョブが終了したらメールで知らせる

mailコマンドが使えるのでCならばsystem関数を使い、

system("echo "メッセージ" | mail -s testsubject hoge@example.com");

ような形でプログラム終了時にメールを自分あてに送るとよい。

ジョブの削除

ジョブを削除したい場合は、

qdel ジョブID

で削除する。ジョブIDは複数を一度に指定することもできる。

qstatで見たときに状態がdrになったまま残り続ける時がある

その時は-fをつけてやると、強制削除する。

qdel -f ジョブID

ジョブあるいはホストが削除できないときは?

通常は、qdelもしくはそれに-fオプション(強制削除)でジョブを削除することができるが、例えば、スポット価格が上昇して強制的にノードが終了した場合、qdelではジョブを削除できない場合がある。
また、ホストもこの場合リストに残り続ける。

どうしても削除できないジョブを削除するには

/opt/sge/default/spool/qmaster/jobs/00/0000

内のフォルダを消す。

残ってしまったホストは

/opt/sge/default/spool/qmaster/exec_hosts

内の該当するホスト名に対応するファイルを消す。


最終更新日


本文中のFC4はFedora ProjectのFedora Core 4を、FC5はFedora Core 5を、FC6はFedora Core 6をopenSUSEはNovellのSUSE Linux OSSを表します。Fedora7以降は、単にFedora7、Fedora8、Fedora9、Fedora10、Fedora11、Fedora12、Fedora13、Fedora14、Fedora15と表示しています。Ubuntuは、必要に応じて20.04、21.04のようにバージョン番号をつけて区別しています。

ここに登場するドメイン名やIPアドレスなどはフィクションです。実在の人物・団体等とは一切関係がありません。
実際に使用する際は、各自の環境に合わせて書き換えてください。
もし何か間違いなどありましたらこちらからご連絡ください
リンクに許可は不要です。
Copyright (C) 2021 Chikuma Engineering Co., Ltd. All Rights Reserved.