MLOps on Databricks with Vertex AI on Google Cloud - The Databricks Blogの翻訳です。
本書は抄訳であり内容の正確性を保証するものではありません。正確な内容に関しては原文を参照ください。
2021初めのDatabricks on Google Cloudのローンチ以来、DatabricksとGoogle CloudはDatabricksプラットフォームをクラウドのエコシステムとネイティブサービスに対してさらにインテグレーションするためにパートナーリングを行ってきました。現在、DatabricksはCloud Storage、Google Kubernetes Engine、BigQueryなどの数多くのGoogle Cloudのネイティブサービスと密連携して構築されています。DatabricksとGoogle Cloudは、モデル開発のライフサイクルを加速するためのMLflow、Vertex AIデプロイメントプラグインを発表できることを嬉しく思っています。
どうして現在のMLOpsは難しいのでしょうか?
迅速なイテレーションと実験を可能にするためにソフトウェア企業によって培われた標準的なDevOpsプラクティスは、多くの場合、データサイエンティストにとってはわかりにくいものとなっています。これらのプラクティスには、ワークフロー管理、ソースコントロール、アーティファクト管理、CICDのような人間と技術的なコンセプトが含まれています。機械学習が本来持っている複雑性に加えられることによって、現在ではMLOpsを自薦することが困難となっており、優れたMLOpsプロセスには適切なツールが必要となっています。
現在の機械学習(ML)エコシステムには、MLライフサイクルの一部に特化し、機能を提供する膨大な量のさまざまなツールが含まれていますが、多くのものは完全なエンドツーエンドのソリューションを提供していません。これが、DatabricksがGoogle Cloudのチームが連携して、データサイエンティストが安全に自身のモデルをトレーニングし、機械学習エンジニアがそのモデルをプロダクションに移行して提供し、モデルの利用者がビジネスニーズに応じて予測結果を得られるようにするために、MLflowとVertex AIの長所を活用するシームレスなインテグレーションをおこなった理由です。
MLflowはDatabricksによって開発され、実験、再現性の確保、デプロイメント、集中管理されたモデルレジストリを含む完全なMLライフサイクルを管理するためのオープンソースライブラリです。Vertex AIはモデルトレーニングからモデルデプロイメントまでをカバーするエンドツーエンドのMLソリューションを提供するGoogle Cloudの統合人工知能プラットフォームです。データサイエンティストと機械学習エンジニアは、事前ビルド済みのPredictionイメージを用いて、リアルタイムのモデルサービングのためにVertex AIで自分のモデルをプロダクションにデプロイすることができ、この新たなプラグインのおかげでモデルモニタリングを用いてモデルの品質と鮮度を保証できるようになり、さらに、Apache Spark™とオープンソースのDelta Lake(そして、パッケージされているMLランタイム、AutoML、モデルレジストリ)のパワーを活用しつつも、DatabricksのマネージドMLflowでモデルをトレーニングできるようになります。
注意
このプラグインは、オープンソースのMLflowでもテストされ、動作が確認されています。
技術的デモ
MLflowとVertex AIを用いたエンドツーエンドのMLOpsソリューションをどのように構築するのかを説明していきましょう。ここでは、MLflowを用いてシンプルなscikit-learnの肥満モデルをトレーニングし、モデルレジストリに保存し、Vertex AIのエンドポイントにデプロイします。
始める前に、このインテグレーションを用いる際、内部で何が行われているのかを理解することが重要となります。以下のリファレンスアーキテクチャを見ると、このインテグレーションで使用されているDatabricksのコンポーネントとGoogle Cloudのサービスを確認することができます。
MLflowとVertex AIを用いたエンドツーエンドのMLOpsソリューション
注意
以下のステップでは、Google CloudでセットアップされたVertex AIとCloud Buildに対して適切な権限を持つDatabricks Google Cloudワークスペースがデプロイされていることを前提としています。
ステップ1: Vertex AIのリソースにアクセスする適切な権限を持つサービスアカウントを作成し、MLR 10.xが稼働しているクラスターにアタッチします。
ステップ2: クラスターにPyPIからgoogle-cloud-mlflow pluginをダウンロードします。ライブラリとしてクラスターに直接ダウンロードするか、クラスターにアタッチしたノートブックで以下のpipコマンドを実行します。
%pip install google-cloud-mlflow
ステップ3: ノートブックで、以下のパッケージをインポートします。
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します。
# 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に格納するモデルレジストリにモデルを記録します。
model_name = "vertex-sklearn-blog-demo"
mlflow.sklearn.log_model(rf, model_name, registered_model_name=model_name)
ステップ6: MLflow Tracking Clientを用いてモデルの最新バージョンをプログラムから取得します。現実のシナリオにおいては、モデルがプロダクションの基準を満たした際には、お使いのCICDを用いてモデルをステージングからプロダクションに移行したいと考えることでしょう。
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クライアントのインスタンスを作成し、エンドポイントにデプロイします。
# 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をチェックし、公開されているモデルを確認します。
ステップ9: バッチ推論のためにノートブック内でプラグインを用いてエンドポイントを呼び出します。現実的なプロダクションのシナリオにおいては、リアルタイム推論のためのwebサービスやアプリケーションからエンドポイントを呼び出したいと考えるでしょう。
# Use the .predict() method from the same plugin
predictions = vtx_client.predict(deploy_name, X_test)
予測結果は以下のようなPredictionクラスとして返却され、pandasデータフレームにパーシングし、ビジネス要件に応じて活用することになります。
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のオンデマンドセッション「Accelerating MLOps Using Databricks and Vertex AI on Google Cloud」をチェックしてください。
今からあなたのMLの旅路を始めるには、すぐにでもあなたのワークスペースにデモノートブックをインポートしてください。最初に利用されるお客様はパートナーシップのクレジットを活用することができ、無料のDatabricks on Google Cloudトライアルをスタートすることができます。ご質問があれば、こちらの問い合わせ窓口からコンタクトしてください。