共用方式為


部署自訂模型

本文說明使用 Mosaic AI Model Serving 部署自訂模型的支援。 它也提供有關支援的模型記錄選項和計算類型、如何封裝模型相依性以提供服務,以及端點建立和調整的詳細資訊。

什麼是自訂模型?

Model Serving 可以將任何 Python 模型部署為生產等級 API。 Databricks 將這類模型稱為自訂模型。 這些 ML 模型可以使用 scikit-learn、XGBoost、PyTorch 和 HuggingFace 轉換器等標準 ML 庫來進行訓練,並可包含任何 Python 程式碼。

若要部署自訂模型

  1. 使用原生 MLflow 內建變體pyfunc,以 MLflow 格式記錄模型或程式碼。
  2. 記錄模型之後,請在 Unity Catalog (建議) 或工作區登錄中註冊模型。
  3. 您可以從這裡建立模型服務端點,以部署和查詢您的模型。
    1. 請參閱建立自訂模型服務端點
    2. 請參閱查詢自訂模型的服務端點

如需如何在 Databricks 上提供自訂模型的完整教學課程,請參閱模型服務教學課程

Databricks 也支援為生成式 AI 應用程式提供生成式 AI 模型,請參閱基礎模型 API外部模型,以了解支援的模型和計算服務。

重要

如果您依賴 Anaconda,請檢閱服務條款通知以了解其他資訊。

記錄 ML 模型

有不同的方法可以記錄 ML 模型以提供模型服務。 下列清單摘要說明支援的方法和範例。

  • 自動記錄 - 使用適用於 ML 的 Databricks Runtime 時,會自動啟用此方法。

    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)

計算類型

注意

GPU 模型服務處於公開預覽狀態。

Mosaic AI Model Serving 提供各種不同的 CPU 和 GPU 選項來部署模型。 使用 GPU 進行部署時,請務必確定已設定程式碼,以便使用架構所提供的方法,在 GPU 上執行預測。 MLflow 會針對使用 PyTorch 或 Transformers 變體所記錄的模型自動執行此操作。

工作負載類型 GPU 執行個體 記憶體
CPU 每個並行 4GB
GPU_SMALL 1xT4 16 GB
GPU_LARGE 1xA100 80GB
GPU_LARGE_2 2xA100 160GB

部署容器和相依性

在部署期間,會建置生產等級容器並部署為端點。 此容器包含 MLflow 模型中自動擷取或指定的媒體櫃。

模型服務容器不包含預安裝的相依性,如果模型中未包含所有必要的相依性,可能會導致相依性錯誤。 在發生模型部署問題時,Databricks 建議您在本機測試模型。

套件和程式碼相依性

自訂或私人媒體櫃可以新增至您的部署。 請參閱搭配使用自訂 Python 媒體櫃與 Model Serving

針對 MLflow 原生變體模型,系統會自動擷取必要的封裝相依性。

針對自訂 pyfunc 模型,可以明確新增相依性。

可以使用下列方式來新增封裝相依性:

  • 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"],)

相依性驗證

在部署自訂 MLflow 模型之前,驗證能夠為模型提供服務是有益的。 MLflow 提供 API,它允許模型成品的驗證,該模型成品既能模擬部署環境,又允許測試已修改的相依性。

有兩個部署前驗證 API,即 MLflow Python APIMLflow CLI

可以使用其中一個 API 來指定下列內容。

  • 部署至模型服務之模型的 model_uri
  • 下列其中之一:
    • 模型的 mlflow.pyfunc.PyFuncModel.predict() 呼叫之預期格式的 input_data
    • input_path,它可定義檔案,其中包含將載入並用於呼叫 predict 的輸入資料。
  • 格式為 csvjsoncontent_type
  • 可選用的 output_path,用於將預測寫入檔案。 如果忽略此參數,預測會列印至 stdout
  • 環境管理工具 env_manager,用來建置提供服務的環境:
    • 預設值為 virtualenv。 建議用於服務驗證。
    • local 可供使用,但在進行服務驗證時可能會出錯。 通常僅用於快速偵錯。
  • 是否使用 install_mlflow 在虛擬環境中安裝您環境中目前版本的 MLflow。 此設定預設為 False
  • 是否更新及測試不同版本的封裝相依性,以進行疑難排解或偵錯。 您可以使用引數 pip_requirements_override,將其指定為字串相依性覆寫或新增清單。

例如:

import mlflow

run_id = "..."
model_uri = f"runs:/{run_id}/model"

mlflow.models.predict(
  model_uri=model_uri,
  input_data={"col1": 34.2, "col2": 11.2, "col3": "green"},
  content_type="json",
  env_manager="virtualenv",
  install_mlflow=False,
  pip_requirements_override=["pillow==10.3.0", "scipy==1.13.0"],
)

相依性更新

