産総研スパコンABCIの使い方メモ

# はじめに
産総研のGPU付きスパコン”ABCI”を昨年度末まで使っていたのでそのときのメモ．とくに**ABCIの計算ノードでAnacondaの仮想環境を動かしたい方**はご参考にどうぞ．

※注意：この内容は2020年3月までの知識で書いています

<!--- ================================================== --->
<!--- ================================================== --->
# 参考資料など
- ABCI Webページ
    - https://abci.ai/
- 運転状況
    - https://abci.ai/ja/about_abci/info.html
- ABCI利用者ポータル
    - https://portal.abci.ai/user/
- ユーザーガイド
    - https://docs.abci.ai/ja/
- ダウンロードできるマニュアル集
    - https://abci.ai/ja/link/download_etc.html
- ABCI利用者講習会（初級編）PDF
    - Win/Linux: https://abci.ai/ja/how_to_use/data/ABCI_Handson_20190909.pdf
    - Macユーザ用補足資料: https://abci.ai/ja/how_to_use/data/ABCI_Handson_Mac_20190909.pdf
- コマンド集
    - https://abci.ai/ja/how_to_use/data/ABCI_referrence.html
- ABCI利用者ブログ（Kenta Nakajima様のはてなブログ）
    - http://cstmize.hatenablog.jp/entry/2019/04/18/ABCI%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9
    - http://cstmize.hatenablog.jp/entry/2019/06/29/ABCI%E3%82%B7%E3%82%B9%E3%83%86%E3%83%A0%E3%81%AE%E4%BD%BF%E3%81%84%E6%96%B9(%E5%BF%9C%E7%94%A8%E7%B7%A8)


<!--- ================================================== --->
<!--- ================================================== --->
# インタラクティブノードへのログイン
WindowsならWindows Powershell，Powershellを使う，あるいはWindows TerminalからWSLを使うが良いと思います．私はWindows Terminal + WSLを使っていました．

```text:shell-window-1
$ ssh -i ./your_rsa_key -L 10022:es:22 -l $YOUR_ABCI_ID as.abci.ai
```

正しいパスワードを入れると以下のようなメッセージが出ます

```text:shell-window-1
Welcome to ABCI access server.
Please press any key if you disconnect this session.
```

この**shell-window-1はこのままキープ**しておきます．キープしたまま別windowを開き以下を入力します．

```text:shell-window-2
$ ssh -i ./your_rsa_key -p 10022 -l $YOUR_ABCI_ID localhost
```

正しいパスワード入力後，以下のメッセージが出ればログイン成功です．

```text:shell-window-2
--------------------------------------------------------------------------------
  ABCI Information                                           Date: Oct 04, 2019
--------------------------------------------------------------------------------

  Welcome to ABCI system

  - 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)

[xxxxxxxxxx@es1 ~]$ 
```

ログアウトで消えない環境変数を作る場合は~/.bash_profileに書き込みます．ユーザID，グループID，メールアドレス，グループディレクトリあたりを環境変数にしておくと何かと便利です．

```text:shell-window-2
[xxxxxxxxxx@es1 ~]$ cat .bash_profile
# .bash_profile

## Get the aliases and functions
if [ -f ~/.bashrc ]; then
        . ~/.bashrc
fi

## User specific environment and startup programs
export PATH=$PATH:$HOME/.local/bin:$HOME/bin

## Original
export ID_USER=xxxxxxxxxx
export ID_GROUP=xxxxxxxx
export EMAIL=xxxxxx@xxxx.xxx.xxx.xx.jp
export DIR_GROUP=/groups1/$ID_GROUP
```

Anacondaのインストール後，以下コマンドを入力しcondaコマンドを有効化します．

```text:shell-window-2
[xxxxxxxxxx@es1 ~]$ export PATH=~/anaconda3/bin:$PATH
```

## インタラクティブノードでJupyter labを使用
サーバー側のブラウザで開かずにJupyter labを起動しサーバのアドレスを確認します．

```text:shell-window-2
[xxxxxxxxxx@es1 ~]$ jupyter lab --no-browser --ip=`hostname` >> jupyter.log 2>&1 &
[xxxxxxxxxx@es1 ~]$ jupyter notebook list
Currently running servers:
http://es1.abci.local:8888/?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX :: /home/xxxxxxxxxx
```

新しいシェルウィンドウを開いてポートフォワーディングします．以下を入力し，パスワードを入力します．「es1」「8888」とは限らないので，毎回上記のrunning serverのアドレスで確認してください．

```text:shell-window-3
$ ssh -L 18888:es1:8888 -l $YOUR_ABCI_ID -i ./your_rsa_key -p 10022 localhost
```

