MiniKF と Kale を使用してノートブックから Kubeflow パイプラインへ

1. はじめに

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

Kubeflow Deployment とは

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

  • ポータブル - Google Cloud Platform(GCP)、オンプレミス、または複数のプロバイダをまたいで、あらゆる Kubernetes クラスタで動作します。
  • スケーラブル - 変動するリソースを利用し、Kubernetes クラスタに割り当てられたリソース数によってのみ制限されます。
  • コンポーズ可能 - Service Worker により、オフラインでも低品質のネットワークでも作業可能

疎結合されたマイクロサービスを 1 つのユニットとして整理し、ノートパソコンやクラウドなどさまざまな場所にデプロイする手段です。

この Codelab では、MiniKF を使用して独自の Kubeflow Deployment を作成し、Jupyter ノートブック内から Kubeflow Pipelines ワークフローを実行する手順について説明します。

作成するアプリの概要

この Codelab では、Kubeflow Pipelines を使用して、CLI コマンドや SDK を使用せずに、複雑なデータ サイエンス パイプラインを構築します。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 プロジェクト ID とクラスタ名を設定する

プロジェクト ID は、GCP コンソールのホームパネル(左上のハンバーガー メニューにあります)で確認できます。画面が空の場合は、プロンプトで [はい] をクリックしてダッシュボードを作成します。

GCP コンソールを開きます

3fdc4329995406a0.png

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

e8952c0b96067dea.png

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

fe25c1925487142.png

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

Compute インスタンスを作成する

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

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

d6b423c1911ea85a.png

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

b5eeba43053db4bd.png

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

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

a683198ac4ba900d.png

80aad6ba5d298a7e.png

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

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

このセクションでは、タイタニック号のサンプルを実行します。これは、タイタニック号の難破船で生き残った乗客を予測する Kaggle コンペです。

ノートブック サーバーを作成する

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

4115cac8d8474d73.png

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

f9303c0a182e47f5.png

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

a2343f30bc9522ab.png

この画像が選択されていることを確認します。

gcr.io/arrikto-public/tensorflow-1.14.0-notebook-cpu:kubecon-workshop

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

8544d9b05826b316.png

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

28c024bcc55cc70a.png

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

2f06041475f45d3.png

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

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

2482011174f7bc75.png

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

cd data/
git clone -b kubecon-workshop https://github.com/kubeflow-kale/examples

このリポジトリには、データとアノテーション付きのノートブックを含む、キュレートされた一連のサンプルが含まれています。サイドバーの data/examples/titanic-ml-dataset/ フォルダに移動し、ノートブック titanic_dataset_ml.ipynb を開きます。

c85baf68b36c63b2.png

タイタニック号 チャレンジの ML コードを調べる

ノートブックを段階的に実行します。ライブラリがないため、コードは失敗します。

bf2451fd7407e334.png

ターミナルに戻り、不足しているライブラリをインストールします。

pip3 install --user seaborn

d90593b21425dd12.png

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

a21f5f563b36ce4d.png

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

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

左側のペインで Kubeflow アイコンをクリックして Kale を有効にします。

3f4f9c93b187b105.png

セルごとの依存関係を確認します。複数のセルが 1 つのパイプライン ステップの一部になる仕組みと、パイプライン ステップが前のステップにどのように依存するかについて説明します。

15cca32444c1f12e.png

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

bde5cef34f00e258.png

スナップショットの進行状況を確認します。

9408f46abb2493f5.png

パイプライン実行の進行状況を確認します。

9edbde68032f5e4b.png

リンクをクリックして Kubeflow Pipelines UI に移動し、実行を表示します。

a81646a22584e1b9.png

完了するまで待ってください。

44bee7dc0d24ec21.png

d377b6d574a4970.png

これで、ノートブックからエンドツーエンドの Kubeflow パイプラインを実行しました。

5. ボリューム スナップショットによる再現性

結果を調べる

ログで、最後から 2 番目のパイプライン ステップの [結果] を確認します。すべての予測子のスコアが 100% であることに注目してください。経験豊富なデータ サイエンティストであれば、これはすぐに不審だと判断するでしょう。これは、モデルが一般化されておらず、トレーニング データセットに対して過学習であることを示しています。これは、モデルによって使用されるデータの問題が原因である可能性があります。

2a594032c2dd6ff6.png

以前の状態を再現する

幸いなことに、Rok が [Compile and Run] ボタンをクリックしたときと同じように、データのバージョニングと環境全体の再現を行います。こうすることで、データとコードのタイムマシンが完成します。1 つのモデルをトレーニングする前に、パイプラインの状態を再開して、何が起こっているかを見てみましょう。randomforest ステップを確認し、[Artifacts] をクリックします。

4f25ca4560711b23.png

マークダウンの手順を行います。つまり、対応するリンクをクリックして Rok UI でスナップショットを表示します。

e533bc781da9355a.png

Rok の URL をコピーします。

d155d19731b5cedd.png

[ノートブック サーバー] リンクに移動します。

aafeab01f3ef0863.png

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

f2265a64e8f9d094.png

先ほどコピーした Rok の URL を貼り付けて、[自動入力] ボタンをクリックします。

9ba4d4128a3bdeea.png

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

7685c3bf35fc74b2.png

この画像が選択されていることを確認します。

gcr.io/arrikto-public/tensorflow-1.14.0-notebook-cpu:kubecon-workshop

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

28c024bcc55cc70a.png

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

34955a64ae316de1.png

ノートブックは、生成したパイプライン ステップの正確なセルで開きます。

a1f7c81f349e0364.png

バックグラウンドでは、Kale はすべてのライブラリをインポートし、前のステップの変数を読み込むことで、ノートブックの状態を再開しています。

以前の状態をデバッグする

print コマンドをこのセルに追加します。

print(acc_random_forest)

Shift+Return キーを押してアクティブなセルを実行し、ランダム フォレストを再トレーニングしてスコアを出力します。100 です。

e2a8a3b5465fcb5d.png

ここで、トレーニング データに何かおかしなものがないか確認します。この問題を調べて解決するには、前のセルを選択してプラスアイコン(+)をクリックし、Random Forest マークダウンの上にセルを追加します。

d1077f32dff9620f.png

次のテキストを追加し、セルを実行してトレーニング セットを出力します。

train_df

2854798ff01aed4e.png

エラー: トレーニング ラベルの付いた列(「Survived」)が入力特徴として誤って含まれています。モデルは「生き残った」結果に焦点を当てることを残りは無視して入力を汚染します。この列はモデルの目標と完全に一致し、予測時に存在しないため、モデルが他の特徴から学習できるようにするには、トレーニング データセットから削除する必要があります。

バグの修正を追加する

この列を削除するには、セルを編集して次のコマンドを追加します。

train_df.drop('Survived', axis=1, inplace=True)
train_df

9e76c16a862b566.png

Kale を有効にし、[Survived] ラベルを削除するセルが特徴量エンジニアリング パイプライン ステップの一部であることを確認します(枠線は同じ色である必要があります)。

[Compile and Run] ボタンをクリックして、パイプラインを再度実行します。

リンクをクリックして Kubeflow Pipelines UI に移動し、実行を表示します。

results ステップが完了するまで待ち、ログを表示して最終結果を確認します。これで、現実的な予測スコアが得られました。

8c6a9676b49e5be8.png

6. クリーンアップ

MiniKF VM を破棄する

GCP コンソールで [Deployment Manager] に移動し、minikf-1 Deployment を削除します。

7. 完了

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

次のステップ

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

参考資料