【ABCI】産総研スパコンに圧倒的入門するためのページ〜VSCode・Anacondaによる計算環境整備

こんにちは、@aya_seです。大学で自然言語処理の研究をしています。

今回は、**産総研AI橋渡しクラウド**(**ABCI**)で最低限のジョブが投げられるようにするまでの作業をまとめました。もともとは研究室内Wikiに書いていたものですが、せっかくなので公開してみます。また、ABCIの事例ではありますが、他のスパコンでも共通する部分があるかと思うので、参考になれば幸いです。

ちなみに、今回の記事の大部分の内容は[**ABCIのユーザーガイド**](https://docs.abci.ai/ja/)に書いてあったので、読むとよさそうです。

# 想定する読者層
- 研究室に配属されたばかりで、これからスパコン(ABCI)を使おうと考えている
- Python・PyTorchを利用したML系のジョブを投げたい
- スパコン(ABCI)におけるジョブの概念や投げ方について知りたい

# ABCIにRemote SSH接続する
- まずはABCIの**アカウントID**を把握する。
- [**ABCI利用者ポータル**](https://portal.abci.ai/user/project_register_app.php)にログインする。
- ポータルからは、自分が所属している**グループID**がわかるので、それもメモしておくと良い。
- ポータルから**SSH公開鍵の登録**を行う。ここで登録を行う公開鍵は自分のデバイス(Macなど)の公開鍵である。
    - ここでSSH公開鍵の登録をしても、自分の場合はすぐにそれが反映されなかった。結局、何もせず放置し、翌日になったらSSHでログインできるようになったので、即座にSSH接続がうまくいかなかったとしても焦らなくてよさそう。
- VSCodeのRemote SSHをする前に、一旦、純粋なSSHコマンドで接続した方がいいらしいので、以下のコマンドで接続する。(`id_rsa`の部分は登録した公開鍵の種類によって変える。)
    - SSH鍵のディレクトリはMacの一例

```bash
ssh -i /Users/{あなたの名前}/.ssh/id_rsa -L 10022:es-a:22 -l {あなたのABCIアカウントID} abci
```

- 上記のコマンドで接続できたら、次はVSCodeで接続できるように設定を行う。`.ssh/config`に以下の記述を追加。

```.ssh/config
Host abci
  HostName es
  User {あなたのABCIアカウントID}
  ProxyJump %r@as.abci.ai
  IdentityFile /Users/{あなたの名前}/.ssh/id_rsa

Host as.abci.ai
  IdentityFile /Users/{あなたの名前}/.ssh/id_rsa

Host *.abci.local
 User {あなたのABCIアカウントID}
 IdentityFile /Users/{あなたの名前}/.ssh/id_rsa
 ProxyCommand ssh -W %h:%p -l {あなたのABCIアカウントID} -i /Users/{あなたの名前}/.ssh/id_rsa as.abci.ai
```

- 保存して、VSCodeのRemote SSHの一覧にABCIのものが表示されると思うので、`abci`の方をクリックして接続。たまに接続に失敗することがあるが、再試行すれば接続できるはず。

# condaで環境構築する
今後色々な実験をすることを考えると、仮想環境構築は必須になってくると思われる。一般的な方法である、**Anaconda**による環境構築の手順をまとめておく。

まずは最新のAnacondaをインストールする。パッケージ名は最新の番号を調べておく。インストール中に色々と出てくるが、ENTERやyesを入力し続ければ問題ない。

```bash
wget https://repo.anaconda.com/archive/Anaconda3-2022.05-Linux-x86_64.sh
bash Anaconda3-2022.05-Linux-x86_64.sh
```
インストールが完了したら、一旦ターミナルを切断し、再度新しいターミナルを立ち上げる。ターミナルが`(base)[fuga]$`みたいな表示になっていたら、きっとうまくいっている。

次に、以下のコマンドで仮想環境を作成する。ここでは環境名を`hoge`、Pythonのバージョンを`3.7`とする。多分、Pythonのバージョンはなるべく明示的に指定して環境作成した方が良いと思われる。どのバージョンが良いかはあらかじめ調べておく。

```bash
conda create --name hoge python=3.7 -y
```

最後に、作成した環境をactivateする。ターミナルが`(hoge)[fuga]$`みたいな表示になっていたら、きっとうまくいっている。

```bash
conda activate hoge
```

# インタラクティブジョブを投げる
ABCIでは**インタラクティブジョブ**・**バッチジョブ**の2種類のジョブの投げ方がある。ジョブとして投げないと、GPUで処理を実行できないので、何らかの実験をする際には必ずジョブを投げることになる。まずは、インタラクティブジョブで、実際に行う実験のプログラムがうまく動きそうかの様子を見て、うまくいきそうな雰囲気であれば、バッチジョブで再度実行する、というのが、経済的なABCIの使い方のようである。

インタラクティブジョブを投げるためのコマンド例は以下である。

```bash
qrsh -g {グループID} -l rt_AF=1 -l h_rt=1:00:00
```

- `rt_AF=1`の部分では使用するノードの種類と個数を指定している。他にもさまざまな種類のノードがあり、その一覧は[**ユーザーガイド**](https://docs.abci.ai/ja/job-execution/)から確認できる。Aノードはスペックが高いが、ややポイント消費が激しく、Gノードはやや経済的である。行う実験で必要となるメモリ量などに応じて適切に使い分けていきたい。
- `h_rt=1:00:00`の部分ではジョブの継続時間を指定する。ここで指定した時間を超過すると、自動的にジョブが打ち切られるようになっている。インタラクティブモードは、実験がうまく動作しそうかの確認として使うという用途がメインになるのであるとすれば、あまり長時間の枠を確保する必要はなさそうだ。

インタラクティブジョブを投げると、ターミナルの表示が変わることが確認できる。インタラクティブジョブでは、ジョブ実行中にターミナルを直接操作することができる。例えば、`nvidia-smi`コマンドを打つと、そのノードのGPUの一覧と使用率などを確認できるようになっているはずである。

実際のジョブはbashファイルのスクリプトの形式で投げるのが基本のようである。例えば、カレントディレクトリ直下の`run.sh`を実行したいのであれば、以下のコマンドを実行する。

```bash
bash run.sh
```

## AノードでCUDAが動かないときは
CUDAやPyTorchのバージョンを変更する必要がある。自分の場合は、以下のバージョンを導入することで解決した。

```bash
pip install torch==1.10.0+cu113 torchvision==0.11.1+cu113 torchaudio===0.10.0+cu113 -f https://download.pytorch.org/whl/cu113/torch_stable.html
```

参考：https://download.pytorch.org/whl/cu113/torch_stable.html

# バッチジョブを投げる
インタラクティブジョブで実験の動作テストが無事できたら、次は、バッチジョブで本格的に実験を行う。スクリプトを指定してバッチジョブを投げるためのコマンド例は以下である。

```bash
qsub -g {グループID} run.sh
```

ここで、`run.sh`ファイル側は、例えば以下のように記述する。実験本体のスクリプトは`piyo.sh`に書かれているという想定である。`run.sh`に相当するbashファイルは、バッチジョブ実行前にあらかじめ自分で適当なディレクトリ下に作成すると良い。

```run.sh
#$ -l rt_AG.small=1
#$ -l h_rt=12:00:00
#$ -N run_fuga
#$ -o run_fuga.out
#$ -e run_fuga.err
#$ -cwd

source ~/.bashrc
conda activate hoge
bash piyo.sh
```

1行目・2行目では、インタラクティブジョブ時と同様に、使用するノードと時間を指定する。
`-N`ではジョブ名、`-o`・`-e`では標準出力・標準エラー出力の出力先ファイル名を指定する。
これ以外にもさまざまなオプションがあるようなので、必要であればユーザーガイドを参照するとよさそう。

conda環境でバッチジョブを動かしたい場合、まず初めに`source ~/.bashrc`で**conda環境を認識**させた後、`conda activate hoge`でこれから使いたい**conda環境をactivate**しなければならない点に注意が必要である。これを行わないと、そもそも`python`コマンドが認知されないなど、問題が発生する。

`qstat`コマンドで現在実行中のバッチジョブ一覧を確認できる他、`qdel {ジョブid}`でジョブを停止することもできる。

# おわりに
以上、ABCIの利用のために最低限必要であると思われる手順を記しました！不適切・不十分な内容があれば、ぜひコメントなどお願いします:pray: