GCPとDockerで機械学習用の環境を構築

機械学習を行う際にローカルのマシンだけだとモデルの学習をする際に時間が掛かるので、Google Cloud Platform (GCP)でデータサイエンス用の環境を構築しました。

AWSではなくてGCPにしたのは登録の際に$300のクレジットが貰えたからです。AWSも無料利用枠があるみたいですが、使えるCPUが決まってたりするみたいなので、特に制限がなさそうなGCPの方でとりあえずやってみることにしました。

GCPはAWSに比べて情報が少なかったので試行錯誤しましたが、Dockerも使うことで一応環境ができたので、やったことをまとめておきます。

「GCPでデータサイエンス用に環境を作りたくて、あまり面倒な設定はしたくないけど、それでもちょっとだけ設定したいことがある」という人はこの通りにやってみてもいいかもしれません。ディープラーニング用の環境も恐らく似た流れで作ることができると思いますが、今回はあくまでGPUを使わないマシンラーニング用の環境です。

尚、今回できた環境は無料で使えるGoogle Colabに比べると今のところ遅いことも多いみたいで、期待してた「明らかにGCPの方が速い!」という結果には今のところなっていません(スペックは色々と変えて試しました)。今回の設定の仕方は最適ではないはずなので、しばらくはColabとGCPを両方使って最適な方法を探っていきます。

1. GCPのJupyterLabノートブックインスタンスを使用

GCPでは様々な用途のマシンを利用できますが、データサイエンス・機械学習用途であればAI PlatformのJupyterLabノートブックインスタンスを利用するのがよさそうです。

AI Platform Notebooks  |  Google Cloud

JupyterLabは今まで使ったことがなかったのですが、Jupyter Notebookの進化版なのでJupyter Notebookを使ったことがあればすぐに慣れると思います。

GCPのこのノートブックインスタンスの何がいいかというと、インスタンスを作成したら「インスタンスを起動→Jupyter Labを開く→Jupyter Notebookを開く」という3ステップ(4クリック)ですぐにJupyter Notebookを開いて分析を始めることができるというところです。

Image

Image

Image

データサイエンスに特化したインスタンスでなければポートの設定やパッケージの設定などを細かくする必要がありますが、これの場合複雑な設定をしなくてもいいですし、やらないといけない設定はDockerを使って別途行うことができます。

逆に全部細かく指定したい場合は特殊なインスタンスを使用せずに一から全て設定した方がいいかもしれませんが、とりあえず楽な方法でやります。

2. Dockerの設定

GCPのノートブックインスタンスはpandasなどのデータサイエンスで使うパッケージは一通りインストールされているはずですが、その他の設定もしてくれるようにDockerfileを書きました。

Dockerfileの内容

GCPのAI Platform Notebookをカスタムのコンテナで作成する際の手順などは以下のページに書いてあります。

Create a new notebook instance using a custom container

このページの最初の段落で、ベースとなるイメージはGoogleが提供しているDeep Learning Containersから選択することが推奨されています。

この中から自分のニーズに合ったイメージを選びます。今回は無難なBaseのCPUイメージを選択しました1

Dockerfileでは使用するイメージのURLを貼り付けて、その他設定しておきたいことを書いておきます。

Dockerfile

# 使用するイメージを指定
FROM gcr.io/deeplearning-platform-release/base-cpu
# アップデート
RUN apt-get update && apt-get install -y
# Gitで使用している名前とメアドを入力
RUN git config --global user.name "FirstName LastName" && \
    git config --global user.email email@example.com

まだあまり凝った設定はしていませんが、Jupyter Notebookのバージョン管理のためにGitを使うので、とりあえずGitの初期設定をしました。

Dockerのコンテナをビルドしてアップロード

GCPのインスタンスでDockerfileに書いた内容を反映させるために、以下のようなことをやります。

  1. Dockerのコンテナをビルド

  2. ビルドしたコンテナをGCPのContainer Registryにアップロード

  3. ノートブックインスタンスを作成する際にアップしたコンテナを使用

まず、Dockerのホスト(ローカルのマシン)でDockerfileが入っているディレクトリに移動して、そこでビルドします。そしてdocker runでちゃんと動くことを確認します。

# cdでDockerfileのディレクトリに移動
# ビルド(notebook-envは好きな名前に変更可能)
docker build -t notebook-env .
# コンテナ内をアクセス
docker run -it notebook-env bash
# ここででgit config -lを実行して、ユーザー名とメアドが設定されていることを確認

そして、そのイメージの名前をGCP上でのコンテナの名前に変更して、GCPにプッシュします。

# プロジェクト名はGoogle Cloud PlatformのURLに含まれている
docker tag notebook-env gcr.io/(プロジェクト名)/notebook-env
docker push gcr.io/(プロジェクト名)/notebook-env

これで、GCPのContainer Registryにコンテナが保存されます。

Container RegistryというのはDockerのコンテナを置いておける場所で、新しいインスタンスを作成する際に、ここに保存したイメージを使用することができます。無料ではないので注意。

