機械学習の勉強環境の1つ「Google Colaboratory」

野澤哲照氏(以下、野澤):「Google ColabとVSCodeを用いたデータ分析環境運用Tips」ということで、野澤が発表します。

最初から免責で申し訳ないのですが、今日紹介する方法はGoogle側が推奨している方法ではないので、急に使えなくなる可能性もあります。そこだけご了承ください。

今日話す内容ですが、ざっくりGoogle Colab(Google Colaboratory)とVSCodeを紹介して、最終的にどういう環境が作れるかというところと、環境構築手順・運用時のポイントなどを話していければと思います。

私は、Twitterとかでは「たかぱい」というIDでやっています。コネヒト株式会社で、自然言語処理や推薦システムをメインにやりつつ、AWSを使って、機械学習基盤を作ったりしています。あと、週1でポッドキャストを友人と配信しているので、よければ聞いてみてください。

みなさん、ふだんどのような環境で機械学習の勉強をしていますか? コンペティションに参加していますか? という問いから始まるんですけれども。

いろいろと手段はあると思っていて、例えば自宅のマシン、クラウドの環境、Kaggle Notebookなどがあるのですが、今日は、このGoogle Colaboratoryのお話です。

今日は、実際に自分がこうやっていますよという方法を晒すのですが(笑)、ほかの方がどう使っているかもけっこう気になっているので、ぜひハッシュタグ#分析コンペLTで、私こうやって使ってますよとコメントをいただけると、すごくうれしいです。

ではまず、ColaboratoryとVSCodeを簡単に紹介します。知ってる方も多いと思うのですが、Colaboratoryは、ブラウザからPython等の処理を記述・実行できるサービスです。今月Pro+プランが出てきたので(※取材当時)、これでユーザーさんがけっこう増えるんじゃないかなと思っています。

VSCodeの説明ですが、これはMicrosoftが開発してるコードエディタです。使ったことがある方もたぶん多いと思うのですが、拡張機能がけっこう豊富です。今回は、「Remote - SSH」という拡張機能を使って環境を構築していきます。

最終的に実現する環境

まず、最終的にどういう環境になるか、イメージを共有したいと思います。これは、Google DriveとVScodeのエクスプローラーの画像ですが、Google Drive上の中身が、VSCodeから直接参照できるようになります。こうすることで、VSCode上でファイルを開いたり、編集したり、アップロードしたりができます。もちろん、VSCodeの中でnotebookのファイルもいじれます。

VSCodeの拡張機能も、お好きなものをインストールして使えます。例えば、Tabnineだったり、Docstring Generatorだったり。flake8をインストールすれば、Linterでのコードチェックも、この画像のようにできます。

ターミナルも、ある程度自分好みに設定できます。この下の画像、このzshの読み方、僕気になっているのですが、みなさんどう呼んでますかね?(笑)。僕は、ゼットシェルと呼んでいて、これをインストールした画像です。

さらに、GitHubでコード管理もできるので、ローカルで開発しているのとある程度同じ体験を、Colabのコンピュータリソースを用いて実現できるようになります。

環境の構築手順

では、環境構築手順に入っていきます。今日はちょっと、時間の関係もあるので、ここではざっくり紹介します。このあとのスライドのサンプルコードは、ブログにまとめたので、興味ある方はそちら覗いてみてください。

環境構築手順は、主に3つです。まず最初に、このngrok、読み方がちょっと分からないですが、こちらでアカウントを作成して認証キーを取得します。

このサービスが何をやってくれるのかというと、ローカルIPアドレスしか持たないホストに、外部のネットワークからアクセスできるようにしてくれるサービスです。

次に、Colab上でGPUに接続して、さらにGoogle Driveにも接続して、SSHサーバーの設定や起動を行うnotebookを実行します。これのイメージは、サーバー起動用のnotebookみたいなもの1つ用意しておいて、これの「すべてのセルを実行する」みたいなイメージです。

次に、VSCodeをローカルで立ち上げて、 Remote - SSHという拡張機能をインストールします。これは、初回だけで大丈夫です。

あとは、先ほどのサーバー起動用のnotebookで取得したホストとPort番号を、ローカルの.ssh/configに記述します。VSCodeの、先ほどインストールしたRemote - SSHの3番ですね、Connect to Hostボタンを押します。パスワードが聞かれるので、notebookから取得したパスワードを入れて、Colabのサーバーに接続します。そうすると、ColabのリソースがVSCodeから使えます。

運用時のポイント

僕が運用時に気にしてるポイントを今回4つ紹介します。

まず1つ目が、シンボリックリンクを作成するということです。Colab上であらかじめシンボリックリンク作成しておくと、VSCodeから接続した時に、Google Driveの中身が見えるようになるので、とても便利になります。

次に、zshなど使用したいものはColab上であらかじめインストールしておくと、とても使いやすいです。ふだん、zsh使っている人は、ローカルで使ってる設定ファイルなども一緒にコピーしておくと、ローカルとまったく同じターミナルの設定がVSCodeで使えるので、これもおすすめです。

