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 ワークフローに変換するツールである Kale(GitHub)
- データのバージョン管理と再現性のための Arrikto Rok
学習内容
- MiniKF を使用して Kubeflow をインストールする方法
- CLI コマンドや SDK を使用せずに Jupyter Notebook を Kubeflow Pipelines に変換する方法
- ボタンをクリックするだけで、ノートブック内からハイパーパラメータ チューニングを使用して Kubeflow Pipelines を実行する方法
- ノートブックとすべてのパイプライン ステップでデータを自動的にバージョン管理する方法
必要なもの
- オーナー権限があるアクティブな GCP プロジェクト
これは、Kubeflow に焦点を当てた上級者向けの Codelab です。背景とプラットフォームの概要については、Kubeflow の概要のドキュメントをご覧ください。関連のない概念とコードブロックについては軽く触れるにとどめ、そのままコピーして貼り付けられるようにしています。
2. 環境を設定する
GCP プロジェクトの設定
GCP プロジェクトを作成するか、既存の GCP プロジェクトを構成する手順は次のとおりです。既存の GCP プロジェクトを使用する場合は、プロジェクトが以下の最小要件を満たしていることを確認してください。最初の手順は、GCP Console でリソース マネージャーを開くことです。
新しいプロジェクトを作成するか、既存のプロジェクトを選択します。

次の最小要件を確認します。
- プロジェクトのオーナーロールがあることを確認します。
- プロジェクトに対して課金が有効になっていることを確認します。
- GCP の無料枠または 12 か月間のトライアル期間($300 のクレジット付き)を使用している場合、無料枠では十分なリソースが提供されないため、MiniKF のデフォルトの GCP インストールを実行できません。有料アカウントにアップグレードする必要があります。
GCP プロジェクトの設定の詳細については、GCP のドキュメントをご覧ください。
GCP プロジェクトを設定したら、MiniKF のインストール手順に直接進みます。
事前割り当て済みの GCP プロジェクトを開く
事前に割り当てられた GCP プロジェクトを開くには、下のボタンをクリックして GCP Console にアクセスし、左上のハンバーガー メニューにある [ホーム] パネルを開きます。画面が空の場合は、プロンプトで [はい] をクリックしてダッシュボードを作成します。

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

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

3. MiniKF をインストールする
MiniKF を含むコンピューティング インスタンスを作成する
GCP Marketplace で「MiniKF」を検索します。
Arrikto の MiniKF 仮想マシンを選択します。

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

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

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

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

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


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

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

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

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


おめでとうございます!GCP に MiniKF が正常にデプロイされました。これで、ノートブックを作成し、ML コードを記述し、Kubeflow Pipelines を実行し、Rok を使用してデータのバージョン管理と再現性を実現できます。
4. ノートブック内からパイプラインを実行する
このセクションでは、Udacity AI Nanodegree のプロジェクトである犬種の識別例を実行します。犬の画像が与えられると、最終モデルは犬の品種の推定値を提供します。
Kubeflow クラスタにノートブック サーバーを作成する
Kubeflow の中央のダッシュボードで [Notebooks] リンクに移動します。

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

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

次の 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」ラベルで示されています)を確認します。たとえば、下の画像は、同じパイプライン ステップの一部である複数のセルを示しています。同じ赤色で、前のパイプライン ステップに依存しています。

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

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

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

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

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

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

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

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

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

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

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

ここで何が起きたのかを詳しく見てみましょう。以前は、Kale はノートブックからパイプライン実行を生成していましたが、現在は複数のパイプライン実行を作成しています。各パイプライン実行には、異なる引数の組み合わせが渡されます。
Katib は、汎用のハイパーパラメータ チューニング ジョブを実行する Kubeflow のコンポーネントです。Katib は、実際に実行しているジョブ(Katib の専門用語ではトライアル)について何も知りません。Kale が気にするのは、検索空間、最適化アルゴリズム、目標だけです。Katib は、単純なジョブ(Pod)をトライアルとして実行することをサポートしていますが、Kale は、トライアルで Kubeflow Pipelines のパイプラインを実際に実行し、パイプライン実行から指標を収集するためのシムを実装しています。
Katib テストでトライアルが生成されると、Katib UI にトライアルが表示されます。

KFP UI での実行の詳細:

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

KFP UI のすべての実行:

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

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

6. クリーンアップ
MiniKF VM を破棄する
GCP Console で [Deployment Manager] に移動し、minikf-on-gcp デプロイを削除します。
7. 完了
これで、Kubeflow(MiniKF)、Kale、Rok を使用してエンドツーエンドのデータ サイエンス ワークフローを正常に実行できました。
次のステップ
Kubeflow コミュニティに参加する:
- github.com/kubeflow
- Kubeflow Slack
- kubeflow-discuss@googlegroups.com
- 毎週のコミュニティ通話、Slack、その他のコミュニティの詳細
