Colaboratoryのランタイムと仮想マシン、セッション

Google Colaboratory を使わせてもらっているが、時間制限との関係で用語の意味がはっきりしないので調べてみた。現状をまとめてみる。ただし、良くわかっていない点が残っている。

また、仮想マシンの/proc/uptimeの値を基に、仮想マシンの終了、再起動について推測した。

!cat /proc/uptime | awk '{print $1 /60 /60 " hours (" $1 " s)"}'

関係

現時点までに調べた範囲でのランタイム、仮想マシン、セッションの関係の例を下に図示する。図では2つの仮想マシンしか書いていないが、より多くの仮想マシン(セッション)も利用可能である(何らかの制約があると思われるが詳しい条件は不明)。

ランタイム

ランタイムの意味は  Python (IPython) kernel を実行しているJupyter Notebookという意味であろうと思われる。

「ランタイムログの表示」からkernelのIDを取得することができる。

ランタイムが終了すると、Pythonの実行状態や変数の値などは失われる。

ランタイムが終了しても、仮想マシンが終了していなければローカルファイルは失われない。

ホスト型ランタイムとローカルランタイム

ホスト型は、Googleのクラウドにある仮想マシンで動作させるランタイムであり、ローカルランタイムはユーザの手元にあるマシンで動作させるランタイムである。

ランタイムのタイプ

ホスト型の場合には、カーネルを動作させる仮想マシンの機能を選べる。

GPUが使える仮想マシン、TPUが使える仮想マシンで動作、(GPU、TPUのない)CPUだけの仮想マシンNoneから選択できる。

ランタイムのタイプの変更

ランタイムのタイプを変更することで、新しい仮想マシンが割り当てられて、その中に Jupyter Notebook (とkernel) が生成される。ランタイムのタイプを変更した場合には、それまで利用していたJupyter Notebook を実行していた仮想マシンは残っている。

ランタイムのタイプをGPUからCPUに変更した後に、ランタイムのタイプをCPUからGPUへ元に戻すと、以前使っていたGPUが利用できる仮想マシンが再利用される。ただし、kernelは初期化される。

ランタイムを再起動

当該のノートブック(ブラウザのタブ)から接続しているJupyter Notebook (および kernel)を再起動する。

「ランタイムログの表示」からkernelが再起動されることがわかる。

ただし、「ランタイムログの表示」から分かるkernelのIDが再起動しても変化しないこと(、および、再起動後のuptimeが再起動前のuptimeよりも減少することはないようであること)から、kernel (Jupyter Notebook)を動作させている仮想マシン自体は同じものがそのまま利用されていると考える。

すべてのランタイムをリセット

同一アカウントで利用している仮想マシンすべてを停止させる。

「ランタイムログの表示」からkernelがIDが変化していることから、新しいkernelに接続されている。

また、再起動後のuptimeが再起動前のuptimeよりも減少することもあることから、接続する仮想マシンも変わっていると思われる。

仮想マシン

仮想マシンにはローカルファイルシステムが含まれる。仮想マシンが終了するとローカルファイルシステムは失われる。

GPU、TPUが利用できない(None)仮想マシン

仮想マシンのインスタンスの区別が難しい。最近のIntelのプロセッサにはIDがないこともあり、ある時点で仮想マシンを動作させている実マシンを区別することも難しい。

複数のノートブックを開くと、それぞれ /proc/uptime が異なっており、仮想マシンのインスタンスが異なると考えられる。

すべてをリセットした直後にノートブックを開いても /proc/uptime が数百秒になっていることがあり、いつも新規に仮想マシンのインスタンスが生成され、接続されるわけでないようだ。仮想マシンのプールがあって、そこからインスタンスが割り当てられているのであろうか?プールから生成済みの仮想マシンを選んで接続することによって、生成・初期化の時間を省き、短時間で使えるようにしているように思われる。プール内の仮想マシンが少なくなったら仮想マシンの生成を行うというようなことをしているのであろうか。

/proc/uptime の時間を基に一定時間(12時間?)でシャットダウンされるなら、接続後に実際に利用できる時間は12時間よりも短いことが考えられる。

GPUを利用できる仮想マシン

GPUのUUID(Universally Unique IDentifier)によって仮想マシンのインスタンスの区別ができる。

!cat /proc/driver/nvidia/gpus/0000:00:04.0/information

以下のような出力中のGPU UUIDで区別できる。

