Google ColaboratoryのGPUをしゃぶり尽くす。


概要

「Google ColabratoryでGPUを使い倒したい!!」
と思ってるけど、下のようなお悩みをお持ちでないですか...?

  • 90分 & 12時間ルールでセッション切れする...
  • Google DriveにMountしたファイルの読み書きにやけに時間がかかる...
  • Colab使いすぎてGPU使えなくなった!

そんな貴方達に捧ぐ、Colabをしゃぶり尽くすTipsになります!

執筆日 : 2020/02/03

Colabの90分ルールのセッション切れ対策

課題

Colabは90分なんのセッションもないとセッションが切れて12時間使い切れない。
上記課題に対応するために二つやることがある。
- macのスリープ対策
- ブラウザのセッション対策

スリープ対策のために「環境設定」->「省電力設定」といってスリープ対策をしてもうまくいかなかったりする。

またセッション対策としてColabのファイルになんどもアクセスするスクリプト書いたり、Autoreloadを入れたりするやり方もあるが、1回目はちゃんとリロードしてもいいか押す必要があったりして面倒臭い。

解決策

  • スリープ対策
    「Amphetamine」というアプリを入れれば簡単にスリープの永続化をしてくれる!
    スリープしない時間も設定できるので、環境設定触ってPCがスリープしない状態なの忘れてて久々にPC開いたら「Oh...」ってこともない!

  • セッション切れ対策

実はColabのRamとか書いてるところを押すと、再接続になる。
これを活用して、そこを定期的にクリックするスクリプトを書いてあげればOk!

  1. Cmd + option + i でブラウザのコンソールを開く。
  2. コンソールで以下を実行。
function ClickConnect(){
    console.log("Working!"); 
    document.querySelector("colab-toolbar-button#connect").click() 
}
setInterval(ClickConnect, 1200000) // 20分ごと

これでセッション対策も完璧!

Google DriveにMountしたファイルの読み書き問題

課題

多くの人がGoogle Driveのファイル群をColabに以下のコマンドでマウントさせて使っていると思います。

from google.colab import drive
drive.mount('/gdrive')

しかし!Google DriveのマウントによるファイルのIOってかなり遅いんですよね...。

なんで画像のトレーニングなどで大量の画像ファイルやjsonファイル(annotation)を扱いたいとき、めちゃ遅かったりします。
これが非常にまどろこっしい!!トレーニング関係ないことですら遅い!!

解決法

1GB以上とかのファイル群なら、Google Driveにzipで固めて、
GoogleDriveのファイル群をColab内の環境に直でダウンロードしてしまった方が早い場合が多いです。
しかも!実はGoogle Driveのファイルは、少し手間を踏めばwgetでダウンロードできちゃいます。
そうすればAWSとかGCPとかのストレージファイルにあげなおす必要もないし、お金もかからないし、最高!!

【具体的なやり方】

  1. ダウンロードしたいファイルをzipで固める。
  2. 対象ファイルを右クリックして、「web上の全ての人に共有」にする。
    「共有」->「詳細設定」->「特定のユーザーがアクセスできます」の横の「変更」->「web上の誰でも」
  3. 「共有可能なリンクを取得」からリンクを見て、ファイルのIDを取得。
    https://drive.google.com/open?id=abc123ならFILEID=abc123
  4. 以下のbashを実行。
# /content/dataset.zipとして対象ファイルをダウンロードする。

# そこまで重くない場合
wget --no-check-certificate 'https://docs.google.com/uc?export=download&id=<FILE_ID>' -O /content/data.zip

# まあまあ重い場合
wget --load-cookies /tmp/cookies.txt "https://docs.google.com/uc?export=download&confirm=$(wget --quiet --save-cookies /tmp/cookies.txt --keep-session-cookies --no-check-certificate 'https://docs.google.com/uc?export=download&id=<FILE_ID>' -O- | sed -rn 's/.*confirm=([0-9A-Za-z_]+).*/\1\n/p')&id=<FILE_ID>" -O /content/dataset.zip && rm -rf /tmp/cookies.txt

# /content にデータを展開する。
unzip -q /content/dataset.zip -d /content

参考 : https://medium.com/@acpanjan/download-google-drive-files-using-wget-3c2c025a8b99

共有設定が全世界に公開になるので、データが機密情報の時は試さないでね!

Colab使いすぎてGPU使えなくなる問題

課題

GPUを使い倒し続けていると、急にGoogleから「アカウントにGPU割り当てられないよ〜」ってメッセージが届く。
その間しばらくGPUは使えない...。悲しい...。
「でもでもどーしてもGPU使いたいの!!」って諸君。

解決策

Gmailアカウントを別のでやろう!
...ん?「そら、それならできるだろう」と?「ファイル構成そのアカウントに作り直さなきゃじゃん」と?

一つ目はごもっともです、流石に同じアカウントではできない、多分。大人しくGmailアカウント作ってください。

二つ目に関して。
ファイルの構成は元のアカウントのものを使えればいいはず。
そして、Google Driveのマウントは「別のアカウントのGoogle Drive」にも実はできてしまう。
ということで、以下のステップを踏めば簡単に別アカウントでipynbを動かせる。

  1. 実行したいipynbを新しく作ったアカウントに共有する。
  2. 新しく作ったアカウントから、共有されたipynbを開く。
  3. mountする際に選択するアカウントを元のアカウントにする。

以上で、GPUを使えなくても別アカウントのGPUで簡単にノートブックを実行できる!

最後に

以上いろいろ書いたが、
どれもどこまで許されてるかわからないし、
急に禁止になるかもしれないので自己責任でお願いします。