ノートブックから Kubeflow Pipelines への HP 調整: データ サイエンスへの取り組み

1. はじめに

Kubeflow は、Kubernetes の機械学習ツールキットです。Kubeflow は、Kubernetes 上での機械学習(ML)ワークフローの Deployment をシンプル、ポータブル、そしてスケーラブルなものにすることに特化したプロジェクトです。その目標は、クラス最高のオープンソース ML 用システムをさまざまなインフラストラクチャに簡単にデプロイできるようにすることです。

Kubeflow のデプロイはどのような形で行われますか?

Kubeflow の Deployment のメリットは以下のとおりです。

  • ポータブル - Google Cloud Platform(GCP)、オンプレミス、プロバイダ間など稼働場所に関係なく、あらゆる Kubernetes クラスタで動作します。
  • スケーラブル - リソースの変動に対応可能であり、Kubernetes クラスタに割り当てられたリソース数によってのみ制限されます。
  • 構成可能 - 厳選された ML フレームワークとライブラリのセットから選択して、独立したステップを完全な ML ワークフローに構成できます。

Kubeflow を使用すると、疎結合のマイクロサービスを 1 つの単位にまとめて、ノートパソコン、オンプレミス、クラウドなど、さまざまな場所にデプロイできます。

このコードラボでは、MiniKF を使用して独自の Kubeflow Deployment を作成し、ハイパーパラメータ チューニングで Kubeflow Pipelines ワークフローを実行してモデルをトレーニングして提供する方法について説明します。これらはすべて Jupyter ノートブック内から行います。

作成するアプリの概要

この Codelab では、CLI コマンドや SDK を使用せずに、Kubeflow Pipelines でハイパーパラメータ チューニングを行う複雑なデータ サイエンス パイプラインを構築します。Kubernetes や Docker に関する知識は必要ありません。完了するとインフラストラクチャには以下が含まれるようになります。

  • 自動的にインストールされる MiniKF(Mini Kubeflow)VM:
  • Kubernetes(Minikube を使用)
  • Kubeflow
  • 汎用 Jupyter Notebook を Kubeflow Pipelines ワークフローに変換するツールである KaleGitHub
  • データのバージョン管理と再現性のための Arrikto Rok

学習内容

  • MiniKF を使用して Kubeflow をインストールする方法
  • CLI コマンドや SDK を使用せずに Jupyter Notebook を Kubeflow Pipelines に変換する方法
  • ボタンをクリックするだけで、ノートブック内からハイパーパラメータ チューニングを使用して Kubeflow Pipelines を実行する方法
  • ノートブックとすべてのパイプライン ステップでデータを自動的にバージョン管理する方法

必要なもの

これは、Kubeflow に焦点を当てた上級者向けの Codelab です。背景とプラットフォームの概要については、Kubeflow の概要のドキュメントをご覧ください。関連のない概念とコードブロックについては軽く触れるにとどめ、そのままコピーして貼り付けられるようにしています。

2. 環境を設定する

GCP プロジェクトの設定

GCP プロジェクトを作成するか、既存の GCP プロジェクトを構成する手順は次のとおりです。既存の GCP プロジェクトを使用する場合は、プロジェクトが以下の最小要件を満たしていることを確認してください。最初の手順は、GCP Console でリソース マネージャーを開くことです。

新しいプロジェクトを作成するか、既存のプロジェクトを選択します。

99b103929d928576.png

次の最小要件を確認します。

  • プロジェクトのオーナーロールがあることを確認します。
  • プロジェクトに対して課金が有効になっていることを確認します。
  • GCP の無料枠または 12 か月間のトライアル期間($300 のクレジット付き)を使用している場合、無料枠では十分なリソースが提供されないため、MiniKF のデフォルトの GCP インストールを実行できません。有料アカウントにアップグレードする必要があります。

GCP プロジェクトの設定の詳細については、GCP のドキュメントをご覧ください。