2019年11月8日時点では、uptime とシャットダウンの関係などは調べていない。None仮想マシンと同じ挙動をするのか確認していない。

TPUを利用できる仮想マシン

TPUのIDがあるのか、あるとして取得できるのか調査しきれていない。None仮想マシンと同じ挙動をするのか確認していない。

セッション

「セッションの管理」から「終了」を選ぶと仮想マシンが終了する。セッションは、仮想マシンとブラウザが接続されてから接続が切れるまでの流れもしくは仮想マシンが動作状態であることを意味するようだ。

「終了」後に再接続すると、kernel の idが変わっており、uptimeも減少していることがあることから、「セッションの管理」から「終了」を選ぶと仮想マシンが終了すると考えられる。

「終了」を選択しないで、ブラウザを閉じたような場合は、終了する前のノートブックのURLにアクセスすることで以前のセッションにアクセスできる。

仮想マシンの時間制限

ColaboratoryのFaq ( https://research.google.com/colaboratory/faq.html ) には次の記載がある。

Where is my code executed? What happens to my execution state if I close the browser window?
Code is executed in a virtual machine dedicated to your account. Virtual machines are recycled when idle for a while, and have a maximum lifetime enforced by the system.

仮想マシンはアイドルが続くと再利用され、システムによって設定された最大生存時間があるということであるが、FAQでは、時間の具体的な値については明確にされていない。

idleとは

FAQのidleの意味については、以下のような記述のWebがあり、Webだけでははっきりしなかった。

  • セッションが切れてから90分が経過するか、仮想マシンの実行時間が12時間を超えると仮想マシンがシャットダウンする (セッション切れの状態がidle)
  • AutoRefreshなどでページの更新を行うことで、90分のルールでシャットダウンされないようにできる(ページが操作されない状態がidle)

Noneランタイムを使った場合しか試していないが、Auto Refreshなどでページの更新を行わなくても、セルを実行中であれば90分以上経過してもシャットダウンされない。

次のようなループを実行して放置したところ5時間を経過しても動作していた。

import datetime
import time

time_in_second = 60

start = time.time();
while True:
  print(datetime.datetime.now())
  print(time.time() - start)
  time.sleep(time_in_second)

このことから少なくとも Noneランタイムの idle というのは、キー・マウス操作やブラウザのリフレッシュが行われていないという状態ではなく、セッションが接続されていても何も実行していない状態かセッション切れの状態ということのようである。

idle回避の自動ページ再ロードは不要?

プログラムを実行しているのであれば、セッションが切れないようにブラウザを起動しているPCがスリープ状態にならないようにする必要はあるが、Auto Refreshなどのページ更新は不要ではないかと思われる。ただし、GPUやTPUが利用可能な仮想マシンは試していないので、それらではページ更新が必要な可能性がある。

ちなみに、Auto Refresh を利用するのであれば、次のページの記事の手順に従うことで自動更新時のダイアログを抑制できる。ダイアログの抑制方法を知らなかったので参考になった。

Google Colaboratory の 90分ルールを回避したい。

Colaboratoryの終了のさせかた

ブラウザのタブを閉じて放置すればセッション切れのタイムアウトによって利用していた仮想マシンは終了するが、利用状況によって制限を受けることがあるという記載がFAQにあり、仮想マシンを終了させたいこともある。

明示的に仮想マシンの利用を終了させるためには、以下の方法がある。

特定のセッション(ノートブックを実行している仮想マシン)の終了

「ランタイム」→「セッションの管理」→「終了」

「ランタイム」だけではなく、仮想マシンも終了する。セッションも当然切れる。終了前の仮想マシンにアクセスすることはできなくなる。

他のセッションを終了

「ランタイム」→「セッションの管理」→「他のセッションを終了」を選択すると、そのとき表示されているパネルの「その他のセッション」に示されているセッションがすべて終了する。しかし、「ハードウェアアクセラレータ」が異なる(表示されていない)セッションは終了しないようである。

すべてのランタイムをリセット

「ランタイム」→「すべてのランタイムをリセット」をすると、「ハードウェアアクセラレータ」が異なるセッションもすべて終了するようだが、その後、「すべてのランタイムをリセット」をする際に利用しているノートブックが再接続されるようで、すべての仮想マシンがなくなるとは限らない。

すべてのセッション(仮想マシン)の終了

「ランタイム」→「セッションの管理」→「他のセッションを終了」と「ランタイム」→「セッションの管理」→「終了」を併用する必要があるようだ。