概要
「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!
- Cmd + option + i でブラウザのコンソールを開く。
- コンソールで以下を実行。
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とかのストレージファイルにあげなおす必要もないし、お金もかからないし、最高!!
【具体的なやり方】
- ダウンロードしたいファイルをzipで固める。
- 対象ファイルを右クリックして、「web上の全ての人に共有」にする。
「共有」->「詳細設定」->「特定のユーザーがアクセスできます」の横の「変更」->「web上の誰でも」 - 「共有可能なリンクを取得」からリンクを見て、ファイルのIDを取得。
https://drive.google.com/open?id=abc123
ならFILEID=abc123 - 以下の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を動かせる。
- 実行したいipynbを新しく作ったアカウントに共有する。
- 新しく作ったアカウントから、共有されたipynbを開く。
- mountする際に選択するアカウントを元のアカウントにする。
以上で、GPUを使えなくても別アカウントのGPUで簡単にノートブックを実行できる!
最後に
以上いろいろ書いたが、
どれもどこまで許されてるかわからないし、
急に禁止になるかもしれないので自己責任でお願いします。