GCP プロジェクトを設定したら、MiniKF のインストール手順に直接進みます。

事前割り当て済みの GCP プロジェクトを開く

事前に割り当てられた GCP プロジェクトを開くには、下のボタンをクリックして GCP Console にアクセスし、左上のハンバーガー メニューにある [ホーム] パネルを開きます。画面が空の場合は、プロンプトで [はい] をクリックしてダッシュボードを作成します。

3fdc4329995406a0.png

プロジェクトがまだ選択されていない場合は、[プロジェクトを選択] をクリックします。

e8952c0b96067dea.png

プロジェクトを選択します。1 つだけにする必要があります。

fe25c1925487142.png

3. MiniKF をインストールする

MiniKF を含むコンピューティング インスタンスを作成する

GCP Marketplace で「MiniKF」を検索します。

Arrikto の MiniKF 仮想マシンを選択します。

d6b423c1911ea85a.png

[起動] ボタンをクリックして、プロジェクトを選択します。

7d07439db939b61c.png

[Configure & Deploy] ウィンドウで、MiniKF インスタンスの名前ゾーンを選択し、デフォルトのオプションのままにします。[デプロイ] ボタンをクリックします。

7d5f7d17a80a1930.png

MiniKF コンピューティング インスタンスが起動するまで待ちます。

5228086caadc44c6.png

MiniKF にログインする

MiniKF VM が起動したら、[SSH] ボタンをクリックして接続し、ログインします。画面上の手順に沿って minikf コマンドを実行します。これにより、Minikube、Kubeflow、Rok のデプロイが開始されます。完了するまでに数分かかります。

774e83c3e96cf7b3.png

Kubeflow にログインする

インストールが完了し、すべての Pod の準備が整ったら、MiniKF ダッシュボードにアクセスします。MiniKF のユーザー名とパスワードを使用して Kubeflow にログインします。

251b0bcdbf6d3c71.png

9d49d899bb0b5bd1.png

Chrome ユーザーには次の画面が表示されます。

6258e0f09e46a6c2.png

Firefox ユーザーには次の画面が表示されます。

8cff90ce2f0670bd.png

Safari をご利用の場合は、次の画面が表示されます。

1c6fd768d71c0a92.png

Rok にログインする

Kubeflow にログインしたら、ハンバーガー アイコンをクリックして左側のメニューを開きます。[スナップショット] をクリックし、MiniKF のユーザー名とパスワードを使用して Rok にログインします。

16171f35a935a9af.png

80aad6ba5d298a7e.png

おめでとうございます!GCP に MiniKF が正常にデプロイされました。これで、ノートブックを作成し、ML コードを記述し、Kubeflow Pipelines を実行し、Rok を使用してデータのバージョン管理と再現性を実現できます。

4. ノートブック内からパイプラインを実行する

このセクションでは、Udacity AI Nanodegree のプロジェクトである犬種の識別例を実行します。犬の画像が与えられると、最終モデルは犬の品種の推定値を提供します。

Kubeflow クラスタにノートブック サーバーを作成する

Kubeflow の中央のダッシュボードで [Notebooks] リンクに移動します。

60825e935fd0f39b.png

[新しいサーバー] をクリックします。

f9303c0a182e47f5.png

ノートブック サーバーの名前を指定します。

a2343f30bc9522ab.png

次の Docker イメージが選択されていることを確認します(イメージタグは異なる場合があります)。

gcr.io/arrikto/jupyter-kale:f20978e

サイズが 5 GB の新しい空のデータ ボリュームを追加し、「data」という名前を付けます。

8544d9b05826b316.png

[起動] をクリックして、ノートブック サーバーを作成します。

28c024bcc55cc70a.png

ノートブック サーバーが使用可能になったら、[接続] をクリックして接続します。

52f1f8234988ceaa.png

データとノートブックをダウンロードする

新しいタブが開き、JupyterLab のランディング ページが表示されます。JupyterLab で新しいターミナルを作成します。

ab9ac96f1a1f0d09.png

