公式のユーザーガイドに書かれている内容を抜粋・加筆して,ABCIの使い方をわかりやすくまとめたものです.
ABCI概要
ABCIを使用する上で関係するノードは,インタラクティブノードと計算ノード.
- インタラクティブノード(別名:エントリーサーバ)
ABCIにジョブを投入する際のコマンドを実行するためのノード
ABCIにログインすると4ノードある内の1つに接続される.低負荷であればデータの整理などにも使用できる. - 計算ノード
ABCIに投入されたジョブを捌くノード
インタラクティブノードは後述のインタラクティブジョブと混同しがちだが別物
計算ノードの仕様
1088ノード
項目 | 詳細 | 個数 |
---|---|---|
CPU | Intel Xeon Gold 6148 (2.4GHz 20C/40T) | 2 |
GPU | NVIDIA Tesla V100 SXM2 16GB | 4 |
メモリ | 384GiB DDR4 2666 MHz RDIMM (ECC) | |
ローカルストレージ | Intel SSD DC P4600 1.6 TB u.2 | 1 |
インターコネクト | InfiniBand EDR (100Gbps) | 2 |
合計 43,520CPUコア,4,352GPU
接続設定
RSA鍵作成
Generating public/private rsa key pair.
Enter file in which to save the key (/home/PCUSERNAME/.ssh/id_rsa): 鍵ペアの保存先(ファイル名まで).デフォルトを使うなら空のままENTER
Enter passphrase (empty for no passphrase): 秘密鍵のパスワード,入力文字は表示されない.なるべく設定する
Enter same passphrase again: 秘密鍵のパスワード再入力,
Your identification has been saved in /home/PCUSERNAME/.ssh/id_rsa.
Your public key has been saved in /home/PCUSERNAME/.ssh/id_rsa.pub.
The key fingerprint is:
SHA256:S5CTcQctnC3rxDEGvzgkknwRjwbER0im4lqYbx6mDWo takami@z4g4
The key's randomart image is:
+---[RSA 3072]----+
| +=o+.ooo=. |
| +oo.+ aO.o |
|o +.= Bo.a |
|oo + o ++. |
|o.. ooS |
|.o o.. |
|o = . |
|.E . |
|+ o |
+----[SHA256]-----+
上記の例の場合,/home/PCUSERNAME/.ssh/にid_rsa(秘密鍵)とid_rsa.pub(公開鍵)が作成される.
公開鍵の登録
ABCIのポータル(https://portal.abci.ai/user/)から設定
公開鍵の登録からファイルアップロードを選択してid_rsa.pub(公開鍵)をアップロード
〜/.ssh/configの設定
~/.ssh/configに下記設定を追記.ファイルがない場合は新規作成.
USERNAME(2箇所)はABCI上の自身のユーザ名.
秘密鍵の場所(~/.ssh/id_rsa:2箇所)は先程作成した場所.
Host abci
HostName es
User USERNAME
IdentityFile ~/.ssh/id_rsa
ProxyCommand ssh -A -i ~/.ssh/id_rsa -W %h:%p USERNAME@as.abci.ai
接続
Last login: Mon Sep 30 20:39:45 2019 from as01-tg0
--------------------------------------------------------------------------------
ABCI Information Date: Oct 04, 2019
--------------------------------------------------------------------------------
Welcome to ABCI system
- Operation Schedule
10/09(Wed) 12:00 - 10/10(Thu) 12:30 Grand Challenge 2019#2
12/10(Tue) - 12/13(Fri) Grand Challenge 2019#3
12/13(Fri) 13:00 - 12/16(Mon) 17:00 Not in Service(Planed Power Outage)
For more information, please see
- https://abci.ai/en/about_abci/info.html (In English)
- https://abci.ai/ja/about_abci/info.html (In Japanese)
- How to use
Please see below for ABCI Users Guide:
- https://docs.abci.ai/en/ (In English)
- https://docs.abci.ai/ja/ (In Japanese)
If you have any questions or need for further assistance,
please refer to the following URL and contact us:
- https://abci.ai/en/how_to_use/user_support.html (In English)
- https://abci.ai/ja/how_to_use/user_support.html (In Japanese)
[USERNAME@es1 ~]$
ユーザ/グループディレクトリ
- ユーザディレクトリ
- /home/USERNAME
- 100GBまで使用可能
- グループディレクトリ
- /groups1/GROUPNAME or /groups2/GROUPNAME (どちらかに配置される)
- グループ購入分まで使用可能
今の所グループ名の後ろの番号が奇数の場合はgroups1,偶数の場合はgroups2の模様
[USERNAME@g0001 ~]$ ln -s /groups/GROUPNAME ~/
ファイル転送
scpコマンドやSFTPプロトコルを用いる.
SCP
scpコマンドはローカルPCで使用
ローカルのtest.txt をABCIのユーザディレクトリ(~/)内へ
test.txt 100% 0 0.0KB/s 00:00
ABCIの~/test.txt をローカルのカレントディレクトリ内へ
test.txt 100% 0 0.0KB/s 00:00
ディレクトリのコピー
$ scp -r abci:~/test ./
test1.txt 100% 0 0.0KB/s 00:00
test2.txt 100% 0 0.0KB/s 00:00
test3.txt 100% 0 0.0KB/s 00:00
秘密鍵の指定
$ scp -i /PATH/TO/id_rsa abci:~/test.txt ./
test.txt 100% 0 0.0KB/s 00:00
SFTP
ファイラーのサーバ接続機能やsshfsコマンドから以下の設定値を参考に接続
項目 | 値 |
---|---|
Protocol/Type | SSH |
Host | abci |
Port | 22 |
Path | / |
Login as | USERNAME |
ジョブ実行
ジョブタイプ
主に使用するのはバッチジョブ,プログラムの挙動のチェックなどをしたい場合やGUIを使用したい場合にはインタラクティブジョブを使用する
-
バッチジョブ(正式名: Spot)
ABCIのキューにシェルスクリプトを入れて処理
1ジョブあたり最大で512台を並列使用可能
(72時間もしくは168時間継続使用可能) -
インタラクティブジョブ(正式名: On-demand)
計算ノードのコンソールから対話的に実行
1ジョブあたり最大で32台を並列使用可能
(12時間継続使用可能) -
事前予約型ジョブ(正式名: Reserved)
事前に計算ノードをグループで専有
(継続使用時間の制限は無し)
リソースタイプ
ジョブ発行時に指定できるリソース一覧
タイプ(リソース名) | CPUコア数 | GPU数 | メモリ(GiB) | ローカルストレージ(GB) | 課金係数 |
---|---|---|---|---|---|
rt_F | 40 | 4 | 360 | 1440 | 1.0 |
rt_G.large | 20 | 4 | 240 | 720 | 0.9 |
rt_Gsmall | 5 | 1 | 60 | 180 | 0.3 |
rt_C.large | 20 | 0 | 120 | 720 | 0.6 |
rt_C.small | 5 | 0 | 30 | 180 | 0.2 |
バッチジョブ
バッチファイルの例
script.sh
#!/bin/sh
#$ -l rt_C.small=1
#$ -l h_rt=0:10:00
#$ -j y
#$ -cwd
source ~/.bash_profile
sleep 10
touch ~/abcitest/ok${1}.txt
echo OK
ジョブスケジューラへのオプション指定は#$に続いて先頭に記述
-
#$ -l rt_C.small=1
(必須)
リソースタイプとリソース数の指定リソース数はrt_Fのみ2以上を指定可能
(ただし複数リソースの恩恵を受けられるのはMPIを用いた時) -
#$ -l h_rt=0:10:00
(必須)
Walltime(ジョブの打ち切り時間)の指定72時間もしくは168時間まで.ただしジョブ投入時にABCIの使用ポイントがリザーブされるため無駄に大きくしないように注意が必要.
-
#$ -j y
標準出力と標準エラーを出力するファイルを統一する.
出力は作業ディレクトリの[ジョブ名].o[ジョブ番号]にされる.-oオプションで出力先を作業ディレクトリ以外に指定可能. -
#$ -cwd
ジョブ投入(qsub)をしたディレクトリを作業ディレクトリにする.
ジョブ投入
qsub –g [グループ名] [バッチファイル]
script.sh
[USERNAME@es1 abcitest]$ qsub -g GROUPNAME script.sh
Your job 1205251 ("script.sh") has been submitted
[USERNAME@es1 abcitest]$ # ジョブ終了後
[USERNAME@es1 abcitest]$ ls
ok.txt script.sh script.sh.o1205251
インタラクティブジョブ
qrsh –g [グループ名] –l [リソース名]=[リソース数]
以下,計算ノード(rt_C.small)上でhostnameを表示するサンプル
[USERNAME@g0001 ~]$ hostname
g0001.abci.local
[USERNAME@g0001 ~]$ exit
logout
[USERNAME@es1 ~]$
tmuxやscreenもしくはxterm&を使うことで複数のコンソールを立ち上げることができる
ジョブ管理・操作
予約済み・実行中ジョブ一覧を表示
job-ID prior name user state submit/start at queue jclass slots ja-task-ID
------------------------------------------------------------------------------------------------------------------------------------------------
1195644 0.25586 script.sh USERNAME r 10/04/2019 19:38:16 gpu@g0018 10
1195645 0.25586 script.sh USERNAME r 10/04/2019 19:38:18 gpu@g0018 10
1195646 0.25586 script.sh USERNAME r 10/04/2019 19:38:18 gpu@g0022 10
1195647 0.25586 script.sh USERNAME r 10/04/2019 19:38:19 gpu@g0022 10
1195648 0.25586 script.sh USERNAME r 10/04/2019 19:38:20 gpu@g0022 10
state code | 状態 |
---|---|
r | 実行中 |
qw | 待機中のジョブ(リソースが空けば実行可能な状態 |
h | ホールド中 |
d | 削除中 |
t | 移動中(待機中から実行に移される間の状態) |
s | サスペンド(一時停止)状態 |
S | サスペンド状態(ジョブが所属するキューがサスペンドされている) |
T | サスペンド状態(suspend threshold を超えたためにサスペンドされている) |
Rq | 再スケジューリングされ待機中のジョブ |
Rr | 再スケジューリングされ実行中のジョブ |
E | エラー状態 |
予約済み・実行中ジョブの削除
[USERNAME@es1 ~]$ qdel JOB-ID
USERNAME has registered the job JOB-ID for deletion
[USERNAME@es1 ~]$ #全削除
[USERNAME@es1 ~]$ qdel -u $USER
USERNAME has registered the job JOB-ID1 for deletion
USERNAME has registered the job JOB-ID2 for deletion
USERNAME has registered the job JOB-ID3 for deletion
実行済みジョブの実行時間などを表示
qname gpu
hostname g0018
group GROUPNAME
owner USERNAME
project GROUPNAME
department GROUPNAME
jobname script.sh
jobnumber 1195644
taskid undefined
pe_taskid NONE
account GROUPNAME
priority 0
cwd /home/USERNAME/abcitest 作業ディレクトリ
submit_host es1.abci.local
submit_cmd /bb/system/uge/latest/bin/lx-amd64/qsub -P gaa50073 script.sh
qsub_time 10/04/2019 19:38:16.407 投入時刻
start_time 10/04/2019 19:38:24.739 処理開始時刻
end_time 10/04/2019 19:38:34.763 処理終了時刻
granted_pe perack01
slots 10
failed 0 ABCIのスケジューラの終了コード
deleted_by NONE
exit_status 0 終了ステータス
ru_wallclock 10.024
ru_utime 0.008
ru_stime 0.014
ru_maxrss 10448
ru_ixrss 0
ru_ismrss 0
ru_idrss 0
ru_isrss 0
ru_minflt 1114
ru_majflt 0
ru_nswap 0
ru_inblock 0
ru_oublock 16
ru_msgsnd 0
ru_msgrcv 0
ru_nsignals 0
ru_nvcsw 17
ru_nivcsw 3
wallclock 20.239 処理時間
cpu 0.022
mem 0.001
io 0.000
iow 0.000
ioops 114
maxvmem 215.938M
maxrss 0.000
maxpss 0.000
arid undefined
jc_name NONE
bound_cores NONE
Environment Modules
開発環境やライブラリ,ツールなどの利用設定
gcc, icc, cmake, python, R, openjdk, cuda, cudnn, openmpi, singularity など
利用可能モジュール一覧
module avile
モジュールのロード
module load [モジュール名]
ロード済みモジュール一覧
module list
[USERNAME@es1 ~]$ module load python/3.6
ロードしたモジュールはセッション中のみ有効なため,バッチファイル内でも毎回呼び出す必要あり
バッチファイル内でmoduleコマンドを呼び出す際は,moduleコマンドそのものを有効化する必要があります.
#!/bin/sh
source /etc/profile.d/modules.sh
module load python/3.6
ローカルストレージ
環境変数 ${SGE_LOCALDIR}で参照可能な計算ノード内で自由に使えるディレクトリ(ジョブ終了時に自動で消去される)
以下,インタラクティブジョブでローカルストレージに移動して場所を確認したサンプル
[aaa10259dp@g0018 ~]$ cd ${SGE_LOCALDIR}
[aaa10259dp@g0018 1195571.1.gpu]$ pwd
/local/1195571.1.gpu
共有ストレージは遅いため大量にファイルを読み書きする場合はここで作業することを推奨
並列計算
複数バッチ
複数のジョブを投入することで並列化
ABCIの制限で1000ジョブ以上は投入不可
Your job 1205252 ("script.sh") has been submitted
[USERNAME@es1 abcitest]$ qsub -g GROUPNAME script.sh 2
Your job 1205253 ("script.sh") has been submitted
[USERNAME@es1 abcitest]$ qsub -g GROUPNAME script.sh 3
Your job 1205254 ("script.sh") has been submitted
[USERNAME@es1 abcitest]$ qsub -g GROUPNAME script.sh 4
Your job 1205255 ("script.sh") has been submitted
アレイジョブ
連番をABCIのジョブスケジューラから入力させ,並列実行させる.
連番の範囲とステップを与えると自動的にジョブが並列に実行される.
array_script.sh
#!/bin/sh
#$ -l rt_C.small=1
#$ -l h_rt=0:10:00
#$ -j y
#$ -cwd
source ~/.bash_profile
sleep 10
touch ~/abcitest/ok${SGE_TASK_ID}.txt
echo OK
${SGE_TASK_ID}
連番が入力される環境変数 (1以上の数字)
[USERNAME@es1 abcitest]$ qsub -g GROUPNAME -t 1-4:1 array_script.sh
Your job-array 2205273.1-4:1 ("array_script.sh") has been submitted
上記のスクリプトとコマンドで複数バッチの例と同等のことを実現可能.
大量にジョブを投げるとABCIのジョブスケジューラに負担がかかるため連番投入できるならアレイジョブにすることを推奨
複数タスク
1ジョブ内で並列実行
run.sh
#!/bin/sh
#$ -l rt_C.small=1
#$ -l h_rt=0:10:00
#$ -j y
#$ -cwd
xargs -a ${1} -P 4 -L 1 ./script.sh
param1.txt
1
2
3
4
Your job 1205273 ("run.sh") has been submitted
[USERNAME@es1 abcitest]$ # ジョブ終了後
[USERNAME@es1 abcitest]$ ls
ok1.txt ok2.txt ok3.txt ok4.txt param1.txt run.sh run.sh.o1205273 script.sh
MPI
OpenMPIを使用してメモリ内容を通信させるようにプログラムングすることで,複数台を並列使用して1つのプログラムを動作させる.
その他
GUI
以下,インタラクティブノードでxtermを起動するサンプル
[USERNAME@es1 ~]$ qrsh -g GROUPNAME -l rt_F=1 -pty yes -display $DISPLAY -v TERM /bin/bash
[USERNAME@g0001 ~]$ xterm
もしくは
[USERNAME@es1 ~]$ echo $DISPLAY
10.0.0.1:10.1
[USERNAME@es1 ~]$ qrsh -g GROUPNAME -l rt_F=1
[USERNAME@g0001 ~]$ # インタラクティブノード上で調べた$DISPLAYを計算ノードに設定
[USERNAME@g0001 ~]$ export DISPLAY=10.0.0.1:10.1
[USERNAME@g0001 ~]$ xterm
Linuxコンテナ
singularity run docker://foo/bar:latest
Singularityを使用してDockerのコンテナイメージを実行可能
homeは自動マウントされる
[USERNAME@g0001 ~]$ module load singularity
[USERNAME@g0001 ~]$ singularity run docker://tkmnet/crowdwalk:latest
[USERNAME@g0001 ~]$ crowdwalk -c /sample/generatedTown/gridTown00.ruby.prop.json
[USERNAME@g0001 ~]$ exit
[USERNAME@g0001 ~]$
[USERNAME@g0001 ~]$ # もしくは直接コマンドを実行
[USERNAME@g0001 ~]$ singularity exec docker://tkmnet/crowdwalk:latest crowdwalk -c /sample/generatedTown/gridTown00.ruby.prop.json
[USERNAME@g0001 ~]$
[USERNAME@g0001 ~]$ # pullでDockerイメージをSingularityイメージへ
[USERNAME@g0001 ~]$ singularity pull docker://tkmnet/crowdwalk:latest
[USERNAME@g0001 ~]$ singularity exec crowdwalk-latest.simg crowdwalk -c /sample/generatedTown/gridTown00.ruby.prop.json
Python-venv
venvの準備
~/venv にPythonの仮想環境ができる.一度作ったら以降はアクティベートだけでよい.
[USERNAME@es1 ~]$ python3 -m venv venv
venvのアクティベート(venvを使いたい時都度呼び出す)
アクティベートした後は自由にpipなどできる.ただしPythonを使いたい時は都度アクティベートしなければならないので注意が必要.
[USERNAME@es1 ~]$ source ~/venv/bin/activate
空いてるノード数を調べる
105