この記事では、カスタマイズしたPython コードを Model Serving でデプロイする方法について説明します。 この記事の例では、モデルに前処理ロジックと後処理ロジックを追加してデプロイするためのガイダンスを提供することに重点を置いています。
MLflow の Python 関数 ( pyfunc) では、任意の Python コードまたは任意の Python モデルを柔軟にデプロイできます。 ガイドを使用するシナリオの例を次に示します。
- モデルの予測関数に入力を渡す前に、モデルの前処理が必要です。
- モデル フレームワークは、MLflow でネイティブにサポートされていません。
- アプリケーションでは、モデルの生出力を後処理して使用する必要があります。
- モデル自体には、要求ごとの分岐ロジックがあります。
- 完全にカスタムコードをモデルとしてデプロイしようとしている。
カスタム MLflow Python 関数モデルを構築する
MLflow では、カスタム Python モデル形式のを使用して Python コードをログに記録できます。
MLflow を使用して任意の Python コードをパッケージ化するときに必要な関数は 2 つあります。
-
load_context- モデルが動作するために 1 回だけ読み込む必要があるものは、この関数で定義する必要があります。 これは、推論を高速化するpredict関数中に読み込まれるアーティファクトの数をシステムが最小限に抑えるために重要です。 -
predict- この関数には、入力要求が行われるたびに実行されるすべてのロジックが含まれます。
手記
カスタム コードをモデルとしてデプロイする前に、モデルが提供できることを確認することをお勧めします。
mlflow.models.predict を使用して、デプロイ 前にモデルを検証する方法については、MLflow のドキュメントを参照してください。
Python 関数モデルをログに記録する
Important
Databricks Runtime の ML ランタイムには、完全な mlflow パッケージではなく、既定で mlflow-skinny が含まれています。
pyfuncを指定せずにこれらのランタイムのいずれかにpip_requirements モデルをログに記録すると、MLflow はモデルのmlflow-skinny内のconda.yamlをキャプチャします。 Model Serving では、mlflowにmlflow-skinny (conda.yamlではない) が必要であり、それ以外の場合はコンテナー イメージをビルドできません。 Databricks Runtime ML で mlflow.pyfunc.log_model() を呼び出す際は、常に pip_requirements で mlflow==<version> を指定してください:
# DBR ML ships with mlflow-skinny by default, so specify mlflow explicitly
# to ensure Model Serving compatibility.
mlflow.pyfunc.log_model(
name="model",
python_model=your_model,
pip_requirements=["mlflow==3.8.1"], # use mlflow, not mlflow-skinny
registered_model_name="catalog.schema.model_name",
)
カスタム コードを使用してモデルを記述している場合でも、組織のコードの共有モジュールを使用できます。
code_path パラメーターを使用すると、モデルの作成者は、パスに読み込まれる完全なコード参照をログに記録でき、他のカスタム pyfunc モデルから使用できます。
たとえば、モデルがログに記録される場合は、次のようになります。
mlflow.pyfunc.log_model(CustomModel(), "model", code_path = ["preprocessing_utils/"])
preprocessing_utils のコードは、モデルの読み込まれたコンテキストで使用できます。 このコードを使用するモデルの例を次に示します。
class CustomModel(mlflow.pyfunc.PythonModel):
def load_context(self, context):
self.model = torch.load(context.artifacts["model-weights"])
from preprocessing_utils.my_custom_tokenizer import CustomTokenizer
self.tokenizer = CustomTokenizer(context.artifacts["tokenizer_cache"])
def format_inputs(self, model_input):
# insert some code that formats your inputs
pass
def format_outputs(self, outputs):
predictions = (torch.sigmoid(outputs)).data.numpy()
return predictions
def predict(self, context, model_input):
model_input = self.format_inputs(model_input)
outputs = self.model.predict(model_input)
return self.format_outputs(outputs)
モデルを提供する
カスタム pyfunc モデルをログに記録した後、それを Unity カタログまたはワークスペース レジストリに登録し、モデルを Model Serving エンドポイントに提供できます。
ノートブックの例
次のノートブックの例では、クエリ対象モデルの生出力を後処理して使用する必要がある場合に、モデル出力をカスタマイズする方法を示します。
MLflow PyFunc ノートブックを使用して出力を提供するモデルをカスタマイズする
ノートブック を取得する