Share via


部署自定義模型

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

什麼是自定義模型?

模型服務可以將任何 Python 模型部署為生產等級 API。 Databricks 是指這類模型,例如 自定義模型。 這些 ML 模型可以使用 scikit-learn、XGBoost、PyTorch 和 HuggingFace 轉換器等標準 ML 連結庫來定型,並可包含任何 Python 程式代碼。

若要部署 自定義模型

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

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

Databricks 也支援為產生式 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())
    

簽章和輸入範例

建議將簽章和輸入範例新增至 MLflow。 將模型記錄至 Unity 目錄需要簽章。

以下是簽章範例:

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 模型服務處於公開預覽狀態。

Databricks 模型服務提供各種不同的 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 連結庫。

針對 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,可讓您驗證模擬部署環境的模型成品,並允許測試已修改的相依性。

MLflow Python API 和 MLflow CLI 有兩個預先部署驗證 API。

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

  • model_uri部署至模型服務之模型的 。
  • 下列其中之一:
    • input_data,其為模型呼叫的預期格式mlflow.pyfunc.PyFuncModel.predict()
    • input_path,定義檔案,其中包含將載入並用於呼叫 predict的輸入數據。
  • csvcontent_typejson 格式的 。
  • 選擇性 output_path 的 ,將預測寫入檔案。 如果您省略此參數,預測會列印至 stdout
  • 環境管理員 env_manager,用來建置環境來提供服務:
    • 預設值為 virtualenv。 建議用於提供驗證。
    • local 可供使用,但可能會發生錯誤,以便提供驗證。 通常僅用於快速偵錯。
  • 是否要使用 來安裝環境中目前版本的 MLflow,以及使用 install_mlflow的虛擬環境。 這個設定預設為 False
  • 是否要更新及測試不同版本的套件相依性,以進行疑難解答或偵錯。 您可以使用 override 自變數 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.models.model.update_model_requirements() MLflow Python API 中更新需求,而不需要記錄另一個模型。

下列範例示範如何就地更新 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"],
)

期望和限制

下列各節說明使用模型服務來為自定義模型提供服務的已知期望和限制。

端點建立和更新預期

注意

本節中的資訊不適用於提供基礎模型的端點。

部署新註冊的模型版本牽涉到封裝模型及其模型環境,以及布建模型端點本身。 此程式可能需要大約10分鐘的時間。

Azure Databricks 會藉由將現有的端點組態保持在就緒狀態,以執行端點的零停機時間更新。 這樣做可降低使用中端點中斷的風險。

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

Databricks 會在現有的模型服務端點上執行偶爾的零停機時間系統更新和維護。 在維護期間,Databricks 會重載模型,並在模型無法重載時,將端點標示為失敗。 請確定您的自定義模型是健全的,而且可以隨時重載。

端點調整預期

注意

本節中的資訊不適用於提供基礎模型的端點。

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

  • 布建的並行存取: 系統可處理的平行要求數目上限。 使用公式估計所需的並行:布建的並行 = 每秒查詢數 (QPS) * 模型運行時間 (s)。
  • 調整行為: 端點幾乎會立即相應增加,增加流量,每五分鐘相應減少一次,以符合減少的流量。
  • 調整為零: 端點可以在閑置 30 分鐘後相應減少為零。 調整為零之後的第一個要求會經歷「冷啟動」,導致延遲較高。 對於延遲敏感的應用程式,請考慮有效管理這項功能的策略。

GPU 工作負載限制

以下是使用 GPU 工作負載提供端點的限制:

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

Anaconda 授權更新

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

重要

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

在 v1.18 之前記錄的 MLflow 模型(Databricks Runtime 8.3 ML 或更早版本)預設會以 conda defaults 通道 (https://repo.anaconda.com/pkgs/) 記錄為相依性。 由於此授權變更,Databricks 已停止針對使用 MLflow v1.18 和更新版本記錄的模型使用 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 條款下允許使用 Anaconda.com 存放庫,您就不需要採取任何動作。

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

如需 API 的詳細資訊 log_model() ,請參閱您正在使用之模型類別的 MLflow 檔, 例如 scikit-learn log_model。

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

其他資源