この記事では、モザイク AI モデル サービスを使用したカスタム モデルのサポートについて説明します。 サポートされているモデル ログ オプションとコンピューティングの種類、サービス用にモデルの依存関係をパッケージ化する方法、エンドポイントの作成とスケーリングに対する期待について詳しく説明します。
カスタム モデルとは
Model Serving では、CPU または GPU コンピューティング リソースを使用して、任意の Python モデルまたは カスタム コード を運用グレードの API としてデプロイできます。 Databricks では、このようなモデルをカスタム モデルと呼びます。 これらの ML モデルは、scikit-learn、XGBoost、PyTorch、HuggingFace トランスフォーマーなどの標準 ML ライブラリを使用してトレーニングでき、任意の Python コードを含めることができます。
カスタム モデルをデプロイするには、
- ネイティブ MLflow の組み込みフレーバー または pyfunc を使用して、モデルまたはコードを MLflow 形式でログします。
- モデルがログされたら、それを Unity カタログ (推奨) またはワークスペース レジストリに登録します。
- ここから、モデルをデプロイしてクエリを実行するためのモデル サービング エンドポイントを作成できます。
- 「カスタム モデル サービング エンドポイントを作成する」を参照してください
- 「カスタム モデルのエンドポイントを提供するクエリ」をご覧ください。
Databricks でカスタム モデルを提供する方法に関する完全なチュートリアルについては、Model の提供に関するチュートリアルを参照してください。
Databricks では、生成型AIアプリケーションの基盤モデルの提供もサポートされています。サポートされているモデルやコンピューティングの提供に関しては、Foundation Model APIs および External models を参照してください。
ML モデルをログする
モデルの提供のために ML モデルをログするには、さまざまな方法があります。 次のリストは、サポートされている方法と例をまとめたものです。
自動ログ この方法は、Databricks Runtime for ML を使用する場合に自動的に有効になります。
import mlflow from sklearn.ensemble import RandomForestRegressor from sklearn.datasets import load_iris iris = load_iris() model = RandomForestRegressor() model.fit(iris.data, iris.target)MLflow の組み込みフレーバーを使用してログを記録します。 より詳細な制御のためにモデルを手動でログする場合は、この方法を使用できます。
import mlflow from sklearn.ensemble import RandomForestClassifier from sklearn.datasets import load_iris iris = load_iris() model = RandomForestClassifier() model.fit(iris.data, iris.target) with mlflow.start_run(): mlflow.sklearn.log_model(model, "random_forest_classifier")pyfuncを使用したカスタム ログ。 この方法を使用すると、任意の Python コード モデルをデプロイしたり、モデルと共に追加のコードをデプロイしたりできます。import mlflow import mlflow.pyfunc class Model(mlflow.pyfunc.PythonModel): def predict(self, context, model_input): return model_input * 2 with mlflow.start_run(): mlflow.pyfunc.log_model("custom_model", python_model=Model())
- HuggingFace からダウンロード. Hugging Face からモデルを直接ダウンロードし、そのモデルをログに記録してサービスを提供できます。 例については、「ノートブックの例」を参照してください。
シグネチャと入力の例
シグネチャと入力の例を MLflow に追加することをお勧めします。 シグネチャは、モデルを Unity Catalog にログするために必要です。
シグネチャの例を次に示します。
from mlflow.models.signature import infer_signature
signature = infer_signature(training_data, model.predict(training_data))
mlflow.sklearn.log_model(model, "model", signature=signature)
入力の例を次に示します。
input_example = {"feature1": 0.5, "feature2": 3}
mlflow.sklearn.log_model(model, "model", input_example=input_example)
コンピューティングの種類
Mosaic AI Model Serving には、モデルをデプロイするための CPU と GPU のさまざまなオプションが用意されています。 GPU を使用してデプロイする場合は、フレームワークによって提供されるメソッドを使用して、GPU で予測が実行されるようにコードが設定されていることを確認する必要があります。 これは、PyTorch または Transformers フレーバーでログに記録されたモデルに対して、MLflow によって自動的に行われます。
| ワークロードの種類 | GPU インスタンス | 記憶 |
|---|---|---|
CPU |
コンカレンシーあたり 4 GB | |
GPU_SMALL |
1xT4 | 16 GB |
GPU_LARGE |
1xA100 | 80 GB |
GPU_LARGE_2 |
2xA100 | 160 GB |
GPU_LARGE_4 |
4xA100 | 320 GB |
デプロイ コンテナーと依存関係
デプロイ時に、運用グレードのコンテナーがビルドされ、エンドポイントとしてデプロイされます。 このコンテナーには、MLflow モデルで自動的にキャプチャまたは指定されたライブラリが含まれます。 基本イメージにはシステム レベルの依存関係がいくつか含まれる場合がありますが、アプリケーション レベルの依存関係は MLflow モデルで明示的に指定する必要があります。
必要なすべての依存関係がモデルに含まれていない場合は、デプロイ中に依存関係エラーが発生する可能性があります。 モデル デプロイの問題が発生する場合、Databricks ではモデルをローカルでテストすることをお勧めしています。
パッケージとコードの依存関係
デプロイにカスタムまたはプライベートのライブラリを追加できます。 「Model Serving でのカスタム Python ライブラリの使用」を参照してください。
MLflow ネイティブ フレーバー モデルの場合、必要なパッケージの依存関係が自動的にキャプチャされます。
カスタム pyfunc モデルの場合、依存関係を明示的に追加できます。 ログ要件とベスト プラクティスの詳細については、 MLflow モデルのドキュメント と MLflow Python API リファレンスを参照してください。
パッケージの依存関係は、次を使用して追加できます。
pip_requirementsパラメータ:mlflow.sklearn.log_model(model, "sklearn-model", pip_requirements = ["scikit-learn", "numpy"])conda_envパラメータ:conda_env = { 'channels': ['defaults'], 'dependencies': [ 'python=3.7.0', 'scikit-learn=0.21.3' ], 'name': 'mlflow-env' } mlflow.sklearn.log_model(model, "sklearn-model", conda_env = conda_env)自動的にキャプチャされる要件の他に追加の要件を含めるには、
extra_pip_requirementsを使用します。mlflow.sklearn.log_model(model, "sklearn-model", extra_pip_requirements = ["sklearn_req"])
コードの依存関係がある場合は、code_path を使用してそれらを指定できます。
mlflow.sklearn.log_model(model, "sklearn-model", code_path=["path/to/helper_functions.py"],)
デプロイ前の依存関係の検証と更新の詳細については、「 Model Serving のデプロイ前の検証」を参照してください。
想定と制限事項
注
このセクションの情報は、基盤モデルまたは外部モデルを提供するエンドポイントには適用されません。
以降のセクションでは、Model Serving を使用してカスタム モデルを提供するための既知の期待と制限事項について説明します。
エンドポイントの作成と更新での考慮事項
- デプロイ時間: 新しく登録されたモデル バージョンをデプロイするには、モデルとそのモデル環境をパッケージ化し、モデル エンドポイント自体をプロビジョニングする必要があります。 このプロセスには約 10 分かかる場合がありますが、モデルの複雑さ、サイズ、依存関係によっては時間がかかる場合があります。
- ダウンタイムなしの更新: Azure Databricks では、新しいエンドポイントの準備ができるまで既存のエンドポイント構成を維持することで、エンドポイントのダウンタイムゼロ更新が実行されます。 これにより、使用中のエンドポイントの中断のリスクが軽減されます。 この更新プロセスでは、移行が完了するまで、古いエンドポイント構成と新しいエンドポイント構成の両方に対して課金されます。
- 要求タイムアウト: モデルの計算に 297 秒を超える時間がかかる場合、要求はタイムアウトになります。
重要
Databricks は、既存の Model Serving エンドポイントで、ダウンタイムなしのシステム更新とメンテナンスを時折実行します。 メンテナンス中に、Databricks によってモデルが再読み込みされます。 モデルの再読み込みに失敗した場合、エンドポイントの更新は失敗としてマークされ、既存のエンドポイント構成は引き続き要求を処理します。 カスタマイズしたモデルが堅牢であり、いつでも再読み込みできることを確認します。
エンドポイントのスケーリングの期待
提供エンドポイントは、トラフィックとプロビジョニングされたコンカレンシー ユニットの容量に基づいて自動的にスケーリングされます。
- プロビジョニング済みコンカレンシー: システムが処理できる並列要求の最大数。 プロビジョニング済みコンカレンシー = 1 秒あたりのクエリ数 (QPS) * モデルの実行時間 (秒) の式を使用して、必要なコンカレンシーを見積もります。 コンカレンシー構成を検証するには、「 エンドポイントを提供するためのロード テスト」を参照してください。
- スケーリング動作: エンドポイントは、トラフィックが増加するとすぐにスケールアップし、トラフィックの減少に合わせて 5 分ごとにスケールダウンします。
- ゼロにスケーリング: ゼロへのスケールは、非アクティブな状態が 30 分続いた後にゼロにスケールダウンできるエンドポイントのオプション機能です。 ゼロにスケーリングした後の最初の要求では、"コールド スタート" が発生し、待機時間が長くなります。 通常、ゼロからのスケールアップには 10 ~ 20 秒かかりますが、数分かかる場合があります。 ゼロ遅延からのスケールに関する SLA は存在しません。
- ルートの最適化: QPS が高く、待機時間が短いユース ケースでは、パフォーマンスを向上させるための最適で推奨されるオプションが ルートの最適化 です。
- サーバーレス最適化デプロイ: エンドポイントのデプロイ速度を速くするには、 サーバーレス最適化デプロイを使用します。
Warnung
一貫したアップタイムまたは保証された応答時間を必要とする運用環境のワークロードには、ゼロにスケーリングしないでください。 継続的な可用性を必要とする待機時間の影響を受けやすいアプリケーションまたはエンドポイントの場合は、ゼロへのスケールを無効にします。
GPU ワークロードの制限事項
GPU ワークロードでエンドポイントを提供する場合の制限事項を次に示します:
- GPU サービス提供用のコンテナー イメージの作成は、モデル サイズと GPU で提供されるモデルのインストール要件の増加により、CPU サービスのイメージ作成よりも時間がかかります。
- 非常に大規模なモデルをデプロイする場合、コンテナーのビルドとモデル デプロイが 60 分の期間を超えると、デプロイ プロセスがタイムアウトする可能性があります。
- GPU サービスの自動スケールには、CPU サービスの場合よりも時間がかかります。
- ゼロにスケーリングする際の GPU 容量は保証されません。 GPU エンドポイントでは、ゼロへのスケーリング後の最初の要求の待機時間が長くなることが予想されます。
レガシモデルに関するAnacondaライセンス通知
注
このセクションは、MLflow v1.17 以前 (Databricks Runtime 8.3 ML 以前) でログに記録されたモデルにのみ適用されます。 新しいバージョンを使用している場合は、このセクションをスキップできます。
次の通知は、レガシ モデルで Anaconda に依存しているお客様向けです。
重要
Anaconda Inc. は、anaconda.org チャネルのサービス利用規約を更新しました。 Anaconda のパッケージ化と配布に依存している場合は、新しいサービス利用規約に基づいて商用ライセンスが必要になる場合があります。 詳細については、「Anaconda Commercial Edition の FAQ」を参照してください。 Anaconda チャネルの使用には、同社のサービス使用条件が適用されます。
v1.18 (Databricks Runtime 8.3 ML 以前) より前にログに記録された MLflow モデルは既定で、conda defaults チャネル (https://repo.anaconda.com/pkgs/) を依存関係としてログに記録されていました。 このライセンスの変更により、Databricks は MLflow v1.18 以降を使用してログに記録されたモデルの defaults チャネルの使用を停止しました。 ログに記録された既定のチャネルは現在、conda-forge であり、これはコミュニティで管理されている https://conda-forge.org/ を指しています。
モデルの conda 環境から defaults チャネルを除外 せずに MLflow v1.18 より前にモデルをログに記録した場合、そのモデルは意図していない defaults チャネルに依存している可能性があります。
モデルにこの依存関係があるかどうかを手動で確認するには、ログに記録されたモデルと共にパッケージ化された channel ファイル内での conda.yaml 値を調べることができます。 たとえば、conda.yaml チャネルの依存関係を持つモデルのdefaultsは次のようになります。
channels:
- defaults
dependencies:
- python=3.8.8
- pip
- pip:
- mlflow
- scikit-learn==0.23.2
- cloudpickle==1.6.0
name: mlflow-env
Databricks では、Anaconda リポジトリを使用してモデルを操作することが、Anaconda との関係の下で許可されているかどうか判断できないため、Databricks のお客様に変更を強制していません。 Databricks の使用による Anaconda.com リポジトリの使用が Anaconda の条件で許可されている場合は、何も行う必要はありません。
モデルの環境で使用されるチャネルを変更する場合は、新しい conda.yamlを使用してモデルをモデル レジストリに再登録できます。 これを行うには、conda_env の log_model() パラメーターでチャネルを指定します。
log_model() API の詳細については、使用しているモデル フレーバー (scikit-learn の log_model など) の MLflow ドキュメントを参照してください。
conda.yaml ファイルの詳細については、MLflow のドキュメントを参照してください。