Google Colabをプロ仕様に設定する

インフラ

1.Google Colabをプロ仕様に設定するまとめ

・ColabをVSCodeと組み合わせて使う方法や巨大ファイルのロードなど実務的使用例
・サイズの大きなファイルで時間のかかる学習を行っている人にとって参考になる
・本投稿はまだ全部のヒントの動作検証を行ってないので後日更新する可能性あり

2.限られた予算内で質の高い機械学習研究を行う方法

以下、medium.comより「Configuring Google Colab Like A Pro」の意訳です。元記事の投稿は2020年8月21日、Made-Up Mastersさんによる投稿です。

潤沢な予算をイメージしたアイキャッチ画像のクレジットはPhoto by Sharon McCutcheon on Unsplash

長い間、私はGoogle Colabの使い方を学ぶことを避けていました。

Colabは私が知っているJupyter Notebookに非常に近いものでしたが、Colabの独特な癖と、それを思い通りに機能させるために人々が何をどのように工夫しなければならないかについて、様々な掲示板の書き込みを見てきました。

私はそれを行う事を望んでなかったので、制限があっても安価なGoogleクラウドのプリエンプティブサーバに1時間辺り52円($0.50ドル/h)を支払うことに満足していました。しかし、使い勝手が悪くなってしまったため他のいくつかのサービスを検討しました。

そして、最終的にはColabに落ち着き、過去1年間でスキルが十分に向上し、Colabを機能させる方法を理解できるようになったと感じました。Colabで自動音声認識の研究を行うために、私が学んだ事、行った事を共有します。

このガイドは何か?

このガイドは、VSCode(Visual Studio Code:Microsoftが開発したWindows、Linux、macOSで動くソースコードエディタ)を使用したColabへ接続など、Colabを大規模なプロジェクトで使用できるようにする高度な機能と工夫を記載しています。

Colabの基本機能については既に優れた文書があるため、ライブラリのインストールやファイルのアップロードなどの説明しません。

コード付きのColab Notebookへのリンクは末尾の関連リンク内の「Configuring Colab Like a Pro Template」をご覧ください。

ヒント1:Colabが自動切断されないようにする

%%javascript
function ClickConnect(){
console.log("Working");
document.querySelector("colab-toolbar-button#connect").click()
}setInterval(ClickConnect,60000)

コンソールを開き、JavaScriptを入力して再接続ボタンをクリックすることで、Colabが自動切断されないようにする事ができるのは公然の秘密です。

Ctrl-Shift-Iを押して(訳注:Linuxの場合。WindpwsではF12、Macではcommand + +option + i)、デベロッパーツールを開いて、上記コードを毎回貼り付けるのは非常に古くさい手順ですが、Colabの

%%javascript

を使用すればセルからJavaScriptを実行する事ができます。

長時間のトレーニングループを行う前に上記のセルを追加し、トレーニングの途中で切断されないように実行します。この「切断保護」コードには、インターネットを捜せばいくつかのバリエーションを見つける事ができます。上記のコードがうまくいかない場合は、巻末の補遺セクションで詳細を確認してください。

注意!
このコードは責任を持って使用してください。
Colabから一々起動するのは非常に面倒ですが、貴方が積極的にColabを使用していない時に他の人がColabを利用できるようにするために行われています。何らかの理由で、Colabは、貴方が数時間のトレーニングを実行しているとき(つまり積極的に使用している時)でも切断してくる時があります。これは、そのような事態を回避するためにのみ使用してください。

ヒント2:Google ドライブをマウントして、データセットに迅速にアクセス

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

ご存知のとおり、Colabは、セッションの終了時にColab内にダウンロードしたファイルも作成したファイルも全て削除します。最適なオプションは、Githubを使用してコード(詳細は後述)を保存し、Googleドライブを使用してデータセット、ログ、および通常はgitによって追跡されない種類のファイルやその他のものを保存することです。

上記のコードを実行すると、リンクが表示されるのでクリックして、約30秒程度の時間がかかる手順に従う必要があります。完了すると、全てのGoogleドライブ内のファイルがColab内の「/content/drive」配下からアクセス可能になります。

この仕組みを使うと、Google クラウドでサーバを利用した場合と同じようにプロジェクトのファイルを整理して配置できます。私はpytorch-lightningログをGoogle ドライブに保存し、notebook内のTensorboardを使用してそれらを表示できます。この詳細についてはヒント6を参照してください。

