Google Colabでニューラルネットの学習中に、いかに処理を中断させないかで悩むことは多いと思います。ググるとよく紹介されているのは、
- 12時間や24時間でランタイムがリセットされてしまう問題:これはどうしようもないので、それまでにモデルや設定を保存しておいて、新たに立ち上げたランタイムで学習を継続する。
- 90分間操作がないとリセットされてしまう問題:シェルスクリプトやブラウザのエクステンションを使って、定期的にページをリロードする。
というものです。
ところで私が悩んでいるのは、「パソコンを閉じてネット回線も切った状態で何処かに移動する」時にどうすればいいかという問題です。ふつうに考えたら、90分以内なら実行中のランタイムにもう一度接続できてほしいところなのですが、少なくとも自分の環境(MacのChrome)では、妙な現象が起きます。
何も実行してない状況なら、再接続することで普通に続きから使えるのですが、学習の実行中とかに切ってしまうとおかしくなります。
どういうことかというと、下記画像のように、
- 右上に「実行中」と表示され、実際にプログラムが動いているにも拘らず、右のほうに「ランタイムに接続していません」と出る。
- 左のほうをみると、Google Driveのアイコンが未使用状態になっているのに、接続されているディレクトリが表示されており、実際ここにファイルを移したりできる。
という変な状態になります。
そして、右上のメニューから「ホストされているランタイムに接続」を押すと、下の画像のように、左下に「ランタイムに接続できません」という表示がでて、エラーになります。
一応、プログラムは動いている様子で、学習も継続されているのですが(新しくログが出たりするので)、私が確認した範囲だと、学習済みモデルを保存するときにエラーが起きるようです。私の場合、以下のようなエラーが出ます。
ERROR:root:Internal Python error in the inspect module. Below is the traceback from this internal error. (省略) RuntimeError: Parent directory projects/EJTrans_1.3M/model does not exist. During handling of the above exception, another exception occurred: (省略) OSError: [Errno 107] Transport endpoint is not connected
あまり正確に理解できてないのですが、状況から推察すると、Google Driveのマウントが解除されてしまっていて、保存先が見つからないということだと思ます。じゃあGoogle Driveをもう一度マウントすればいいような気がするのですが、操作するとマウント自体はでき(ているように見え)るのですが、なぜか同じエラーが出続けてやはり保存はできません(でも後述の、colabサーバかファイルを移す操作はできます)。
で、対処法ですが、実行中の処理を中断できるなら中断して、保存したいものを、Google DriveではなくGoogle Colab側のサーバに保存します。以下はルートに保存した例。
torch.save(transformer.state_dict(), "/model.pth")
で、いったん保存すると、Colabの画面左側にある「ファイル」のビューアから、ルートまで辿っていくとファイルが保存されてるので、それを上から3つめぐらいにある「content」の中の「drive」の中の「MyDrive」にドラッグすれば、Google Driveに移すことが出来ます。
ただし、下記の画像のように、実行の中断を受けつけてくれない場合があります。これは根気よく待てば中断できたりもしますし、私の経験では、中断のボタンを押してからブラウザをリロードすると、ランタイムの状態を保ったまま処理を中断してくれます。
この処理の中断ができない場合は、保存の操作ができないので、ランタイムを再起動するしかなく、こうなるとどうしようもありません。そういう場合を見越して、最初からモデルをColab側のサーバにも保存しておくのが安全なのかも知れません。実行中のプログラムを停止できなくても、ファイルを移す操作はできたような気がします。
プログラムが実行中かどうか、実行中のプログラムを停止できるかどうか、Google Driveの再マウントができるかどうか等で、いろいろ事象のパターンがかわりそうなのですが、厳密に検証はしてないので、理解が微妙に間違ってるかもしれません。とりあえず言いたかったのは、上述のようなエラーがでてせっかく途中まで学習したデータが失われそうな時に、画面の左側にあるファイルのビューアからcolabサーバ内に保存したデータをGoogle Driveに移すという操作で救える場合がある、ということです。