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

1. はじめに

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

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

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

  • ポータブル - Google Cloud Platform(GCP)、オンプレミス、プロバイダ間など稼働場所に関係なく、あらゆる Kubernetes クラスタで動作します。
  • スケーラブル - リソースの変動に対応可能であり、Kubernetes クラスタに割り当てられたリソース数によってのみ制限されます。
  • 構成可能 - Service Worker で拡張されるため、オフラインや低品質のネットワーク上でも作業可能です。

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

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

作成するアプリの概要

この 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 を実行する方法
  • Notebook とすべてのパイプライン ステップでデータを自動的にバージョン管理する方法

必要なもの

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

2. 環境を設定する

GCP プロジェクト ID とクラスタ名を設定する

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

GCP Console を開く

3fdc4329995406a0.png

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

e8952c0b96067dea.png

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

fe25c1925487142.png

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

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

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

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

d6b423c1911ea85a.png

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

b5eeba43053db4bd.png

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

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

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

このセクションでは、タイタニック号の難破事故でどの乗客が生き残ったかを予測する Kaggle コンペティションであるタイタニック号の例を実行します。

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

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

4115cac8d8474d73.png

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

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

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

bde5cef34f00e258.png

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

9408f46abb2493f5.png

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

9edbde68032f5e4b.png

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

a81646a22584e1b9.png

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

44bee7dc0d24ec21.png

d377b6d574a4970.png

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

5. Volume Snapshots による再現性

結果を調べる

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

2a594032c2dd6ff6.png

以前の状態を再現する

幸いなことに、Rok はデータ バージョニングと、[コンパイルして実行] ボタンをクリックした時点の環境全体の再現を処理します。これにより、データとコードのタイムマシンが作成されます。モデルの 1 つをトレーニングする前のパイプラインの状態を再開して、何が起こっているかを確認しましょう。randomforest ステップを確認し、[アーティファクト] をクリックします。

4f25ca4560711b23.png

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

e533bc781da9355a.png

Rok URL をコピーします。

d155d19731b5cedd.png

[Notebook Servers] リンクに移動します。

aafeab01f3ef0863.png

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

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

次に、トレーニング データに異常がないか確認します。この問題を調べて修正するには、前のセルを選択してプラスアイコン(+)をクリックし、ランダム フォレストのマークダウンの上にセルを追加します。

d1077f32dff9620f.png

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

train_df

2854798ff01aed4e.png

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

バグ修正を追加する

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

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

9e76c16a862b566.png

Kale を有効にして、Survived ラベルを削除するセルが featureengineering パイプライン ステップの一部であることを確認します(同じアウトラインの色になっているはずです)。

[コンパイルして実行] ボタンをクリックして、パイプラインをもう一度実行します。

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

結果の手順が完了するまで待ってから、ログを表示して最終結果を確認します。これで、現実的な予測スコアが得られました。

8c6a9676b49e5be8.png

6. クリーンアップ

MiniKF VM を破棄する

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

7. 完了

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

次のステップ

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

参考資料