ターミナル ウィンドウで次のコマンドを実行して、data フォルダに移動し、ラボの残りの部分で使用するノートブックとデータをダウンロードします。

cd data/
git clone https://github.com/kubeflow-kale/kale

クローンされたリポジトリには、データとアノテーション付きノートブックを含む一連の厳選された例が含まれています。

サイドバーで、フォルダ data/kale/examples/dog-breed-classification/ に移動し、ノートブック dog-breed.ipynb を開きます。

2bc436465522f65b.png

犬種の識別例の ML コードを確認する

ここでは、ダウンロードしたデータセットを使用するのではなく、クローンを作成したリポジトリに含まれている小さなデータセットを使用するため、データセットをダウンロードするセルは実行しないでください。この例を自宅で自分のペースで実行する場合は、データセットをダウンロードしてください。

imports セルを実行して、必要なライブラリをすべてインポートします。ライブラリが欠落しているため、コードは失敗します。

5e2b97ab2512f139.png

通常、このノートブックを Kubeflow パイプラインとして実行し、新しくインストールされたライブラリを含めるには、新しい Docker イメージを作成する必要があります。幸いなことに、Rok と Kale は、開発中にインストールしたライブラリがパイプラインに確実に組み込まれるようにします。これは、Rok のスナップショット技術と、Kale がスナップショット ボリュームをパイプライン ステップにマウントするためです。

次のセルを実行して、不足しているライブラリをインストールします。

c483da77943a6f01.png

[再起動] アイコンをクリックして、ノートブック カーネルを再起動します。

376b5203209c2c91.png

正しいライブラリをインストールして imports セルを再度実行し、成功することを確認します。

Kubeflow Pipelines でノートブックをパイプラインに変換する

ノートブックの左側のペインにある Kubeflow アイコンをクリックして、Kale を有効にします。

7b96241f2ab6c389.png

[Kale Deployment Panel] のスライダーをクリックして、Kale を有効にします。

804cfbf9d76b7e23.png

ノートブック内のセルごとの依存関係を確認します。複数のノートブック セルが 1 つのパイプライン ステップの一部になる様子(セルの左側のカラーバーで示されています)と、パイプライン ステップが前のステップに依存する様子(セルの上の「depends on」ラベルで示されています)を確認します。たとえば、下の画像は、同じパイプライン ステップの一部である複数のセルを示しています。同じ赤色で、前のパイプライン ステップに依存しています。

fcd0fb351cdfb359.png

[コンパイルして実行] ボタンをクリックします。

18f2f6f0e12393d5.png

Kale が引き継ぎ、ノートブックを Kubeflow Pipelines パイプラインに変換してビルドします。また、Kale は Rok と統合して現在のノートブックのデータ ボリュームのスナップショットを作成するため、スナップショットの進行状況を確認できます。Rok は、データ バージョニングと、[コンパイルして実行] ボタンをクリックしたときの環境全体の再現を処理します。これにより、データとコードのタイムマシンが作成され、新しい Docker イメージをビルドすることなく、コードを開発したのと同じ環境でパイプラインが実行されます。

de1b88af76df1a9a.png

パイプラインがコンパイルされ、Kubeflow Pipelines にアップロードされました。リンクをクリックして Kubeflow Pipelines UI に移動し、実行を表示します。

e0b467e2e7034b5d.png

Kubeflow Pipelines UI が新しいタブで開きます。実行が完了するまで待ちます。

21a9d54a57f3e20c.png

39e6fa39516d2773.png

おめでとうございます!これで、ノートブックから Kubeflow Pipelines でエンドツーエンドのパイプラインを実行できました。

5. ハイパーパラメータ チューニングによる転移学習

結果を調べる

cnn-from-scratch ステップのログを確認します。(Kubeflow Pipelines UI のグラフでステップをクリックし、[ログ] タブをクリックします)。このステップでは、畳み込みニューラル ネットワーク(CNN)をゼロからトレーニングしました。トレーニング済みモデルの精度が非常に低く、このステップの完了に時間がかかったことに注目してください。

