Google CloudにおけるVertex AIとDatabricksを用いたMLOps

[MLOps on Databricks with Vertex AI on Google Cloud \- The Databricks Blog](https://www.databricks.com/blog/2022/08/12/mlops-on-databricks-with-vertex-ai-on-google-cloud.html)の翻訳です。

:::note warn
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
:::

2021初めの[Databricks on Google Cloud](https://www.databricks.com/jp/product/google-cloud)のローンチ以来、DatabricksとGoogle CloudはDatabricksプラットフォームをクラウドのエコシステムとネイティブサービスに対してさらにインテグレーションするためにパートナーリングを行ってきました。現在、DatabricksはCloud Storage、Google Kubernetes Engine、BigQueryなどの数多くのGoogle Cloudのネイティブサービスと密連携して構築されています。DatabricksとGoogle Cloudは、モデル開発のライフサイクルを加速するためのMLflow、[Vertex AI](https://cloud.google.com/vertex-ai)デプロイメントプラグインを発表できることを嬉しく思っています。

# どうして現在のMLOpsは難しいのでしょうか？

迅速なイテレーションと実験を可能にするためにソフトウェア企業によって培われた標準的なDevOpsプラクティスは、多くの場合、データサイエンティストにとってはわかりにくいものとなっています。これらのプラクティスには、ワークフロー管理、ソースコントロール、アーティファクト管理、CICDのような人間と技術的なコンセプトが含まれています。機械学習が本来持っている複雑性に加えられることによって、現在ではMLOpsを自薦することが困難となっており、優れたMLOpsプロセスには適切なツールが必要となっています。

現在の機械学習(ML)エコシステムには、MLライフサイクルの一部に特化し、機能を提供する膨大な量のさまざまなツールが含まれていますが、多くのものは完全なエンドツーエンドのソリューションを提供していません。これが、DatabricksがGoogle Cloudのチームが連携して、データサイエンティストが安全に自身のモデルをトレーニングし、機械学習エンジニアがそのモデルをプロダクションに移行して提供し、モデルの利用者がビジネスニーズに応じて予測結果を得られるようにするために、MLflowとVertex AIの長所を活用するシームレスなインテグレーションをおこなった理由です。

MLflowはDatabricksによって開発され、実験、再現性の確保、デプロイメント、集中管理されたモデルレジストリを含む完全なMLライフサイクルを管理するためのオープンソースライブラリです。[Vertex AI](https://cloud.google.com/vertex-ai)はモデルトレーニングからモデルデプロイメントまでをカバーするエンドツーエンドのMLソリューションを提供するGoogle Cloudの統合人工知能プラットフォームです。データサイエンティストと機械学習エンジニアは、事前ビルド済みの[Prediction](https://cloud.google.com/vertex-ai/docs/predictions/getting-predictions)イメージを用いて、リアルタイムのモデルサービングのためにVertex AIで自分のモデルをプロダクションにデプロイすることができ、この新たなプラグインのおかげで[モデルモニタリング](https://cloud.google.com/vertex-ai/docs/model-monitoring)を用いてモデルの品質と鮮度を保証できるようになり、さらに、Apache Spark™とオープンソースのDelta Lake(そして、パッケージされている[MLランタイム](https://qiita.com/taka_yayoi/items/824b507019d3ade7eedc)、[AutoML](https://qiita.com/taka_yayoi/items/0ed860131a02aeade14f)、[モデルレジストリ](https://qiita.com/taka_yayoi/items/e7a4bec6420eb7069995))のパワーを活用しつつも、DatabricksのマネージドMLflowでモデルをトレーニングできるようになります。

:::note
**注意**
このプラグインは、オープンソースのMLflowでもテストされ、動作が確認されています。
:::

# 技術的デモ

MLflowとVertex AIを用いたエンドツーエンドのMLOpsソリューションをどのように構築するのかを説明していきましょう。ここでは、MLflowを用いてシンプルなscikit-learnの肥満モデルをトレーニングし、モデルレジストリに保存し、Vertex AIのエンドポイントにデプロイします。

始める前に、このインテグレーションを用いる際、内部で何が行われているのかを理解することが重要となります。以下のリファレンスアーキテクチャを見ると、このインテグレーションで使用されているDatabricksのコンポーネントとGoogle Cloudのサービスを確認することができます。
![](https://www.databricks.com/wp-content/uploads/2022/08/db-289-blog-img-1.png)
*MLflowとVertex AIを用いたエンドツーエンドのMLOpsソリューション*

:::note
**注意**
以下のステップでは、Google Cloudでセットアップされた**Vertex AI**と[**Cloud Build**](https://cloud.google.com/build)に対して適切な権限を持つ[Databricks Google Cloudワークスペース](https://qiita.com/taka_yayoi/items/bcc28c44ace4d0439ef6)がデプロイされていることを前提としています。
:::

**ステップ1:** Vertex AIのリソースにアクセスする適切な権限を持つサービスアカウントを作成し、[MLR 10\.x](https://docs.gcp.databricks.com/runtime/mlruntime.html)が稼働している[クラスターにアタッチ](https://docs.gcp.databricks.com/clusters/configure.html#google-service-account)します。

**ステップ2:** クラスターにPyPIから[google\-cloud\-mlflow plugin](https://pypi.org/project/google-cloud-mlflow/)をダウンロードします。[ライブラリ](https://docs.gcp.databricks.com/libraries/cluster-libraries.html)としてクラスターに直接ダウンロードするか、クラスターにアタッチしたノートブックで以下のpipコマンドを実行します。

```
%pip install google-cloud-mlflow
```

**ステップ3:** ノートブックで、以下のパッケージをインポートします。

```py:Python
import mlflow
from mlflow.deployments import get_deploy_client
from sklearn.model_selection import train_test_split
from sklearn.datasets import load_diabetes 
from sklearn.ensemble import RandomForestRegressor
import pandas as pd
import numpy as np
```

**ステップ4:** MLflowを用いて使用されたハイパーパラメーター、テスト結果を含むscikit-learnエクスペリメントをトレーニング、テスト、[autolog](https://docs.gcp.databricks.com/applications/mlflow/databricks-autologging.html)します。

```py:Python
# load dataset
db = load_diabetes()
X = db.data
y = db.target
X_train, X_test, y_train, y_test = train_test_split(X, y)
 
# mlflow.sklearn.autolog() requires mlflow 1.11.0 or above.
mlflow.sklearn.autolog()
 
# With autolog() enabled, all model parameters, a model score, and the fitted model are automatically logged.  
with mlflow.start_run() as run:  
  # Set the model parameters. 
  n_estimators = 100
  max_depth = 6
  max_features = 3
  # Create and train model.
  rf = RandomForestRegressor(n_estimators = n_estimators, max_depth = max_depth, max_features = max_features)
  rf.fit(X_train, y_train)
  # Use the model to make predictions on the test dataset.
  predictions = rf.predict(X_test)
  
mlflow.end_run()
```

**ステップ5:** モデルのアーティファクトを[Google Cloud Storage](https://cloud.google.com/storage)に格納する[モデルレジストリ](https://docs.gcp.databricks.com/applications/mlflow/model-registry.html)にモデルを記録します。

```py:Python
model_name = "vertex-sklearn-blog-demo"
mlflow.sklearn.log_model(rf, model_name, registered_model_name=model_name)
```
![](https://www.databricks.com/wp-content/uploads/2022/08/db-289-blog-img-2.png)
*MLflowモデルレジストリに記録されたモデル*

**ステップ6:** [MLflow Tracking Client](https://mlflow.org/docs/latest/python_api/mlflow.client.html#module-mlflow.client)を用いてモデルの最新バージョンをプログラムから取得します。現実のシナリオにおいては、モデルがプロダクションの基準を満たした際には、お使いのCICDを用いてモデルをステージングからプロダクションに[移行](https://www.mlflow.org/docs/latest/model-registry.html#transitioning-an-mlflow-models-stage)したいと考えることでしょう。

```py:Python
client = mlflow.tracking.MLflowClient()
model_version_infos = client.search_model_versions(f"name = '{model_name}'")
model_version = max([int(model_version_info.version) for model_version_info in model_version_infos])
model_uri=f"models:/{model_name}/{model_version}"

# model_uri should be models:/vertex-sklearn-blog-demo/1
```

**ステップ7:** たった3行のコードを用いてVertex AIクライアントのインスタンスを作成し、エンドポイントにデプロイします。

```py:Python
# Really simple Vertex client instantiation
vtx_client = mlflow.deployments.get_deploy_client("google_cloud")
deploy_name = f"{model_name}-{model_version}"

# Deploy to Vertex AI using three lines of code! Note: If using python > 3.7, this may take up to 20 minutes.
deployment = vtx_client.create_deployment(
    name=deploy_name,
    model_uri=model_uri)
```

**ステップ8:** Vertex AIのUIをチェックし、公開されているモデルを確認します。

![](https://www.databricks.com/wp-content/uploads/2022/08/db-289-blog-img-3.png)
*Google Cloudコンソール上のVertex AI*

**ステップ9:** バッチ推論のためにノートブック内でプラグインを用いてエンドポイントを呼び出します。現実的なプロダクションのシナリオにおいては、リアルタイム推論のためのwebサービスやアプリケーションからエンドポイントを呼び出したいと考えるでしょう。

```py:Python
# Use the .predict() method from the same plugin
predictions = vtx_client.predict(deploy_name, X_test)
```

予測結果は以下のようなPredictionクラスとして返却され、pandasデータフレームにパーシングし、ビジネス要件に応じて活用することになります。

```py
Prediction(predictions=[108.8213062661298, 121.8157069007118, 196.7929187443363, 159.9036896543356, 276.4400040206476, 100.4831327904369, 98.03313768162721, 170.2935904379434, 123.854209126032, 200.582723610864, 243.8882952682826, 89.56782205639794, 225.6276360204631, 183.9313416074667, 182.1405547852122, 179.3878755228988, 149.3434367420051, ...
```

# まとめ

お分かりになると思いますが、MLOpsは難しいものである必要はありません。エンドツーエンドのMLflow、Vertex AIのソリューションを用いることで、データチームは数週間、数ヶ月、あるいは決して終わらなかった開発からプロダクションへの移行を数日で実現することができるのです！エンドツーエンドのワークフローのライブデモに関しては、[DAIS 2022](https://www.databricks.com/dataaisummit/)のオンデマンドセッション「[Accelerating MLOps Using Databricks and Vertex AI on Google Cloud](https://www.databricks.com/dataaisummit/session/accelerating-mlops-using-databricks-and-vertex-ai-gcp)」をチェックしてください。

今からあなたのMLの旅路を始めるには、すぐにでもあなたのワークスペースに[デモノートブック](https://www.databricks.com/wp-content/uploads/notebooks/mlflow-vertex-deployment.html)をインポートしてください。最初に利用されるお客様はパートナーシップのクレジットを活用することができ、[無料のDatabricks on Google Cloudトライアル](https://www.databricks.com/p/google-cloud-free-trial)をスタートすることができます。ご質問があれば、こちらの[問い合わせ窓口](https://www.databricks.com/jp/company/contact)からコンタクトしてください。

### Databricks 無料トライアル

[Databricks 無料トライアル](https://databricks.com/jp/try-databricks)