0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

More than 1 year has passed since last update.

【2022年最新】ABCIでJupyter notebookを利用し,tensorflowでGPUを使う方法

Posted at

はじめに

Google colaboratoryからABCLに環境を変えたが,ABCLの環境構築とJupyter notebook上でGPUを使う方法が分かりにくかったのでここにメモしておく

こんな人に見てほしい :
ABCLを使う際に
・ABCLの開始方法がわからない/環境構築の方法がわからない

Jupyter notebookでTensorFlowを使う際に,
・GPUを使って学習をしたい
・GPUが認識されない
・GPUを使ってるはずなのに遅い
・GPUを使った際に毎回学習結果が異なる

目次

  1. ABCLの利用方法
  2. ABCIでJupyter Notebookを使用する
  3. GPUの再現性を確保する
  4. GPUを複数使って並列処理をする

1. ABCLの利用方法

ABCI利⽤ポータルへの初回ログインとパスワード登録, 公開鍵の登録は[ABCIのマニュアル】(https://abci.ai/ja/how_to_use/data/ABCI_handson_2020.pdf)を見ればできるので飛ばす.

利用グループ:gccXXX
ABCIのアカウント:aXXX
ABCIのパスワード:pass
とする.

①インタラクティブノード(es)へのshhログイン

$ ssh -L 10022:es:22 -l aXXX as.abci.ai

10022がlocalhostのポート番号で, 22がremotehostのポート番号.
入力したらセッションを切らずに放置しておく.

<初回時>

"Are you sure you want to continue connecting (yes/no)?"と聞かれるので, yesと入力.
"Enter passphrase for key '/home/username/.ssh/id_rsa':"でパスワードを入力.

<2回目以降>

"Enter passphrase for key '/home/username/.ssh/id_rsa':"で初回時に入力したパスワードを入力

②別ターミナルを開き, インタラクティブノード(es)にポートフォーワーディング

$ ssh -p 10022 -l aXXX localhost

③インタラクティブノードから計算ノードへログイン

[aXXX@es1 ~]$ qrsh -g gccXXX -l rt_F=1  h_rt=1:00:00

$[実行サービス] -g gccXXX -l [計算ノードのタイプ] [ジョブの実行時間]

qrshでインタラクティブジョブの実行サービスを利用し,rt_Fでノード占有.h_rtは指定しなくてもデフォルトで1:00:00になる.詳しくはこちら

2. ABCIでJupyter Notebookを使用する

①Pythonモジュールのロード

モジュールをロードする前に(初回時or定期的に確認)

使用できるモジュールのバージョンを確認し, 使用するtensorflow(③でインストールする)に合わせて,cudaとcudnnのバージョンを合わせる必要がある. (しっかりバージョンがあってないとGPUが使われない)

tensorflowとcuda, cudnnのバージョンの統合性の確認はこちらを参照. 2022年最新のTensorFlow 2.9.1 はこちらに載ってる. とりあえず, 最新のcudaとcudnnを使用すればGPUの処理は速くなる.

モジュールのバージョン確認は,下記のコマンドでできるため,初回時に確認しておく.

[aXXX@gXXX ~]$ module avail gcc
[aXXX@gXXX ~]$ module avail python
[aXXX@gXXX ~]$ module avail cuda
[aXXX@gXXX ~]$ module avail cudnn
モジュールのロードは以下のコマンド
[aXXX@gXXX ~]$ module load gcc/9.3.0 python/3.8/3.8.13 cuda/11.7/11.7.0 cudnn/8.4/8.4.1

②Python仮想環境を作成 / 仮想環境に入る

初回時

(1) 仮想環境を作成し,仮想環境に入る.

[aXXX@gXXX ~]$ python3 -m venv ~/jupyter_env
[aXXX@gXXX ~]$ source ~/jupyter_env/bin/activate

※ちなみに出る場合は, deactivateと入力

(2)ライブラリのインストール

[aXXX@gXXX ~]$ pip3 install --upgrade pip setuptools
[aXXX@gXXX ~]$ pip3 install jupyter numpy tensorflow==2.9.1
[aXXX@gXXX ~]$ pip3 install tensorflow-gpu tensorflow-determinism #GPU使う人用
[aXXX@gXXX ~]$ pip3 install ipython-sql #sqlを使う人用
[aXXX@gXXX ~]$ pip3 install jupyter-resource-usage #メモリの使用量を確認したい人用

pip3 listでインストールしたライブラリを確認できる.

2回目以降
[aXXX@gXXX ~]$ source ~/jupyter_env/bin/activate

のみでOK

③ジュピターノートブックをport8888で起動して,トークンを確認

[aXXX@gXXX ~]$ jupyter notebook --ip=`hostname`  --port=8888 --no-browser

④別ターミナル(3つ目のターミナル)で, ローカルPCの8888番ポートを計算ノードの8888番ポートに転送するSSHトンネルを作成

※1つ目と2つ目のターミナルは開いたままにしておく
8888:gXXX:8888のXXXは,2つ目のターミナルの[aXXX@gXXX ~]$の部分を確認.

$ ssh -L 8888:gXXX:8888 -l aXXX -p 10022 localhost

④Jupyter Notebookへの接続

ブラウザで
http://127.0.0.1:8888/
を開く.開いたらpasswordかtokenを求められるので,2つ目のターミナルに表示された'http://localhost:8888/?token='の後の文字列を入力

Jupyter Notebookの終了は3つ目のターミナルにquitと入力することでできる

3.GPUの再現性を確保する

tensorflowでGPUを使った際に学習結果が毎回異なる人へ

(1) 2. (2) でtensorflow-determinismをインストール

[aXXX@gXXX ~]$ pip3 install tensorflow-determinism 

(2)ノートブック上に記入

os.environ['TF_DETERMINISTIC_OPS'] = '1' # GPU内の計算順を固定するかどうかのフラグを指定(1'または'True'で固定)
os.environ['TF_XLA_FLAGS'] = '--tf_xla_enable_xla_devices'

# グローバルシードの指定
seed=1234
np.random.seed(seed)
tf.random.set_seed(seed)
os.environ["PYTHONHASHSEED"] = str(seed)

4. GPUを複数使って並列処理をする

訓練データをX_train, 訓練ラベルをy_train, 検証データをX_val, 検証ラベルをy_valとする

import tensorflow as tf

strategy = tf.distribute.MirroredStrategy()
with strategy.scope():
    <scopeの中でモデルを構築, コンパイルする>

#データを変形
train_data=tf.data.Dataset.from_tensor_slices((X_train, y_train)).batch(BATCH_SIZE)
val_data=tf.data.Dataset.from_tensor_slices((X_val, y_val)).batch(BATCH_SIZE)

options = tf.data.Options()
options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.OFF
train_data, val_data =train_data.with_options(options), val_data.with_options(options)

#通常通りにモデルをfit
history =model.fit(tr_data, validation_data = (val_data))  

参考文献

ABCI 2.0 User Guide Jupyter Notebookの利用
ABCI 2.0 User Guide Python
ABCI 2.0 User Guide TensorFlow-Keras
Tensorflowによる再現性の確保について(GPUを使用する場合)
GPUで並列処理をする際の入力データの形式について

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?