Container Registry  |  Google Cloud

Container Registry Pricing  |  Google Cloud

3. GCPでノートブックインスタンスをカスタムイメージで作成

サイドバーの下の方にあるAI Platformからノートブックを選択します。

新しいインスタンス → Customize Instance

インスタンス名を入力して、リージョンを設定します。

環境はCustom Containerを選択して、アップロードしたコンテナを指定します(gcr.io/(プロジェクト名)/notebook-env など)。

GPU、ディスク、CPU・メモリの設定などもここでできます。

作成されたらインスタンスが起動されて「JUPYTERLABを開く」と表示されるまで待ちます。

「JUPYTERLABを開く」をクリックすると、Jupyter Labの画面が表示されます。

image

最後に、Gitの設定ができていることを再び確認しましょう。Terminalボタンを押して、以下のコマンドを入力すると、Dockerfileで設定した名前とアドレスになっているはずです。

git config -l

もしJupyter LabのTerminalが何らかの理由で使えない場合はJupyter Notebookを作成して(Python 3をクリック)、セルに「!」を入力してからコマンドを入力すると、アウトプットがセルの下に表示されるはずです。

! git config -l

4. 機械学習を行う

Jupyter Notebookを開いて、好きなことをやりましょう。

データはJupyterLabに直接アップしたり、GitHubにアップしてそこから読み込むこともできますが、個人的にはデータはJupyterLabにアップして、.ipynbファイルはGitで管理してリポジトリに定期的にプッシュするのがいいと感じています。

Jupyter LabにしてもGoogle Colabにしても、クラウド上で環境を構築しておくと、パソコンのCPUへの負荷が軽減できるのでいいです。

今回GCPで色々なインスタンスを作ってみましたが、最初に書いた通り、Google Colabに比べて全てのタスクで明らかに速いわけではなかったので2、両方使ってみて比較していきたいと思います。

5. 使い終わったら停止する

実行している時間が長ければ長いほどお金が掛かるので、使っていない時は停止することを忘れずに!

image

参考

コマンドラインから

コマンドラインからこのインスタンスをアクセスしたければ、

  1. インスタンスを起動
  2. サイドバーからCompute Engine→VMインスタンスと開く
  3. 起動されたインスタンスの接続欄に「SSH」というボタンがあるはずですが、その横の▼をクリックして、「gcloud コマンドを表示」をクリック
  4. パソコンにCloud SDKをインストール
  5. 3でコピーしたコマンドをローカルのマシンで入力

こうすれば、新しいターミナルのウィンドウが起動します。

Quickstarts  |  Cloud SDK Documentation  |  Google Cloud

何度かFirefoxで開いたJupyter Labのターミナルでテキストが表示されないという問題がありましたが、Chromeで試したら問題なかったので、ターミナル関連の問題があればこのgcloudツールを使ったり、違うブラウザで試したりするといいと思います。

割り当ての変更

GPUを使いたい場合は、Google Cloudのコンソールから「IAMと管理」→「割り当て」から「表をフィルタリング」で「ロケーション:グローバル、上限名:GPUs」と選択する。

Compute Engine APIのGPUs (All Regions)の割り当てを編集して、フォームを記入したら上限が増えたというメールが届きました。

Dockerの勉強

Dockerは今まであまり触ったことがなかったので、Udemyで丁度公開されたばかりだった米国AI開発者がゼロから教えるDocker講座を買って勉強しました。

この講座のSection 11ではAWS+Dockerで環境を構築するのですが、僕はGCPを使いたかったので、とりあえずSection 10まで一気に受講しました。なので応用編はまだほとんど見ていないのですが、Dockerの基礎を理解するためはおすすめできる講座です。

ちなみに、Video Speed Controllerというアドオンを入れると動画の速度を0.1倍単位で調整できるのでおすすめです。

Firefox版 Chrome版

その他参考

Creating a derivative container  |  Deep Learning Containers

GCPとJupyterLabでKaggle用環境構築 - Qiita

GCP+DockerでKaggle用GPU環境構築 - Qiita

GCPとDockerでKaggle用計算環境構築 - Qiita

GCPとdockerによるkaggle環境の構築手順 - 思考の本棚

【Google Cloud Platform】初めてやるクラウドでの機械学習① - Qiita

Dockerize your Machine Learning model to train it on GCP!

Machine types | Compute Engine Documentation | Google Cloud

Preemptible Virtual Machines | Google Cloud

1

Tensorflowとかを使っているわけではなくて、GPUにそもそも対応していないはずのScikit learnを使っているだけなので。 https://scikit-learn.org/stable/faq.html

2

GCPにノートブックインスタンスで選択できる環境・マシンタイプは一通り試してみましたが、同じScikit learnを使った簡単な機械学習のタスクでもColabに比べて遅いことも速いこともあったので、色々試してみるといいと思います。でも少なくともGPUを使わないのであれば、Colabは思っていた以上に優秀なのかもしれません。