shell-window-3をこの状態でキープしたまま，ログイン元のPCのブラウザを立ち上げ，

`http://localhost:18888/?token=XXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXXX`

にアクセスします．"token="以下はshell-window-2に表示されているものをコピーしてください．


<!--- ================================================== --->
<!--- ================================================== --->
# On-demandモードで計算ノードを使用
qrshコマンドを使った計算ノードへのログイン

```test:shell-window-2
[xxxxxxxxxx@es1 ~]$ qrsh -l rt_G.small=1 -g $ID_GROUP -l h_rt=00:30:00
```

@の後ろがgからはじまるノード名になっていれば成功です．インタラクティブノードの何処にいてもhomeディレクトリに移動するので注意してください

```test:shell-window-2
[xxxxxxxxxx@g0001 ~]$ 
```

## 計算ノードでJupyter labを使用
基本的にインタラクティブノードでJupyter labを使用するのと手順は同じです．ポートフォワーディングする際，ノード名のes~をg~にすげ替えてください．


<!--- ================================================== --->
<!--- ================================================== --->
# Spotモードで計算ノードを使用
事前に計算ノードにログインしておく必要は***ありません***.

```test:shell-window-2
[xxxxxxxxxx@es1 ~]$ qsub -j y -cwd -l rt_G.small=1 -l h_rt=24:00:00 -g $ID_GROUP -M $EMAIL -m besa -o $DIR_LOG -e $DIR_LOG ./run.sh
```

`DIR_LOG`は事前に適当なディレクトリを指定しておいてください．カレントディレクトリでよいのなら

```test:shell-window-2
[xxxxxxxxxx@es1 ~]$ export DIR_LOG=$(pwd)
```

でOKです．

Anacondaで作成した仮想環境を使用したい場合は上記run.shの中身をたとえば以下のようにします：

```shell:run.sh
#!/bin/bash

## >>> conda init >>>

__conda_setup="$(CONDA_REPORT_ERRORS=false '$HOME/anaconda3/bin/conda' shell.bash hook 2> /dev/null)"

if [ $? -eq 0 ]; then
    \eval "$__conda_setup"
else
    if [ -f "$HOME/anaconda3/etc/profile.d/conda.sh" ]; then
        . "$HOME/anaconda3/etc/profile.d/conda.sh"
        CONDA_CHANGEPS1=false conda activate base
    else
        \export PATH="$PATH:$HOME/anaconda3/bin"
    fi
fi
unset __conda_setup
## <<< conda init <<< 

## Activation
conda activate myenv1

## このへんは確認のために表示
conda info -e
date
hostname

## Pythonコードを実行
python main.py arg1 arg2 arg3
```


<!--- ================================================== --->
<!--- ================================================== --->
# Reservedモードで計算ノードを使用

[2020/05/22追記]

## 予約と予約の削除
公式のマニュアルを参考にしてください（わかりやすいので）
https://docs.abci.ai/ja/03/#reservation

予約には`qrsub`コマンドを使います．
`-a` : ジョブの開始日をYYYYMMDD形式で指定します．ジョブは開始日の**朝10時に開始**されます．朝10時以降に当日を指定すると何かしらのエラーが出ます
`-d` : ジョブの実行期間（日数）を指定します．-aで指定した開始日のＮ日後の**朝9時30分に実行が停止**されます．下の-eかこの-dのどちらか片方を指定します．
`-e` : ジョブの停止日時を指定します．YYYYMMDDで指定した日の**朝9時30分に実行が停止**されます．上の-dかこの-eどちらか片方を指定します．
`-N` : 予約名を文字列で指定します．頭に数字を指定することは出来ません．

```shell:shell-window-2
[xxxxxxxxxx@es1 ~]$ qrsub -a 20180705 -d 7 -g grpname -n 4 -N "Reserve_for_AI"
Your advance reservation 12345 has been granted
```

予約の削除には`qrdel`コマンドを使います．予約した際に発行されたID（上の実行例の"12345"）を引数として指定します．

```shell:shell-window-2
[xxxxxxxxxx@es1 ~]$ qrdel 12345
```

## 予約したリソースでジョブを実行
`qsub`コマンドに`-ar`オプションで，予約した際に発行されたIDを指定します．

実行例：

```test:shell-window-2
[xxxxxxxxxx@es1 ~]$ qsub -j y -cwd -l rt_F=1 -g $ID_GROUP -M $EMAIL -m besa -o $DIR_LOG -e $DIR_LOG -ar 12345 ./run.sh
```


# おわりに
言い訳がましくて恐縮ですが，あくまで自分の用途に沿うように作ったメモを移植しただけなので，ABCIの使用方法を網羅しているわけではありません．より詳しい情報が必要な場合は「参考資料など」で挙げた資料を参照願います．