こんにちは、@aya_seです。大学で自然言語処理の研究をしています。
今回は、産総研AI橋渡しクラウド(ABCI)で最低限のジョブが投げられるようにするまでの作業をまとめました。もともとは研究室内Wikiに書いていたものですが、せっかくなので公開してみます。また、ABCIの事例ではありますが、他のスパコンでも共通する部分があるかと思うので、参考になれば幸いです。
ちなみに、今回の記事の大部分の内容はABCIのユーザーガイドに書いてあったので、読むとよさそうです。
想定する読者層
- 研究室に配属されたばかりで、これからスパコン(ABCI)を使おうと考えている
- Python・PyTorchを利用したML系のジョブを投げたい
- スパコン(ABCI)におけるジョブの概念や投げ方について知りたい
ABCIにRemote SSH接続する
- まずはABCIのアカウントIDを把握する。
- ABCI利用者ポータルにログインする。
- ポータルからは、自分が所属しているグループIDがわかるので、それもメモしておくと良い。
- ポータルからSSH公開鍵の登録を行う。ここで登録を行う公開鍵は自分のデバイス(Macなど)の公開鍵である。
- ここでSSH公開鍵の登録をしても、自分の場合はすぐにそれが反映されなかった。結局、何もせず放置し、翌日になったらSSHでログインできるようになったので、即座にSSH接続がうまくいかなかったとしても焦らなくてよさそう。
- VSCodeのRemote SSHをする前に、一旦、純粋なSSHコマンドで接続した方がいいらしいので、以下のコマンドで接続する。(
id_rsa
の部分は登録した公開鍵の種類によって変える。)- SSH鍵のディレクトリはMacの一例
ssh -i /Users/{あなたの名前}/.ssh/id_rsa -L 10022:es-a:22 -l {あなたのABCIアカウントID} abci
- 上記のコマンドで接続できたら、次はVSCodeで接続できるように設定を行う。
.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を入力し続ければ問題ない。
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のバージョンはなるべく明示的に指定して環境作成した方が良いと思われる。どのバージョンが良いかはあらかじめ調べておく。
conda create --name hoge python=3.7 -y
最後に、作成した環境をactivateする。ターミナルが(hoge)[fuga]$
みたいな表示になっていたら、きっとうまくいっている。
conda activate hoge
インタラクティブジョブを投げる
ABCIではインタラクティブジョブ・バッチジョブの2種類のジョブの投げ方がある。ジョブとして投げないと、GPUで処理を実行できないので、何らかの実験をする際には必ずジョブを投げることになる。まずは、インタラクティブジョブで、実際に行う実験のプログラムがうまく動きそうかの様子を見て、うまくいきそうな雰囲気であれば、バッチジョブで再度実行する、というのが、経済的なABCIの使い方のようである。
インタラクティブジョブを投げるためのコマンド例は以下である。
qrsh -g {グループID} -l rt_AF=1 -l h_rt=1:00:00
-
rt_AF=1
の部分では使用するノードの種類と個数を指定している。他にもさまざまな種類のノードがあり、その一覧はユーザーガイドから確認できる。Aノードはスペックが高いが、ややポイント消費が激しく、Gノードはやや経済的である。行う実験で必要となるメモリ量などに応じて適切に使い分けていきたい。 -
h_rt=1:00:00
の部分ではジョブの継続時間を指定する。ここで指定した時間を超過すると、自動的にジョブが打ち切られるようになっている。インタラクティブモードは、実験がうまく動作しそうかの確認として使うという用途がメインになるのであるとすれば、あまり長時間の枠を確保する必要はなさそうだ。
インタラクティブジョブを投げると、ターミナルの表示が変わることが確認できる。インタラクティブジョブでは、ジョブ実行中にターミナルを直接操作することができる。例えば、nvidia-smi
コマンドを打つと、そのノードのGPUの一覧と使用率などを確認できるようになっているはずである。
実際のジョブはbashファイルのスクリプトの形式で投げるのが基本のようである。例えば、カレントディレクトリ直下のrun.sh
を実行したいのであれば、以下のコマンドを実行する。
bash run.sh
AノードでCUDAが動かないときは
CUDAやPyTorchのバージョンを変更する必要がある。自分の場合は、以下のバージョンを導入することで解決した。
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
バッチジョブを投げる
インタラクティブジョブで実験の動作テストが無事できたら、次は、バッチジョブで本格的に実験を行う。スクリプトを指定してバッチジョブを投げるためのコマンド例は以下である。
qsub -g {グループID} run.sh
ここで、run.sh
ファイル側は、例えば以下のように記述する。実験本体のスクリプトはpiyo.sh
に書かれているという想定である。run.sh
に相当するbashファイルは、バッチジョブ実行前にあらかじめ自分で適当なディレクトリ下に作成すると良い。
#$ -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の利用のために最低限必要であると思われる手順を記しました!不適切・不十分な内容があれば、ぜひコメントなどお願いします