Categories: DeepLearning

Google Colabで訓練実行中の裏で定期的にバックアップ取りたい

1.6k{icon} {views}


Google Colabで定期的にGoogle Driveにバックアップにとる方法を紹介します。Linuxコマンドだけでできる単純な方法で、追加の課金は必要ありません。

悲しみを背負わないために

こんなことないだろうか

  • もう少ししたら訓練済み係数をダウンロードしようと思ってた
  • 気づいたらランタイム落とされてた
  • 訓練結果がパァに…

もちろん、全部自分でコードを書く前提なら、エポック単位でGoogleドライブに吐き出すような処理を追加すれば良い。しかし、他人が書いたコードだとそうもいかないこともあります。

ブロッキングせず定期的にスナップショットをとりたい

問題点は、Google Colab(Jupyter Notebook)で訓練実行中は、訓練部分のセルがずっとブロッキングしていて、他のセルが実行できないことです。

バックアップに求められる要件は、

  • 1回セルを実行したら定期的に動かしてくれる
  • ブロッキングするような処理ではない(訓練と競合しない)

別にNotebookを起動してバックアップ処理を走らせる方法もありますが、自分が確認したときは同じGPUランタイムで2つのノートブックを起動しても、別ランタイムが割り当てられてしまいました。

結論

!nohup bash -c 'while true; do cp -r -f logs /content/drive/MyDrive/Snapshot; sleep 300; done' &

sleepの部分は実行頻度(秒数)。この場合は5分ごとに実行

解説

  • nohup:バックグラウンドで実行
  • bash -c:LinuxのWhileループをnohupにつなぐ(参考記事
  • while true:無限ループで実行
  • cp -r -f:ディレクトリごとコピー、かつ強制的に上書き
  • logs:コピー元ディレクトリ。このディレクトリ以下をすべてコピー
  • /content/drive/MyDrive/Snapshot:コピー先ディレクトリ。Google Driveをdriveとしてマウントした場合。Colabのファイルマネージャーからボタン操作でマウントしたケースではこうなる
  • sleep:任意の実行間隔(秒)

やってみた

バックアップコード

!nohup bash -c 'while true; do cp -r -f logs /content/drive/MyDrive/Snapshot; sleep 300; done' &

ファイル生成コード

import datetime
import time
import os

while True:
  contents = datetime.datetime.now().strftime('%Y%m%d %H%M%S')
  if not os.path.exists("logs"):
    os.mkdir("logs")
  with open("logs/"+contents+".txt", "w") as fp:
    fp.write(contents)
  time.sleep(60)

こちらはPythonで無限ループしているので、処理がブロッキングされます。

結果(Google Drive)

5分おきにどんどんファイルが生成されており、想定した挙動です。上書きもされており、係数やログファイルの保存では便利そう。

雑感

ファイルの書き込みと、バックアップ側のファイル読み込みの衝突を考えていない結構ガバガバな仕様ですが、定期的にスナップショットをとる分には使えるのではないでしょうか。

こしあん