如果記錄模型所指定的相依性發生任何問題,可以使用 MLflow CLI 或 MLflow Python API 中的 mlflow.models.model.update_model_requirements() 來更新需求,而不需要記錄另一個模型。

下列範例示範如何就地更新記錄模型的 pip_requirements.txt

可以使用指定的套件版本來更新現有定義,或將不存在的需求新增至 pip_requirements.txt 檔案。 此檔案位於指定 model_uri 位置的 MLflow 模型成品內。

from mlflow.models.model import update_model_requirements

update_model_requirements(
  model_uri=model_uri,
  operation="add",
  requirement_list=["pillow==10.2.0", "scipy==1.12.0"],
)

期望和限制

下列各節說明使用 Model Serving 來為自訂模型提供服務的已知預期和限制。

端點建立和更新預期

注意

本節中的資訊不適用於為基礎模型或外部模型提供服務的端點。

部署新註冊的模型版本涉及到封裝模型及其模型環境,以及佈建模型端點本身。 此流程大約需要 10 分鐘。

Azure Databricks 會保持現有的端點組態,直到新組態就緒,來執行端點的零停機更新。 這樣做可降低使用中端點中斷的風險。

如果模型計算花費的時間超過 120 秒,要求將會逾時。如果您認為模型計算需要超過 120 秒的時間,請連絡您的 Azure Databricks 帳戶團隊。

Databricks 會在現有的 Model Serving 端點上偶爾執行零停機系統更新和維護。 在維護期間,Databricks 會重載模型,並在模型無法重載時,將端點標示為失敗。 請確定您的自訂模型堅固耐用,而且可以隨時重載。

端點調整預期

注意

本節中的資訊不適用於為基礎模型或外部模型提供服務的端點。

服務端點會根據流量和已佈建的並行單位的容量自動調整。

  • 佈建的並行:系統可處理的平行要求數目上限。 使用公式估計所需的並行:佈建的並行 = 每秒查詢數 (QPS) * 模型執行時間 (秒)。
  • 調整行為:隨著流量的增加,端點幾乎會立即擴大,並且每五分鐘縮小一次以匹配減少的流量。
  • 調整為零:端點在非使用狀態 30 分鐘後會縮小為零。 調整為零之後的第一個要求會經歷「冷啟動」,這會導致較高的延遲。 對於延遲敏感型應用程式,應考慮可有效管理此功能的策略。

GPU 工作負載限制

以下是使用 GPU 工作負載來服務端點的限制:

  • 由於模型大小和 GPU 上所服務的模型安裝需求增加,GPU 服務的容器映像建立所花費的時間比 CPU 服務的映像建立時間長。
  • 部署非常大的模型時,如果容器組建和模型部署超過 60 分鐘的持續時間,部署過程可能會逾時。 如果發生這種情況,重新嘗試該過程應該可成功部署模型。
  • GPU 服務的自動調整需要比 CPU 服務更長的時間。
  • 調整為零時,不能保證 GPU 容量。 在調整為零之後,GPU 端點可能預期第一個要求會有額外的高延遲。
  • northcentralus 中無法使用此功能。

Anaconda 授權更新

下列通知適用於依賴 Anaconda 的客戶。

重要

Anaconda Inc. 更新了其 anaconda.org 通道的服務條款。 根據新的服務條款,如果您依賴 Anaconda 的封裝和散發,則可能需要商業授權。 如需詳細資訊,請參閱 Anaconda 商業版本常見問題。 您使用任何 Anaconda 通道會受到其服務條款的約束。

v1.18 (Databricks Runtime 8.3 ML 或更早版本) 之前記錄的 MLflow 模型預設以 conda defaults 通道 (https://repo.anaconda.com/pkgs/) 作為相依性進行記錄。 由於此授權變更,對於使用 MLflow v1.18 和更高版本記錄的模型,Databricks 已停止使用 defaults 通道。 記錄的預設通道現在是 conda-forge,它指向社群管理的 https://conda-forge.org/

如果您在 MLflow v1.18 之前記錄模型,但未從模型的 conda 環境中排除 defaults 通道,則該模型可能相依於您未預期的 defaults 通道。 若要手動確認模型是否具有此相依性,您可以檢查使用記錄的模型封裝的 channel 檔案中的 conda.yaml 值。 例如,具有 defaults 通道相依性之模型的 conda.yaml 可能如下所示:

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 不會強制其客戶進行任何變更。 如果 Anaconda 條款允許透過使用 Databricks 來使用 Anaconda.com 存放庫,您就不需要採取任何動作。

如果您想要變更模型環境中所使用的通道,則可以使用新的 conda.yaml 將模型重新註冊至模型登錄。 可以透過在 conda_envlog_model() 參數中指定通道來執行此動作。

如需有關 log_model() API 的詳細資訊,請參閱您正在使用之模型變體的 MLflow 文件,例如 log_model for scikit-learn

如需有關 conda.yaml 檔案的詳細資訊,請參閱 MLflow 文件

其他資源