3つ目が、setup.shスクリプトを作るということです。どういうものかというと、VSCodeの拡張機能や、pipでインストールしたいライブラリですね。Colabにあらかじめプリインストールされていないものをスクリプトにまとめておきます。そうすることで、VSCodeからSSH接続したあとに、このスクリプトを1個叩くと、VSCodeの拡張機能と使いたいPythonのライブラリが一括でインストールされるので、ある程度毎回同じ環境が作れるようになります。

このへんのサンプルコードも、ブログに書いてあります。

最後、4つ目です。Chromeの拡張機能でブラウザを自動更新するということで、Colab Proだと、確か24時間で切れるので、それはしょうがないのですが、ブラウザをちょっと放っておくと、セッションが切れてしまうと思います。

Chromeの拡張機能で、タブを自動で更新してくれるものがあるので、それをうまく使うことで、セッションを切れずに使うことができます。ずっとVSCodeでガチャガチャやっているだけでいいですというかたちになります。

kaggleで使う場合のTips

最後に、kaggleで使う場合のTipsも紹介できればと思います。モデルは手元で学習させて、kaggle上では、その推論処理だけを行うという想定のコードコンペを例に、ちょっと紹介します。

Colab上で動かすスクリプトを書くのですが、その中に、そのスクリプトの本体と学習済みのモデルをkaggleのDatasetsにアップロードする処理を仕込んでおきます。

実際にコンペにsubmitしたい時は、この画像の1番右の例ですね、kaggleのnotebook上から、そのスクリプトを実行するだけで、submissionファイルが吐かれて、そこからsubmitできます。

こうしておくと、推論専用のnotebookをイチからゴニョゴニョ作らなくてよくなるし、推論もGitHub上で管理できるので、とても便利かなと思っています。

kaggleにアップロードする処理は、こんなイメージです。

あと1点、kaggleのnotebook上で推論処理をしたい場合、こんな感じでスクリプトの中で条件分岐をさせておくと、今回で言うとColab上では学習と推論の両方の処理を行ってくれて、実際kaggleのnotebook上で動かす時は、推論処理だけをすることができます。

最後に、ちょっとイマイチな点も最後に紹介しておきます。例えば、1度セッションが切れると、先ほどのサーバー接続用のnotebookをまた実行して、ホストとPort番号を再発行して、configファイルも更新して、VSCodeからもう1回接続しなければいけません。それが、ちょっとデメリットかなと思います。また、ターミナルが若干モッサリしてるので、ちょっとそこで「ぐぬぬ……」みたいな感じになることがあります。

とはいえ、許容できる範囲かなという感覚です。

ということで、今日はColabとVSCodeをうまく使うことで、ローカルで開発しているのと遜色ない開発体験がGPU環境で使えるようになりますよというお話をしました。

冒頭でも言いましたが、みなさんのColab Tipsもぜひ教えてもらえるとありがたいです。この発表が「Colabをうまく使いこなせないなぁ」と思っていた人の一助になっていればうれしいと思います。

参考資料は、以下のとおりです。ありがとうございました。

司会者:ありがとうございます。Twitterが「便利だ」と、盛り上がっていました。

野澤:本当ですか。

司会者:はい。たかぱいさんの使い方としては、VSCodeだと、スクリプトで動かすという感じなんですか?

野澤:そうですね。基本的に、スクリプトを書いているのですが、EDA(探索的データ解析)とかをする時は、notebookをVSCode上で開いて、ガチャガチャ編集しつつ、ある程度までいったらPythonのスクリプトの形式に移してやっていますね。

司会者:いいところというとどんなところなんですか? やはり、スクリプトにまとめられるとかですか?

野澤:そうですね。スクリプトにまとめておくと、コードのバージョン管理もしやすいです。あとnotebookだと、やはり実行順でいろいろとわけが分からなくなることもあると思うので。

司会者:確かに。ありますね。

野澤:そうですよね(笑)。ある程度スクリプトにまとめておいて、今回だと推論のコードもスクリプトにしちゃうことで、kaggleのコンペにsubmitする時も、わりと簡単にというか、この画像の例だと、kaggle上でnotebook起動して、!python3でスクリプト名みたいな、Datasetsにアップロードしたスクリプト名を入れるだけで、推論処理が回ってくれるので、けっこう便利です。

例えば、いろいろアンサンブルしたい時も、例えば、ここにはexp001.pyはありますが、002.pyと003.pyを用意しておいて、それぞれ実行しておくと、それぞれでsubmissionのCSVが吐かれるので、それを見込んでsubmitするのが、楽になるかなと思ています。

司会者:なるほど。そこまでやれると、本当にメッチャクチャ便利ですね。今質問で「Colabの利用規約とか、セキュリティ面とかで懸念事項はありますでしょうか?」と来ています。

野澤:Colabの利用規約や、よくある質問系も読んだのですが、正直わからないというのはあります(笑)。

司会者:(笑)。そんなガッチガチ書いてないですもんね、Colab(笑)。

野澤:そうですね。なので、急に使えなくなることは、普通にありえると思います。

司会者:そうですよね。最初にもお断りがあったので、今はこんな感じで使えますという紹介ということで。

野澤:そうですね。

司会者:使用時には自己責任みたいな感じでやってもらえれば。

野澤:そうですね、申し訳ないのですが。

司会者:これはすぐにやってみようかなと思いました。ありがとうございました。

野澤:ありがとうございました。