ABCI入門

公式のユーザーガイドに書かれている内容を抜粋・加筆して,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鍵作成

    $ ssh-keygen
    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

    接続

    $ ssh abci
    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 ~]$ # グループディレクトリのシンボリックリンクをユーザディレクトリに作成することをおすすめ
    [USERNAME@g0001 ~]$ ln -s /groups/GROUPNAME ~/

    ファイル転送

    scpコマンドやSFTPプロトコルを用いる.

    SCP

    scpコマンドはローカルPCで使用

    ローカルのtest.txt をABCIのユーザディレクトリ(~/)内へ

    $ scp test.txt abci:~/
    test.txt 100% 0 0.0KB/s 00:00

    ABCIの~/test.txt をローカルのカレントディレクトリ内へ

    $ scp abci:~/test.txt ./
    test.txt 100% 0 0.0KB/s 00:00

    ディレクトリのコピー

    $ #オプション-rを使用
    $ 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

    秘密鍵の指定

    $ #オプション-iで指定
    $ 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 [グループ名] [バッチファイル]

    [USERNAME@es1 abcitest]$ ls
    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@es1 ~]$ qrsh -g GROUPNAME -l rt_C.small=1
    [USERNAME@g0001 ~]$ hostname
    g0001.abci.local
    [USERNAME@g0001 ~]$ exit
    logout
    [USERNAME@es1 ~]$

    tmuxやscreenもしくはxterm&を使うことで複数のコンソールを立ち上げることができる

    ジョブ管理・操作

    予約済み・実行中ジョブ一覧を表示

    [USERNAME@es1 ~]$ qstat
    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 ~]$ #個別削除
    [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

    実行済みジョブの実行時間などを表示

    [USERNAME@es1 ~]$ qacct -j JOB-ID

    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 ~]$ # Python3.6をロード
    [USERNAME@es1 ~]$ module load python/3.6

    ロードしたモジュールはセッション中のみ有効なため,バッチファイル内でも毎回呼び出す必要あり

    バッチファイル内でmoduleコマンドを呼び出す際は,moduleコマンドそのものを有効化する必要があります.

    #!/bin/sh
    
    source /etc/profile.d/modules.sh
    module load python/3.6

    ローカルストレージ

    環境変数 ${SGE_LOCALDIR}で参照可能な計算ノード内で自由に使えるディレクトリ(ジョブ終了時に自動で消去される)

    以下,インタラクティブジョブでローカルストレージに移動して場所を確認したサンプル

    [USERNAME@es1 ~]$ qrsh -g GROUPNAME -l rt_C.small=1
    [aaa10259dp@g0018 ~]$ cd ${SGE_LOCALDIR}
    [aaa10259dp@g0018 1195571.1.gpu]$ pwd
    /local/1195571.1.gpu

    共有ストレージは遅いため大量にファイルを読み書きする場合はここで作業することを推奨

    並列計算

    複数バッチ

    複数のジョブを投入することで並列化
    ABCIの制限で1000ジョブ以上は投入不可

    [USERNAME@es1 abcitest]$ qsub -g GROUPNAME script.sh 1
    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]$ # -t 開始-終了:ステップ # この際開始は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
    [USERNAME@es1 abcitest]$ qsub -g GROUPNAME run.sh param1.txt
    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を起動するサンプル

    $ ssh abci -Y
    [USERNAME@es1 ~]$ qrsh -g GROUPNAME -l rt_F=1 -pty yes -display $DISPLAY -v TERM /bin/bash
    [USERNAME@g0001 ~]$ xterm

    もしくは

    $ ssh abci -Y
    [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@es1 ~]$ qrsh -g GROUPNAME -l rt_C.small=1
    [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 ~]$ module load python/3.6
    [USERNAME@es1 ~]$ python3 -m venv venv

    venvのアクティベート(venvを使いたい時都度呼び出す)

    アクティベートした後は自由にpipなどできる.ただしPythonを使いたい時は都度アクティベートしなければならないので注意が必要.

    [USERNAME@es1 ~]$ module load python/3.6
    [USERNAME@es1 ~]$ source ~/venv/bin/activate

    空いてるノード数を調べる

    [USERNAME@es1 ~]$ qstat -f | grep " 0/0/80" | grep -v " d" | wc -l
    105

    参考

    AI橋渡しクラウド
    ABCI Users Guide
    ABCI運転状況

    アバター
    鷹見 竣希

    筑波大学システム情報工学研究科 博士3年
    産業技術総合研究所 人工知能研究センター 社会知能研究チーム RA

    悪いイマイチ普通良い最高! (5 投票, 平均: 5.00 / 5)
    読み込み中...

    コメントを残す

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