モデルサービングで Python コードをデプロイする

この記事では、 モデルサービングを使用して 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 またはワークスペース レジストリに登録し、モデル サービング エンドポイントにモデルを提供できます。

ノートブックの例

次のノートブックの例は、クエリー モデルの生の出力を後処理して使用する必要がある場合に、モデル出力をカスタマイズする方法を示しています。

MLflow PyFunc ノートブック を使用したモデル提供出力のカスタマイズ

ノートブックを新しいタブで開く