Model Serving を使用して Python コードをデプロイする
この記事では、Model Serving を使用して Python コードをデプロイする方法について説明します。
MLflow の Python 機能である pyfunc
は、任意の Python コードまたは Python モデルをデプロイできる柔軟性を提供します。 このガイドを使用するシナリオの例を次に示します。
- 入力をモデルの予測関数に渡すには、モデルを前処理する必要があります。
- お使いのモデル フレームワークは、MLflow でネイティブにサポートされていません。
- アプリケーションでモデルの生出力を使用するには後処理が必要になります。
- モデル自体には、要求ごとの分岐ロジックがあります。
- 完全にカスタムなコードをモデルとしてデプロイすることを目指しています。
カスタム MLflow Python 関数モデルを構築する
MLflow には、カスタム Python モデル形式で Python コードをログに記録する機能が用意されています。
Mlflow を使用して任意の Python コードをパッケージ化する場合、以下の 2 つの関数が必要になります。
load_context
- モデルが作動するために 1 回だけ読み込む必要があるものはすべて、この関数に定義する必要があります。 推論を高速化するpredict
関数の最中に読み込まれる成果物の数を最小限に抑えるためにこれは非常に重要です。predict
- この関数には、入力が要求されるたびに実行されるあらゆるロジックが含まれています。
Python 関数モデルをログに記録する
カスタム コードでモデルを記述している場合でも、組織で共有しているコード モジュールを使用できます。 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 Catalog またはワークスペース レジストリに登録し、Model Serving エンドポイントにモデルを提供できます。
ノートブックの例
次のノートブックの例では、クエリ対象モデルの生出力を使用のために後処理する必要があるとき、モデル出力をカスタマイズする方法を示します。