1. はじめに
Kubeflow は Kubernetes の 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 を実行する方法
- ノートブックとすべてのパイプライン ステップでデータを自動的にバージョニングする方法
必要なもの
- 自分がオーナー権限を持つアクティブな GCP プロジェクト
これは、Kubeflow に重点を置いた高度な Codelab です。その他の背景とプラットフォームの概要については、Kubeflow の概要のドキュメントをご覧ください。関連のない概念とコードブロックについては軽く触れるにとどめ、そのままコピーして貼り付けられるようにしています。
2. 環境を設定する
GCP プロジェクトの設定
以下の手順に沿って、GCP プロジェクトを作成するか、既存の GCP プロジェクトを設定します。既存の GCP プロジェクトを使用する場合は、そのプロジェクトが下記の最小要件を満たしていることを確認してください。まず、GCP コンソールでリソース マネージャーを開きます。
新しいプロジェクトを作成するか、既存のプロジェクトを選択します。
次の最小要件を確認してください。
- プロジェクトのオーナーのロールがあることを確認します。
- プロジェクトに対して課金が有効になっていることを確認します。
- GCP の無料枠または $300 相当のクレジット付きの 12 か月の試用期間を使用している場合、無料枠では十分なリソースが提供されないため、デフォルトの GCP インストールの MiniKF は実行できません。有料アカウントにアップグレードする必要があります。
GCP プロジェクトの設定について詳しくは、GCP のドキュメントをご覧ください。
GCP プロジェクトを設定したら、MiniKF のインストール手順に直接移動します。
事前に割り当てられた GCP プロジェクトを開きます。
事前に割り当てられた GCP プロジェクトを開くには、下のボタンをクリックして GCP コンソールにアクセスし、左上のハンバーガー メニューからホームパネルを開きます。画面が空の場合は、プロンプトで [はい] をクリックしてダッシュボードを作成します。
プロジェクトが選択されていない場合は、[プロジェクトを選択] をクリックします。
プロジェクトを選択します。1 つのみ必要です。
3. MiniKF をインストールする
MiniKF を含むコンピューティング インスタンスを作成する
GCP Marketplace で「MiniKF」を検索します。
Arrikto の MiniKF 仮想マシンを選択します。
[LAUNCH] ボタンをクリックしてプロジェクトを選択します。
[Configure &Deploy ウィンドウで、MiniKF インスタンスの名前とゾーンを選択し、デフォルトのオプションはそのままにします。[Deploy] ボタンをクリックします。
MiniKF コンピューティング インスタンスが起動するまで待ちます。
MiniKF にログインします。
MiniKF VM が稼働したら、[SSH] ボタンをクリックして接続し、ログインします。画面上の手順に沿って minikf
コマンドを実行します。これにより、Minikube、Kubeflow、Rok のデプロイが開始されます。完了するまでに数分かかります。
Kubeflow にログインする
インストールが完了し、すべての Pod の準備ができたら、MiniKF ダッシュボードにアクセスします。MiniKF のユーザー名とパスワードを使用して Kubeflow にログインします。
Chrome ユーザーには、次の画面が表示されます。
Firefox ユーザーには、次の画面が表示されます。
Safari ユーザーには、この画面が表示されます。
Rok にログインする
Kubeflow にログインしたら、ハンバーガー アイコンをクリックして左側のメニューを開きます。[Snapshots] をクリックし、MiniKF のユーザー名とパスワードを使用して Rok にログインします。
これで、GCP に MiniKF が正常にデプロイされました。これで、ノートブックを作成して ML コードを記述し、Kubeflow Pipelines を実行し、データのバージョニングと再現性のために Rok を使用できるようになりました。
4. ノートブック内からパイプラインを実行する
このセクションでは、Udacity AI Nanodegree のプロジェクトである Dog Breed Identification のサンプルを実行します。犬の画像が与えられた場合、最終モデルは犬の品種を推定します。
Kubeflow クラスタにノートブック サーバーを作成する
Kubeflow の中央ダッシュボードで [Notebooks] リンクに移動します。
[New Server] をクリックします。
ノートブック サーバーの名前を指定します。
次の Docker イメージが選択されていることを確認します(イメージタグが異なる場合があります)。
gcr.io/arrikto/jupyter-kale:f20978e
サイズが 5 GB の新しい空のデータ ボリュームを追加し、data という名前を付けます。
[起動] をクリックしてノートブック サーバーを作成します。
ノートブック サーバーが利用可能になったら、[接続] をクリックして接続します。
データとノートブックをダウンロードする
新しいタブが開き、JupyterLab のランディング ページが表示されます。JupyterLab で新しいターミナルを作成します。
ターミナル ウィンドウで以下のコマンドを実行して data フォルダに移動し、ノートブックとこのラボの残りの部分で使用するデータをダウンロードします。
cd data/ git clone https://github.com/kubeflow-kale/kale
クローン リポジトリには、データとアノテーション付きのノートブックを含む、キュレートされた一連のサンプルが含まれています。
サイドバーで data/kale/examples/dog-breed-classification/
フォルダに移動し、ノートブック dog-breed.ipynb
を開きます。
犬種識別のサンプルの ML コードを確認する
当面は、データセットをダウンロードするセルは実行しないでください。先ほどクローンを作成したリポジトリに含まれる小さなデータセットを使用するためです。この例を自分のペースで自宅から実行する場合は、データセットをダウンロードしてかまいません。
imports
セルを実行して、必要なライブラリをすべてインポートします。ライブラリがないため、コードは失敗します。
通常は、このノートブックを Kubeflow パイプラインとして実行できるように新しい Docker イメージを作成し、新しくインストールされたライブラリを含める必要があります。幸いなことに、Rok と Kale は、Rok のスナップショット作成テクノロジーと Kale がそれらのスナップショットされたボリュームをパイプライン ステップにマウントしたおかげで、開発中にインストールしたライブラリがパイプラインに確実に到達できるようにしました。
次のセルを実行して、不足しているライブラリをインストールします。
再起動アイコンをクリックして、ノートブック カーネルを再起動します。
正しいライブラリがインストールされている状態で imports
セルを再度実行し、成功することを確認します。
Kubeflow Pipelines でノートブックをパイプラインに変換する
ノートブックの左側のペインにある Kubeflow アイコンをクリックして Kale を有効にします。
[Kale Deployment Panel] のスライダーをクリックして、Kale を有効化します。
ノートブック内のセルごとの依存関係を確認します。セルの左側にあるカラーバーで、複数のノートブック セルを 1 つのパイプライン ステップに含めることができ、パイプライン ステップが前のステップとどのように依存するかについては、セルの上にある [depends on] ラベルで示しています。たとえば、以下の画像は、同じパイプライン ステップの一部である複数のセルを示しています。これらは同じ赤色で、前のパイプライン ステップに依存しています。
[Compile and Run] ボタンをクリックします。
今では Kale が引き継ぎ、ノートブックを Kubeflow Pipelines パイプラインに変換してビルドします。また、Kale は Rok と統合して現在のノートブックのデータ ボリュームのスナップショットを作成するため、スナップショットの進捗状況を確認できます。Rok がデータのバージョニングと、[Compile and Run] ボタンをクリックしたときと同じように環境全体を再現します。この方法では、データとコード用のタイムマシンを確保し、コードを開発したのと同じ環境でパイプラインを実行できます。新しい Docker イメージを構築する必要はありません。
パイプラインがコンパイルされ、Kubeflow Pipelines にアップロードされました。そのリンクをクリックして Kubeflow Pipelines UI に移動し、実行結果を表示します。
Kubeflow Pipelines UI が新しいタブで開きます。実行が完了するまで待ちます。
これで、ノートブックから始めて、Kubeflow Pipelines でエンドツーエンドのパイプラインを実行しました。
5. ハイパーパラメータ調整を使用した転移学習
結果を調べる
cnn-from-scratch ステップのログを確認します。(Kubeflow Pipelines UI でグラフ内のステップをクリックし、[ログ] タブをクリックします)。このステップでは、畳み込みニューラル ネットワーク(CNN)をゼロからトレーニングしました。トレーニング済みモデルの精度が非常に低いことに加え、このステップの完了に時間がかかっています。
cnn-vgg16 ステップのログを確認します。このステップでは、事前トレーニング済みの VGG-16 モデル(Visual Geometry Group(VGG)によってトレーニングされたニューラル ネットワーク)で転移学習を使用しました。精度は前のモデルよりも大幅に向上していますが、まだ改善の余地があります。
次に、cnn-resnet50 ステップのログを見てみましょう。このステップでは、事前トレーニング済みの ResNet-50 モデルで転移学習を使用しました。精度ははるかに高くなりますしたがって、この Codelab の残りの部分ではこのモデルを使用します。
ハイパーパラメータ調整
Kubeflow UI のノートブック サーバーに戻り、dog-breed-katib.ipynb
という名前のノートブック(パス data/kale/examples/dog-breed-classification/
)を開きます。このノートブックでは、Katib を使用して ResNet-50 モデルでハイパーパラメータ調整テストをいくつか実行します。ノートブックの先頭に、パラメータを宣言するためのセルが 1 つあることに注目してください。
ノートブックの左側のペインで、[Katib を使用した HP 調整] を有効にしてハイパーパラメータ チューニングを実行します。
次に、[Set up Katib Job] をクリックして Katib を構成します。
各パラメータの検索スペースを定義し、目標を定義します。
[Compile and Run Katib Job] ボタンをクリックします。
Katib テストの進捗状況をご覧ください。
[表示] をクリックして、Katib のテストを表示します。
[完了] をクリックして、Kubeflow Pipelines(KFP)での実行を確認します。
Katib のテストページに、新しいトライアルが表示されます。
KFP UI には新しい実行が表示されます。
では、何が起こったのかを見てみましょう。これまで Kale はノートブックからパイプライン実行を生成していましたが、現在は複数のパイプライン実行を作成しています。パイプライン実行では、それぞれが異なる引数の組み合わせでフィードされています。
Katib は、汎用のハイパーパラメータ チューニング ジョブを実行する Kubeflow のコンポーネントです。Katib は、実際に実行されているジョブ(Katib の専門用語ではトライアルと呼ばれています)については何も知りません。ケイルが関心を持っているのは、検索スペース、最適化アルゴリズム、目標だけです。Katib はシンプルなジョブ(Pod)をトライアルとして実行することをサポートしていますが、Kale は shim を実装して、トライアルが Kubeflow Pipelines で実際にパイプラインを実行し、パイプラインの実行から指標を収集するようにしています。
Katib のテストではトライアルが生成されているため、Katib UI にはトライアルもより多く表示されます。
KFP UI でのその他の実行:
Katib のテストが完了したら、Katib UI にすべてのトライアルが表示されます。
KFP UI でのすべての実行:
ノートブックに戻ると、Kale パネル内の Katib テストのすぐ隣に情報ボタンが表示されます。
これをクリックすると、最良の結果と、その結果を生成したパラメータが表示されます。
6. クリーンアップ
MiniKF VM を破棄する
GCP コンソールで [Deployment Manager] に移動し、minikf-on-gcp
Deployment を削除します。
7. 完了
これで、Kubeflow(MiniKF)、Kale、Rok を使用したエンドツーエンドのデータ サイエンス ワークフローが正常に実行されました。
次のステップ
Kubeflow コミュニティに参加する:
- github.com/kubeflow
- Kubeflow Slack
- kubeflow-discuss@googlegroups.com
- 毎週のコミュニティ コール、Slack、その他のコミュニティの詳細