62bf0835e9896c67.png

cnn-vgg16 ステップのログを確認します。このステップでは、事前トレーニング済みの VGG-16 モデル(Visual Geometry Group(VGG)によってトレーニングされたニューラル ネットワーク)で転移学習を使用しました。精度は以前のモデルよりもはるかに高くなっていますが、まだ改善の余地があります。

2b45072da65e20ae.png

次に、cnn-resnet50 ステップのログを見てみましょう。このステップでは、事前トレーニング済みの ResNet-50 モデルで転移学習を使用しました。精度が大幅に向上します。したがって、このモデルをこの Codelab の残りの部分で使用します。

a1dc84ea48a87820.png

ハイパーパラメータ チューニング

Kubeflow UI のノートブック サーバーに戻り、dog-breed-katib.ipynb という名前のノートブック(パス data/kale/examples/dog-breed-classification/)を開きます。このノートブックでは、Katib を使用して ResNet-50 モデルでハイパーパラメータ チューニング実験を実行します。ノートブックの先頭にパラメータを宣言するセルが 1 つあります。

87b9f6c98dc1823e.png

ノートブックの左側のペインで、[HP Tuning with Katib] を有効にして、ハイパーパラメータ チューニングを実行します。

a518eba74d341139.png

[Katib ジョブを設定] をクリックして、Katib を構成します。

f4e34fff6a93aa60.png

各パラメータの検索スペースを定義し、目標を定義します。

cfc6b7bcdc685a02.png

[Compile and Run Katib Job] ボタンをクリックします。

f9c1ab0a6a3c5e8d.png

Katib テストの進行状況を確認します。

f3514011876564db.png

[表示] をクリックして、Katib テストを表示します。

ab2f5a5edd48e8dc.png

[完了] をクリックして、Kubeflow Pipelines(KFP)で実行を確認します。

410a843b6f044a4b.png

Katib のテストページに新しいトライアルが表示されます。

a511dca519580133.png

KFP UI には、新しい実行が表示されます。

43dd34ee2b75018d.png

ここで何が起きたのかを詳しく見てみましょう。以前は、Kale はノートブックからパイプライン実行を生成していましたが、現在は複数のパイプライン実行を作成しています。各パイプライン実行には、異なる引数の組み合わせが渡されます。

Katib は、汎用のハイパーパラメータ チューニング ジョブを実行する Kubeflow のコンポーネントです。Katib は、実際に実行しているジョブ(Katib の専門用語ではトライアル)について何も知りません。Kale が気にするのは、検索空間、最適化アルゴリズム、目標だけです。Katib は、単純なジョブ(Pod)をトライアルとして実行することをサポートしていますが、Kale は、トライアルで Kubeflow Pipelines のパイプラインを実際に実行し、パイプライン実行から指標を収集するためのシムを実装しています。

Katib テストでトライアルが生成されると、Katib UI にトライアルが表示されます。

3e854d3d4bb766c.png

KFP UI での実行の詳細:

ffd30dcefa739962.png

Katib テストが完了したら、Katib UI ですべてのトライアルを表示できます。

9096ae9caa77e42a.png

KFP UI のすべての実行:

7acc64dfee4f35a3.png

ノートブックに戻ると、Kale パネル内の Katib テストの横に情報ボタンが表示されます。

95b092180d71dc80.png

クリックすると、最適な結果と、その結果を生成したパラメータが表示されます。

3b0ce47e548e5afb.png

6. クリーンアップ

MiniKF VM を破棄する

GCP Console で [Deployment Manager] に移動し、minikf-on-gcp デプロイを削除します。

7. 完了

これで、Kubeflow(MiniKF)、Kale、Rok を使用してエンドツーエンドのデータ サイエンス ワークフローを正常に実行できました。

次のステップ

Kubeflow コミュニティに参加する:

参考資料