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

1. はじめに

KubeflowKubernetes の ML ツールキットです。このプロジェクトは、Kubernetes での機械学習(ML)ワークフローのデプロイをシンプルかつポータブルかつスケーラブルにすることに特化したものです。目標は、ML 用の最善のオープンソース システムを多様なインフラストラクチャに簡単にデプロイできる方法を提供することです。

Kubeflow Deployment とは

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

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

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

この Codelab では、MiniKF を使用して独自の Kubeflow Deployment を作成し、ハイパーパラメータを調整した Kubeflow Pipelines ワークフローを実行して、モデルをトレーニングおよびサービングする手順について説明します。これらはすべて Jupyter ノートブック内から行います。

作成するアプリの概要

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

  • 以下を自動的にインストールする MiniKF(Mini Kubeflow)VM
  • Kubernetes(Minikube を使用)
  • Kubeflow
  • Kale: 汎用の Jupyter ノートブックを Kubeflow Pipelines ワークフローに変換するツール(GitHub
  • Arrikto Rok(データのバージョニングと再現性)

学習内容

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

必要なもの

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

2. 環境を設定する

GCP プロジェクトの設定

以下の手順に沿って、GCP プロジェクトを作成するか、既存の GCP プロジェクトを設定します。既存の GCP プロジェクトを使用する場合は、そのプロジェクトが下記の最小要件を満たしていることを確認してください。まず、GCP コンソールでリソース マネージャーを開きます。

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

99b103929d928576.png

次の最小要件を確認してください。

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

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

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

事前に割り当てられた GCP プロジェクトを開きます。

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

3fdc4329995406a0.png

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

e8952c0b96067dea.png

プロジェクトを選択します。1 つのみ必要です。

fe25c1925487142.png

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

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

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

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

d6b423c1911ea85a.png

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

7d07439db939b61c.png

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

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 にログインしたら、ハンバーガー アイコンをクリックして左側のメニューを開きます。[Snapshots] をクリックし、MiniKF のユーザー名とパスワードを使用して Rok にログインします。

16171f35a935a9af.png

80aad6ba5d298a7e.png

これで、GCP に MiniKF が正常にデプロイされました。これで、ノートブックを作成して ML コードを記述し、Kubeflow Pipelines を実行し、データのバージョニングと再現性のために Rok を使用できるようになりました。

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

このセクションでは、Udacity AI Nanodegree のプロジェクトである Dog Breed Identification のサンプルを実行します。犬の画像が与えられた場合、最終モデルは犬の品種を推定します。

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

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

60825e935fd0f39b.png

[New Server] をクリックします。

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

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

18f2f6f0e12393d5.png

今では Kale が引き継ぎ、ノートブックを Kubeflow Pipelines パイプラインに変換してビルドします。また、Kale は Rok と統合して現在のノートブックのデータ ボリュームのスナップショットを作成するため、スナップショットの進捗状況を確認できます。Rok がデータのバージョニングと、[Compile and Run] ボタンをクリックしたときと同じように環境全体を再現します。この方法では、データとコード用のタイムマシンを確保し、コードを開発したのと同じ環境でパイプラインを実行できます。新しい 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

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

a518eba74d341139.png

次に、[Set up Katib Job] をクリックして 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 の専門用語ではトライアルと呼ばれています)については何も知りません。ケイルが関心を持っているのは、検索スペース、最適化アルゴリズム、目標だけです。Katib はシンプルなジョブ(Pod)をトライアルとして実行することをサポートしていますが、Kale は shim を実装して、トライアルが 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 コンソールで [Deployment Manager] に移動し、minikf-on-gcp Deployment を削除します。

7. 完了

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

次のステップ

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

参考資料