ABCIで機械学習環境を爆速で構築する

# 0. 概要
ABCIというスパコン的なAI研究のためのハードウェアリソース基盤が凄いらしい。
https://abci.ai/ja/

使ってみようとしたところ、使うまでが結構難しいのでまとめてみた。

簡単に以下の手順が必要である。

 - アカウント登録
 - 公開鍵登録
 - asにログイン
 - esにログイン
 - 計算ノードへログイン
 - GPUを使える！


## TL;DR
以下の3ステップで計算ノードへ接続できます。

``` bash
host$ ssh <YOUR_USERNAME>@as.abci.ai -L 10022:es:22
host$ ssh -XC -p 10022 -l <YOUR_USERNAME> localhost
es$ qrsh -g <YOUR_GROUPNAME> -l rt_F=1 -pty yes -display $DISPLAY -v TERM /bin/bash
```


# 1. 環境構築
計算ノードに接続するところまで環境構築を行う。

## 1.1. アカウント登録
以下のウェブサイトから申請してアカウントを発行
https://abci.ai/ja/how_to_use/member.html
次に、アカウントと仮パスワードを使ってログイン。

## 1.2. 公開鍵登録
ABCI利用ポータルに接続して、公開鍵を登録する。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/e4a07be6-4a45-6e9e-37c2-68f009f0d5b8.png)

## 1.3. SSHログイン (to as)
ACBIに公開鍵でログインする。

### 概要
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/db725589-ea17-14ab-4eeb-bf946cc76e55.png)
この時、ログインするマシンはACBI内の`as`であるが、フォワーディングされて
`es1`~`es4`のどれかにログインすることになる。
`es`は1人あたり32MB程度しか割り当てられておらず、またGPU等も利用できない。
そこで、有料マシンの計算ノードに接続する必要がある。

### `as`にssh
`teraterm`等のsshクライアントを使いログインを行う。

``` bash
$ ssh <YOUR_USERNAME>@as.abci.ai -L 10022:es:22
```

こんな感じの画面が表示されれば成功である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/9a04c0e7-5f79-6479-c25b-8858b51598f7.png)

### `es`にssh
次に`es`にログインする。
`teraterm`等のsshクライアントをもう1つ開き以下のように入力する

``` bash
$ ssh -p 10022 -l <YOUR_USERNAME> localhost
```

これで`Welcome to ABCI System`等と表示されれば成功である。

# 1.4. 計算ノードへ接続
`es`につないだところで、ただのハブである。
これから計算ノードを利用する。計算ノードの利用は有料である。今回はグループ単位で借りているとする。

`es`内で以下のコマンドを実行する

``` bash 
$ qrsh -g group -l resource_type=num [options]
```

例えば次のようにする`$ qrsh -g gabxxxx -l rt_F=1`。
なお、リソースタイプは以下である。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/95636/414e0926-3ef8-836f-096b-a0294ee9d2ae.png)


おもむろに`nvidia-smi -l`を実行すると・・・

```
+-----------------------------------------------------------------------------+
| NVIDIA-SMI 440.33.01    Driver Version: 440.33.01    CUDA Version: 10.2     |
|-------------------------------+----------------------+----------------------+
| GPU  Name        Persistence-M| Bus-Id        Disp.A | Volatile Uncorr. ECC |
| Fan  Temp  Perf  Pwr:Usage/Cap|         Memory-Usage | GPU-Util  Compute M. |
|===============================+======================+======================|
|   0  Tesla V100-SXM2...  On   | 00000000:3D:00.0 Off |                    0 |
| N/A   25C    P0    41W / 300W |      0MiB / 16160MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   1  Tesla V100-SXM2...  On   | 00000000:3E:00.0 Off |                    0 |
| N/A   23C    P0    40W / 300W |      0MiB / 16160MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   2  Tesla V100-SXM2...  On   | 00000000:B1:00.0 Off |                    0 |
| N/A   23C    P0    42W / 300W |      0MiB / 16160MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+
|   3  Tesla V100-SXM2...  On   | 00000000:B2:00.0 Off |                    0 |
| N/A   25C    P0    42W / 300W |      0MiB / 16160MiB |      0%      Default |
+-------------------------------+----------------------+----------------------+

+-----------------------------------------------------------------------------+
| Processes:                                                       GPU Memory |
|  GPU       PID   Type   Process name                             Usage      |
|=============================================================================|
|  No running processes found                                                 |
+-----------------------------------------------------------------------------+
```

# 1.5. Display変数を引き継いで接続
まず`as`につないだ状態で以下のように接続する。
ただDisplay変数を引き継いで渡しているだけである。

``` bash
host$ ssh -XC -p 10022 -l <YOUR_USERNAME> localhost
es$ qrsh -g <YOUR_GROUPNAME> -l rt_F=1 -pty yes -display $DISPLAY -v TERM /bin/bash
```
# 2. 機械学習環境
一先ず、TensorflowとKerasを入れてみる。

# 2.1. 初回
計算ノードにログインした状態で以下を実行する。

``` bash
g0001$ module load python/3.6/3.6.5 cuda/10.0/10.0.130.1 cudnn/7.6/7.6.5
g0001$ python3 -m venv ~/venv/tensorflow-keras
g0001$ source ~/venv/tensorflow-keras/bin/activate
(tensorflow-keras) g0001$ pip3 install --upgrade pip setuptools
(tensorflow-keras) g0001$ pip3 install tensorflow-gpu==1.15 keras
```

これで`tensorflow`及び`keras`のインストールが終わった。

# 2.2. 2度目以降
簡単！

```bash
g0001$ module load python/3.6/3.6.5 cuda/10.0/10.0.130.1 cudnn/7.6/7.6.5
g0001$ source ~/venv/tensorflow-keras/bin/activate
```


# 99. その後
https://docs.abci.ai/ja