ヒント3:wgetを使用して巨大なデータセットをGoogleドライブにダウンロード

! wget -c -P '/content/drive/My Drive/Colab Notebooks/data/' http://www.openslr.org/resources/12/train-clean-100.tar.gz

貴方のコンピュータからGoogle ドライブへファイルをアップロードする際、特に複数のギガバイト以上の巨大ファイルをアップロードしようとすると非常に時間がかかる場合があります。

wgetコマンドを使ってColab内に直接ダウンロードした方が速度ははるかに速いので、wgetコマンドを利用してください!

wget -c -P save_path url

これにより、データを一度でダウンロードできるため、貴方の時間とデータセットを公開してくれている寛大なデータ提供者のネットワーク帯域幅を節約できます。

ColabおよびDriveでデータを解凍および解凍する方法の詳細については、補遺を参照してください。

一般的な注意点として、Googleドライブの割り当てに関する奇妙な問題があるため、ドライブ内で圧縮ファイルを解凍するよりも、圧縮ファイルをcolabにコピーして解凍する方がよいでしょう。
これは、次のヒントに関連します。

ヒント4:Gdownを使用して、Googleドライブ内の公開ファイルを取得

Gdownは、Google ドライブからcolabに大きなファイルをダウンロードするための優れたライブラリです。

解凍するファイルが10GB未満で、1日に複数回実行しない場合、これは厳密には必要ありませんが、データセットがプライベートでない限り、最も良い方法としてお勧めします。

ヒントをくれたSheik Mohamed Imran(@sheikmohdimran)に感謝します

