1. はじめに
Kubeflow は Kubernetes の 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 を実行する方法
- ノートブックとすべてのパイプライン ステップでデータを自動的にバージョニングする方法
必要なもの
- 自分がオーナー権限を持つアクティブな GCP プロジェクト
これは、Kubeflow に重点を置いた高度な Codelab です。その他の背景とプラットフォームの概要については、Kubeflow の概要のドキュメントをご覧ください。関連のない概念とコードブロックについては軽く触れるにとどめ、そのままコピーして貼り付けられるようにしています。
2. 環境を設定する
GCP プロジェクト ID とクラスタ名を設定する
プロジェクト ID は、GCP コンソールのホームパネル(左上のハンバーガー メニューにあります)で確認できます。画面が空の場合は、プロンプトで [はい] をクリックしてダッシュボードを作成します。
プロジェクトが選択されていない場合は、[プロジェクトを選択] をクリックします。
プロジェクトを選択します。1 つのみ必要です。
3. MiniKF をインストールする
Compute インスタンスを作成する
GCP Marketplace で「MiniKF」を検索します。
Arrikto の MiniKF 仮想マシンを選択します。
[Compute Engine 上で起動] ボタンをクリックしてプロジェクトを選択します。
[Configure &[デプロイ] ウィンドウで、MiniKF インスタンスの名前を選択し、デフォルトのオプションをそのまま使用します。[Deploy] ボタンをクリックします。
MiniKF コンピューティング インスタンスの起動を待ちます。
MiniKF にログインします。
MiniKF VM が起動したら、[SSH] ボタンをクリックして接続し、ログインします。画面上の手順に沿って minikf
コマンドを実行します。これにより、Minikube、Kubeflow、Rok のデプロイが開始されます。完了するまでに数分かかります。
Kubeflow にログインする
インストールが完了し、すべての Pod の準備ができたら、MiniKF ダッシュボードにアクセスします。MiniKF のユーザー名とパスワードを使用して Kubeflow にログインします。
Chrome ユーザーには、次の画面が表示されます。
Firefox ユーザーには、次の画面が表示されます。
Safari ユーザーには、この画面が表示されます。
Rok にログインする
Kubeflow にログインしたら、ハンバーガー アイコンをクリックして左側のメニューを開きます。Snapshot Store に移動し、MiniKF のユーザー名とパスワードを使用して Rok にログインします。
これで、GCP に MiniKF が正常にデプロイされました。これで、Notebooks を作成し、ML コードを記述して、Kubeflow Pipelines を実行できるようになりました。データのバージョニングと再現性のために Rok を使用する。
4. ノートブック内からパイプラインを実行する
このセクションでは、タイタニック号のサンプルを実行します。これは、タイタニック号の難破船で生き残った乗客を予測する Kaggle コンペです。
ノートブック サーバーを作成する
Kubeflow の中央ダッシュボードで [Notebook Servers] リンクに移動します。
[New Server] をクリックします。
ノートブック サーバーの名前を指定します。
この画像が選択されていることを確認します。
gcr.io/arrikto-public/tensorflow-1.14.0-notebook-cpu:kubecon-workshop
5 GB の新しい空のデータ ボリュームを追加し、data という名前を付けます。
[起動] をクリックしてノートブック サーバーを作成します。
ノートブック サーバーが利用可能になったら、[接続] をクリックして接続します。
データとノートブックをダウンロードする
新しいタブが開き、JupyterLab のランディング ページが表示されます。JupyterLab で新しいターミナルを作成します。
ターミナル ウィンドウで以下のコマンドを実行して data フォルダに移動し、ノートブックとこのラボの残りの部分で使用するデータをダウンロードします。
cd data/ git clone -b kubecon-workshop https://github.com/kubeflow-kale/examples
このリポジトリには、データとアノテーション付きのノートブックを含む、キュレートされた一連のサンプルが含まれています。サイドバーの data/examples/titanic-ml-dataset/
フォルダに移動し、ノートブック titanic_dataset_ml.ipynb
を開きます。
タイタニック号 チャレンジの ML コードを調べる
ノートブックを段階的に実行します。ライブラリがないため、コードは失敗します。
ターミナルに戻り、不足しているライブラリをインストールします。
pip3 install --user seaborn
更新アイコンをクリックしてノートブック カーネルを再起動します。
正しいライブラリをインストールしてセルを再度実行し、成功することを確認します。
ノートブックを Kubeflow パイプラインに変換する
左側のペインで Kubeflow アイコンをクリックして Kale を有効にします。
セルごとの依存関係を確認します。複数のセルが 1 つのパイプライン ステップの一部になる仕組みと、パイプライン ステップが前のステップにどのように依存するかについて説明します。
[Compile and Run] ボタンをクリックします。
スナップショットの進行状況を確認します。
パイプライン実行の進行状況を確認します。
リンクをクリックして Kubeflow Pipelines UI に移動し、実行を表示します。
完了するまで待ってください。
これで、ノートブックからエンドツーエンドの Kubeflow パイプラインを実行しました。
5. ボリューム スナップショットによる再現性
結果を調べる
ログで、最後から 2 番目のパイプライン ステップの [結果] を確認します。すべての予測子のスコアが 100% であることに注目してください。経験豊富なデータ サイエンティストであれば、これはすぐに不審だと判断するでしょう。これは、モデルが一般化されておらず、トレーニング データセットに対して過学習であることを示しています。これは、モデルによって使用されるデータの問題が原因である可能性があります。
以前の状態を再現する
幸いなことに、Rok が [Compile and Run] ボタンをクリックしたときと同じように、データのバージョニングと環境全体の再現を行います。こうすることで、データとコードのタイムマシンが完成します。1 つのモデルをトレーニングする前に、パイプラインの状態を再開して、何が起こっているかを見てみましょう。randomforest ステップを確認し、[Artifacts] をクリックします。
マークダウンの手順を行います。つまり、対応するリンクをクリックして Rok UI でスナップショットを表示します。
Rok の URL をコピーします。
[ノートブック サーバー] リンクに移動します。
[New Server] をクリックします。
先ほどコピーした Rok の URL を貼り付けて、[自動入力] ボタンをクリックします。
ノートブックの名前を指定します。
この画像が選択されていることを確認します。
gcr.io/arrikto-public/tensorflow-1.14.0-notebook-cpu:kubecon-workshop
[起動] をクリックしてノートブック サーバーを作成します。
ノートブック サーバーが利用可能になったら、[接続] をクリックして接続します。
ノートブックは、生成したパイプライン ステップの正確なセルで開きます。
バックグラウンドでは、Kale はすべてのライブラリをインポートし、前のステップの変数を読み込むことで、ノートブックの状態を再開しています。
以前の状態をデバッグする
print コマンドをこのセルに追加します。
print(acc_random_forest)
Shift+Return キーを押してアクティブなセルを実行し、ランダム フォレストを再トレーニングしてスコアを出力します。100 です。
ここで、トレーニング データに何かおかしなものがないか確認します。この問題を調べて解決するには、前のセルを選択してプラスアイコン(+)をクリックし、Random Forest マークダウンの上にセルを追加します。
次のテキストを追加し、セルを実行してトレーニング セットを出力します。
train_df
エラー: トレーニング ラベルの付いた列(「Survived」)が入力特徴として誤って含まれています。モデルは「生き残った」結果に焦点を当てることを残りは無視して入力を汚染します。この列はモデルの目標と完全に一致し、予測時に存在しないため、モデルが他の特徴から学習できるようにするには、トレーニング データセットから削除する必要があります。
バグの修正を追加する
この列を削除するには、セルを編集して次のコマンドを追加します。
train_df.drop('Survived', axis=1, inplace=True) train_df
Kale を有効にし、[Survived] ラベルを削除するセルが特徴量エンジニアリング パイプライン ステップの一部であることを確認します(枠線は同じ色である必要があります)。
[Compile and Run] ボタンをクリックして、パイプラインを再度実行します。
リンクをクリックして Kubeflow Pipelines UI に移動し、実行を表示します。
results ステップが完了するまで待ち、ログを表示して最終結果を確認します。これで、現実的な予測スコアが得られました。
6. クリーンアップ
MiniKF VM を破棄する
GCP コンソールで [Deployment Manager] に移動し、minikf-1
Deployment を削除します。
7. 完了
これで、Kubeflow(MiniKF)、Kale、Rok を使用したエンドツーエンドのデータ サイエンス ワークフローが正常に実行されました。
次のステップ
Kubeflow コミュニティに参加する:
- github.com/kubeflow
- Kubeflow Slack
- kubeflow-discuss@googlegroups.com
- 火曜日のコミュニティ コール