Google Colaboratoryは、シャットダウンまでの残時間の90分ルールと12時間ルールというのがあります。
ディープラーニングのモデルのトレーニングなどは実行時間がかかるため、課金はされるけれどもGoogle AI PlatformなどのGPUのインスタンスマシンを用意して、実行を継続したくなることがあります。
また、GPUインスタンス上でノートブックを長時間実行していると、画面のセッションが切れて実行状況が画面から確認できなくなることがあるので、最後はコマンドラインで実行したくなります。
ということで、Google Colaboratoryで作ったノートブックをGoogle AI Platformで動作させ、さらにコマンドラインから実行する方法を説明します。
あわせて次のこともハマりどころなので、説明します。
・Google AI Platform上でTensorFlowを実行したがGPUが使われていない
・コマンドラインから実行するとTensorFlowがNotFoundError: No algorithm worked!
というエラーを出す
Google Colaboratory→Google AI Platform に移して実行する方法
手順を説明していきます。
1. Google Colabからipynbファイルをダウンロードする
Google Colab上でファイル > .ipynbをダウンロードで、ipynbファイルをダウンロードすることができます。ダウンロードしたipynbはGoogle AI PlatformのNotebook上でそのまま動作させることができます。
2. Google Cloud PlatformでGPUの割当を申請する
Google Cloud PlatformでGPUを利用するには事前に申請が必要です。
こちらの記事を参考に申請しておきます。
※記事ではDatalabインスタンスの作成の説明が載っていますが、それはこちらの記事にも書くので参照しなくても良いです
3. AI Platformで新しいノートブックを作成する
ノートブックを作成します。ノートブックを作成するとGPUのドライバやTensorFlow(GPU版)なども合わせてインストールしてくれます。また、このノートブックにSSHで入ってコマンドラインから実行することもできるので、GPUインスタンスを手っ取り早く用意することができます。
作り方は、Google Cloud Platform > AI Platform > ノートブック より「新しいインスタンス」を押して、インスタンスの種類を選択します。ここでは例としてインスタンスの種類に「TensorFlow 2.3」を選択し、GPUに「NVIDIA Tesla T4 GPU」を選択してみます。
インスタンスの作成画面が出るので、GPUの割当を申請したリージョンを設定します。「NVIDIA GPUドライバを自動的にインストールする」を選択するとドライバもインストールしてくれます。「作成」を押すとインスタンスの作成が始まります。
これでGPUインスタンスが用意されました。
4. AI Platformのノートブックでipynbを実行する
インスタンスが作成されて5分ぐらい待つと、「JUPYTER LABを開く」が押せるようになるので押します。
Jupyter Labが開いたら、Google Colabからダウンロードしたipynbを左ペインにDrag & Dropしてアップロードします。アップロードしたらダブルクリックすると開くことができます。
開いたノートブックはそのまま実行することができます。
5. ノートブック上でGPUが利用できる状態にあるかを確認する(TensorFlowのみ)
TensorFlowでGPUが利用できる状態にあるかを確認するにはノートブック上で次のコードを書きます。
import tensorflow as tf
print("GPU Available: ", tf.config.list_physical_devices('GPU'))
# 出力結果
# GPU Available: [PhysicalDevice(name='/physical_device:GPU:0', device_type='GPU')]
GPUの情報が表示されていれば利用できる状態にあります。
6. ノートブック上でGPUを実際に利用しているかどうかを確認する
GPUが利用できる状態にあっても、実際に使っていないことがあります。例えば利用しているライブラリがCPUしか使わない場合などです。
この状態を識別するために、実際の利用状況を確認します。
まず、ノートブックを実行しているインスタンスにSSHで入ります。
GCP > Compute Engine > VMインスタンス > ノートブックのインスタンス名 から「SSH」を押します。
ターミナルが起動したら次のように打ちます。
$ nvidia-smi
すると次のようにGPUの利用状況を確認することができます。
nvidia-smi -l 1
と打つと1秒ごとに実行してくれるので便利です。
Google AI Platformのノートブックをコマンドラインから実行する方法
ノートブックをコマンドラインから実行する方法を説明します。
1. ノートブックを実行する
ノートブックのVMインスタンスへのSSHログインは上で説明しているので、ログインした後からの説明になります。
Jupyter Labのディレクトリに移動します。
$ cd /home/jupyter
ls
を実行すると、ノートブック上で実行しているipynbファイルが確認できると思います。
ここから次のように実行すると、ipynbファイルを直接実行することができます。
実行はバックグラウンドプロセスとして動き、ターミナルをExitしたあとも動作し続けます。
$ sudo -u jupyter nohup sh -c "/opt/conda/bin/jupyter nbconvert --to notebook --execute my_notebook.ipynb --output my_notebook_output.ipynb --ExecutePreprocessor.timeout=2678400 --allow-errors --debug 1> stdout.log 2> stderr.log" &
※「my_notebook.ipynb」の部分は実行したいipynbを指定する。
※「my_notebook_output.ipynb」の部分は出力結果を保存する場所なので、任意の名前を指定する。
解説:
sudo -u jupyter
・・・ jupyterユーザーで実行しています。Notebookはこのユーザーで動作しているので同じユーザーを使わないと適切にリソースにアクセスできません。
nohup
・・・ ターミナルを抜けても実行を続けたい場合は指定します。
sh -c "・・・1> stdout.log 2> stderr.log"
・・・ 標準出力や標準エラー出力を、stdout.log, stderr.logにリダイレクトするために指定しています。
/opt/conda/bin/jupyter nbconvert --to notebook --execute my_notebook.ipynb --output my_notebook_output.ipynb --ExecutePreprocessor.timeout=2678400 --allow-errors --debug
・・・ ipynbを実行している部分です。「my_notebook.ipynb」を実行し、出力先に「my_notebook_output.ipynb」を指定しています。--ExecutePreprocessor.timeout=2678400
はセルあたりのタイムアウト時間で、デフォルトが30秒なので、2678400秒=31日にしています。
参考:Jupyter notebook をコマンドラインで実行する
コマンドラインで実行したら、'nvidia-smi'を実行してGPUが利用されているか確認します。ノートブック上ではGPUを利用していたのに、コマンドラインだと利用しないなんてこともあるので確認しておきましょう。
2. ノートブックを手動で停止する
ノートブックは実行が終われば停止しますが、処理中に手動で停止したい場合もあると思います。
このような場合に備えて、ノートブック上では途中停止されたら自動保存するようなコードを書いておくと良いでしょう。
例えば、TensorFlowのトレーニングであれば、try
〜except
を使って中断されたらモデルを保存するようにしておきます。
try:
model.fit(x_train, y_train_reshape, epochs=600, batch_size=32, validation_split=0.2, callbacks=[lr_callback, tb_cb])
except KeyboardInterrupt:
model.save('saved_model/my_model')
print('Output saved')
次に、手動で停止をする方法を説明します。
ターミナルに入ったままノートブックをバックグラウンドで実行していた場合はfg
コマンドを打った後にCTRL+C
で止めることができます。
ターミナルを一回抜けてしまった場合はps
でプロセスを確認し、/opt/conda/bin/python -m ipykernel_launcher
にSIGINTを送ります。ブラウザ側でノートブックを実行している場合は、ipykernel_launcher
が複数現れるので、コマンドラインから実行したほうのプロセスを選ぶ必要があります。
$ ps aux | grep python
〜略〜
jupyter 4145 102 3.5 12695156 2899356 ? Rsl 21:55 0:23 /opt/conda/bin/python -m ipykernel_launcher -f /tm
p/tmp8d9j2ld7.json --HistoryManager.hist_file=:memory:
〜略〜
$ sudo kill -SIGINT 4145
これでノートブックが停止しました。
補足: ノートブックをコマンドラインから実行したらNotFoundError: No algorithm worked!
とでた場合の対処
これについて正確な理由は分かりませんが、公式:GPUを使用する - GPUメモリの増加を制限するをノートブック上で指定しておくと回避することができました。
gpus = tf.config.experimental.list_physical_devices('GPU')
if gpus:
# Restrict TensorFlow to only use the first GPU
try:
tf.config.experimental.set_visible_devices(gpus[0], 'GPU')
logical_gpus = tf.config.experimental.list_logical_devices('GPU')
print(len(gpus), "Physical GPUs,", len(logical_gpus), "Logical GPU")
except RuntimeError as e:
# Visible devices must be set before GPUs have been initialized
print(e)
この現象は、TensorFlowのIssueにもされています。
参考:tensorflow/Issue/NotFoundError: No algorithm worked! when using Conv2D #43174
ただ、ここに書かれている次のような方法は、私の環境(TensorFlow 2.3.1)の場合はうまくいきませんでした。一応、紹介しておきます。
from tensorflow.compat.v1 import ConfigProto
from tensorflow.compat.v1 import InteractiveSession
config = ConfigProto()
config.gpu_options.allow_growth = True
session = InteractiveSession(config=config)
参考:TensorflowでConv2Dを使うとNo algorithm worked!になってしまう時の対処法
最後に
NoteではiOS開発、とくにCoreML、ARKit、Metalなどについて定期的に発信しています。
https://note.com/tokyoyoshida
Twitterでも発信しています。
https://twitter.com/jugemjugemjugem