注:Googleは最近、共有可能なリンクのフォーマットを変更しました。Gdownを機能させるためにURLを指定する方法の詳細については、github.comの私の投稿(Gdrive link format change #54)を参照してください。

訳注:以下のようにURLからIDを抽出します。
# sample url
# https://drive.google.com/file/d/1-06_xAMDJ2yd75FnUOs3BK7gviO6pnoZ/view?usp=sharing
url = https://drive.google.com/uc?id=1-06_xAMDJ2yd75FnUOs3BK7gviO6pnoZ
output = 'my_archive.tar'
gdown.download(url, output, quiet=False)

ヒント5:Githubに接続するための最良の方法

クレジット: Vinoj John Hosan(stackoverflow.comの「Methods for using Git with Google Colab」への回答として)

このコードは少し長いですが、ここにある他のコードと同様に、コピーしてメインのnotebookの上部のセルに貼り付け、起動時に実行できます。これにより、パスワードをnotebookに保存したままにすることなく、パブリックリポジトリとプライベートリポジトリの両方にアクセスできます。

ボーナスヒント:
Gitに自分が誰であるかを伝えることを忘れないでください。
以下のセルを追加すると、新しいセッション中にコミットするたびに応答する必要がなくなります。

!git config --global user.email <YOUR EMAIL>
!git config --global user.name <YOUR NAME>

ヒント6:SSHとngrokを使ってVSCodeでファイルを編集

ngrokは、自分のPC上で動いているtcpサービスを外部からアクセスできるようにするサービスです。

DevOps型の開発が怖い人間の一人として、このトリックが思ったよりずっと簡単である事を約束します。

また、コマンドラインアクセス、githubパスワードを再入力する必要がないこと、さらにVSCodeを使ってローカルPC上で.pyファイルを編集できることは、多少のトラブルに見合うだけの価値があります。セットアップが完了すると、貴方は全てを自分のコンピュータで実行しているように感じられるでしょう。

以下があなたがする必要がある全てです:

(1)ngrokホームページにアクセスし、アカウントを作成して、無料のAPIトークンを上のコードの<YOUR NGROK API TOKEN HERE>部分に貼り付けます。

(2)上記のセルを実行します

(3)出力をコピーして.ssh/configに追加します。(これを行う方法がわからない場合は、補遺を参照してください)

ここに一つの落とし穴があります。
ngrokはバックグラウンドで実行されるため、Google Colabのストップセルを実行したり、実行が中断されると、ngrokプロセスが強制終了され、VSCodeから切断され、sshconfigを再起動して更新する必要があります(約60秒かかります)。

月額$10を支払う意思がある場合は、ngrokproに付属の静的TCPアドレスを使用してこれを回避できます。詳細については、補遺を参照してください。

ヒント7:Colabから自分のコンピュータにポートを転送する方法

場合によっては、Jupyter、flask、Tensorboardなど、実行の際にブラウザが必要なプログラムをColab内で実行したい場合があります。

Colab内でブラウザを起動する事は出来ないので、解決策はポートを転送して、ローカルPCで実行しているブラウザから開くことができるようにすることです。これにはSSH接続が必要なので、最初にヒント6を行う必要があります。
VSCodeを接続したら、以下の2つの方法でポートを転送できます。

(1)このセッション用に
VSCodeで、Ctrl-Shift-Pを押してコマンドパレットを表示し、「Forward a Port」と入力してから、転送するポートの番号を入力します。(通常、flaskの場合は5000、reactの場合は3000、jupyterの場合は8888、tensorboardの場合は6006)

(2)接続する度に
VSCodeで、Ctrl-Shift-Pを押してコマンドパレットを表示し、「Remote-SSH:Connect to Host」、「Configure SSH Hosts」と入力して、SSH構成ファイルを選択します。Colabへの接続に使用する項目の下に
LocalForward127.0.0.1:<PORT>
127.0.0.1:<PORT>
を追加し、<PORT>部分を転送するポート(例:8888)に置き換えます。

私が8888を指定した場合は次のようになります。

これにより、貴方のブラウザでhttp://localhost:8888/を開く事が出来るようになり、そこに表示されているのはColab上のポート8888で実行されているプログラムが返したデータです。

ヒント8:ColabまたはブラウザでTensorboardを実行

%load ext tensorboard

を含む実行セルを作成してTensorboardを開始し、次に

%tensorboard --logdir /PATH/TO/LOGS

これにより、操作可能なTensorboardを実行する特別なnotebookセルが作成されます。Tensorboardがリアルタイムで更新されない場合は、

%reload_ext tensorboard

を使用して拡張機能をリロードできます。

VSCodeを使用して接続している場合は、ヒント7で説明されているように、ポートを転送することでブラウザでTensorboardを使用することもできます。Tensorboardの正確な手順は次のとおりです。

(1)貴方のSSH configのHost google_colab_sshの項目に以下を追加します。

LocalForward 127.0.0.1:6006 127.0.0.1:6006

これは、port 6006(tensorboard)をColabからローカルPCに転送します。

(2)Colabインスタンスにリモート接続しているVSCodeターミナルから

tensorboard --logdir /PATH/TO/LOGS

を実行します

(3)ローカルブラウザでlocalhost:6006を開くと、そこにTensorboardがあります。

ヒント9:ColabでJupyter Notebookサーバを実行しローカルPCからアクセス

ColabはJupyterを土台にして構築された驚異的なツールで、素晴らしい仕事ができますが、元のJupyterに戻す必要が出て来る場合もあります。

私はfastai_audioの保守を支援しています。これは、fast.aiの他のプロジェクトと同様に、Jupyter Notebookで完全に開発および文書化されているプロジェクトです。(Jeremy HowardとSylvain Guggerに感謝します)。

GPUが必要だったため、プロジェクトに貢献するためにColabを使用したかったのですが、fast.aiのフォーラムでの投稿を見つけ、@TheZachMuellerがそれを実現するために使用したトリックを知るまで、その方法を理解できませんでした。

これを行うには2つの方法があります。

(A)ヒント6のcolab_sshとvscodeを既に使用している場合

(1)Colabでこのコマンドを実行して、ポート8888で実行するバックグラウンドとしてJupyter Notebookを起動します

!nohup jupyter notebook — no-browser — allow-root — ip=0.0.0.0&

(2)ヒント7の説明に従って、ポート8888を転送します。

(B)vscodeを使用したくないが、ブラウザからjupyterを利用できるようにしたい場合

fast.aiフォーラムの投稿「Creating your own Jupyter session from Colab for fastai version 1」で説明されている黒魔術に従ってください。

訳注:(B)はどうしてもjupyterを使いたい場合、今でしたら、わざわざColab上でjupyterを動かさずともfast.aiと提携もしているPaperspace社のGradientというjupyter提供サービスを使った方が良いと思います。Google Colab同様に無料で使えるマシンタイプ(GPUも)があるのと、fast.aiの生徒向けに2020年12月31日まで有効な$15の利用枠クーポンコードが提供されています。(末尾リンク参照)

ヒント10:コードの実行に時間がかかる場合はfastprogressを使用

! pip install fastprogress
from fastprogress import master_bar, progress_bar

Fastprogressは、fast.aiファミリーによって提供された、クリーンで適切に設計されたプログレスバーライブラリです。

それをインストールしてnotebookの上部にある他のセルと一緒にインポートしてください。

実行に長時間かかるループを追跡する必要があるときはいつでも、progress_bar()で繰り返し処理している箇所を呼び出して簡単に処理できるようになります。

これが何を意味するのか正確にわからない場合は、以下の例を確認してください。

#before
for item in my_list:
  process(item)
#after
for item in progress_bar(my_list):
  process(item)

ヒント11:Telegramボットをセットアップしてタスク完了を通知

訳注:Telegramは日本で言えばLINE的なメッセージングアプリです。

PythonからTelegramメッセージを送信するボットを作成する非常に簡単なガイド(How to Write a Telegram Bot to Send Messages with Python)と、それを学習が完了した際に呼び出すための統合する方法を記述したガイド(How to Write a Telegram Bot to Send Messages with Python Part 2)を作成しました。

2番目のガイドでは、セットアップの手間を最小限に抑えてcolabで実行するために必要ないくつかの調整について概説しています。

毎朝、私はバッチプログラムにgithubリポジトリからプルし、データセットをダウンロードして抽出し、ライブラリをインストールするなどなどを自動で行わせます。私はポーチの外に出てコーヒーを飲み、数分後にサーバの作業準備ができた事をTelegramからメッセージとして受け取ります。

検討する価値のあるいくつかの有料オプション

(1)Colab Pro
$9.99/月
現在は米国でのみ利用可能(2021年4月追記:Colab Proが日本から利用可能になりました。)
これにより、より高速でメモリの多いGPUにアクセスできるほか、使用制限時間が長くなり、切断の頻度が少なくなります。余裕があれば、価格に見合う価値があります。

(2)追加のGoogleドライブストレージ
$29.99/年(200GB)または$99.99/年(2TB)
私は200GBの料金を支払っています。私は保守的なので、音声認識の研究用途には問題ありません。(私が使っているデータセットは、最大1000時間の音声と最大75GBです)

(3)Ngrokの静的TCPアドレス
99ドル/年または9.99ドル/月
これはかなり高価であり、ほとんどの人にとって必要ではありません。これがもたらす主な利点は、colab_sshを実行するたびにtcpアドレスが変更されることがないのでSSH_Configを更新する必要がなくなると言う事です。

訳注:
前述のGradientではGPU Instancesが$0.45/hからあるのとTPUv2も$8.42/hから使えるらしいので、こちらも候補として記憶しておくと良いと思います。

補遺

時々、各ヒントがすんなり動かなくなる時があります。以下は、各ヒントを機能させるために必要となる可能性のある追加のヒントです。

ヒント1:Colabが自動切断されないようにする

「切断保護コード」にはいくつかのバリエーションがあります。 上にリンクされているものがうまくいかない場合は、VijayabhaskarJがTwitterで私に親切に教えてくれたこのStackOverflowの投稿「How to prevent Google Colab from disconnecting?」内の以下のコードを試してください。

function ConnectButton(){
console.log("Connect pushed"); 
document.querySelector("#top-toolbar > colab-connect-button").shadowRoot.querySelector("#connect").click() 
}
setInterval(ConnectButton,60000);

ヒント3:wgetを使用して巨大なデータセットをGoogleドライブにダウンロード

ドライブから.tar.gz(tgz)ファイルを解凍する方法

gzipで圧縮されたファイルをドライブにダウンロードした場合、解凍する必要があるのは1回だけです。回答されたtarファイルはドライブに残ります。 あなたはそれを以下で解凍することができます

! gunzip <PATH_TO_GZ_FILE>/<ARCHIVE_NAME>.tar.gz
# example from my own colab
base_path = Path('/content/drive/My Drive/Colab Notebooks')
! gunzip "{base_path}/data/train-clean-360.tar.gz"

.gzファイルは.tarファイルに置き換えられますが、毎日セットアッププロセスの一部としてそれをcolabに抽出する必要があります。

データが公開されている場合は、ヒント4で説明したようにgdownを使用する必要があります。その後、以下のコマンドを使用してローカルでデータを抽出できます。

! tar -xf <PATH_TO_ARCHIVE> -C <FOLDER_TO_EXTRACT_TO>

データが公開されていない場合は、gdownの手順をスキップして、マウントされたGoogleドライブ内のアーカイブへのパスにtarコマンドを指定します。私自身のコラボからの例を以下に含めて、それがどのように見えるかを示します。

! tar -xf <PATH_TO_ARCHIVE> -C <FOLDER_TO_EXTRACT_TO>
# example from my own colab 
! mkdir /content/spanish/data/librispeech
! tar -xf "/content/drive/My Drive/Colab Notebooks/data/train-clean-100.tar" -C /content/spanish/data/librispeech

私の経験では、これには1GBのデータあたり約30秒かかります。
私にとっては、colabの開始時に全てのセットアップコードをまとめてバッチ処理し、実行中にコーヒーを淹れているので、これは許容範囲内です。

ヒント4:Gdownを使用して、Googleドライブ内の公開ファイルを取得

これは通常、大きなファイルに対して機能しますが、上手く動かない場合、または意味不明な「入力/出力エラー」が表示された場合(ファイル転送制限上限に達した場合などにも表示されます)に使用できる追加のトリックが1つあります。 。

これを解決するには、リンクを知っている人なら誰でもダウンロードできるように、Googleドライブでデータセットを公開して共有し、そのリンクからfile_idをコピーして、以下の途方もないコマンドを実行する必要があります。

file_id = <YOUR_FILE_ID> #e.g. '1-76_xBMDJ1Cd65FnUOs3SK7gpiO6pnrS'

file_name = <ARCHIVE_FILE_NAME> #e.g. 'train-clean-360.tar'

! 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 {file_name} && rm -rf /tmp/cookies.txt

! tar -xf /content/<ARCHIVE_FILE_NAME> -C <PATH_TO_EXTRACT_TO>

絶賛に値する栄誉は、これが可能であると考えてガイドを公開してくれたAnjan ChandraPaudelのものです。

また、Googleドライブからの転送で問題が発生した場合は、

! cat /root/.config/Google/DriveFS/Logs/drive_fs.txt

でログを確認できます。

ヒント5:Githubに接続するための最良の方法

colab_sshを使用してgithubに接続することもできますが、notebookにgithubのoauthトークンをプレーンテキストで保存する必要があります。つまり、notebookを共有していてトークンの削除を忘れた場合、誤って誰かにアクセスを許可してしまう可能性があります。
oauthトークンの範囲を制限することはできますが、最終的な安全のために、パスワードを手動で入力することにしています。

ヒント6:SSHとngrokを使ってVSCodeでファイルを編集

ngrok出力をsshconfigに追加する手順:

(1)VSCodeでCtrl-Shift-Pを押してコマンドパレットを開き、「Remote-SSH:ConnecttoHost」と入力してEnterキーを押します。

(2)「Configure SSH Hosts」を選択します

(3)改行して出力を貼り付けて保存します

(4)手順1を繰り返し、ドロップダウンリストから「google_colab_ssh」を選択します

(5)これで、リモートマシンに接続されます。 初期フォルダが/rootである可能性が高いのですが、コードは/contentに存在している事に注意してください。従って、ctrl-k ctrl-o(フォルダーを開く)を押して、/content/<貴方のコードが存在するフォルダ>を選択します。

ngrok proを使用した静的TCPアドレスの設定:

(1)ngrok proアカウントを月額$10または年額$99で登録します。

(2)ngrokのダッシュボードから「Endpoints->TCP Addresses」を選択します

(3)「Reserve an address」をクリックします

(4)launch_sshcodeを変更して、remote_addrを含めます。

例:

launch_ssh(ngrokToken、password = "password"、remote_addr = "<貴方のNGROK_TCP_ADDRESS>")

(5)更に良いことに、relaunch_ssh()という関数内に配置すると、コードの実行を中断する必要があるときはいつでも、新しいセルでrelaunch_ssh()をすばやく入力/実行して、再接続できます。

3.Google Colabをプロ仕様に設定する関連リンク

1)medium.com
Configuring Google Colab Like A Pro
How to Write a Telegram Bot to Send Messages with Python
How to Write a Telegram Bot to Send Messages with Python Part 2

2)colab.research.google.com
Configuring Colab Like a Pro Template

3)code.visualstudio.com
VS Code

4)github.com
wkentaro / gdown
fastai / fastprogress

5)ngrok.com
ngrok

6)forums.fast.ai
Creating your own Jupyter session from Colab for fastai version 1

7)course.fast.ai
Paperspace Gradientのセットアップの解説(Promotional creditにクーポンコード有)

8)stackoverflow.com
Methods for using Git with Google Colab
How to prevent Google Colab from disconnecting?

 

タイトルとURLをコピーしました