部署自訂模型
本文說明使用 Mosaic AI Model Serving 部署自訂模型的支援。 它也提供有關支援的模型記錄選項和計算類型、如何封裝模型相依性以提供服務,以及端點建立和調整的詳細資訊。
什麼是自訂模型?
Model Serving 可以將任何 Python 模型部署為生產等級 API。 Databricks 將這類模型稱為自訂模型。 這些 ML 模型可以使用 scikit-learn、XGBoost、PyTorch 和 HuggingFace 轉換器等標準 ML 庫來進行訓練,並可包含任何 Python 程式碼。
若要部署自訂模型,
- 使用原生 MLflow 內建變體或 pyfunc,以 MLflow 格式記錄模型或程式碼。
- 記錄模型之後,請在 Unity Catalog (建議) 或工作區登錄中註冊它。
- 您可以從這裡建立模型服務端點,以部署和查詢您的模型。
- 請參閱建立自訂模型服務端點
- 請參閱查詢自訂模型的服務端點。
如需如何在 Databricks 上提供自訂模型的完整教學課程,請參閱模型服務教學課程。
Databricks 也支援為產生式 AI 應用程式提供基礎模型,請參閱 基礎模型 API 和 外部模型,以了解支援的模型和計算選項。
重要
如果您依賴 Anaconda,請檢閱服務條款通知以了解其他資訊。
記錄 ML 模型
有不同的方法可以記錄 ML 模型以提供模型服務。 下列 list 摘要說明支援的方法和範例。
自動記錄 - 使用適用於 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)
計算類型
Mosaic AI Model Serving 提供各種不同的 CPU 和 GPU 選項來部署模型。 使用 GPU 進行部署時,您必須確定您的程式代碼已 set,以便使用架構所提供的方法來在 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 API 和 MLflow CLI。
可以使用其中一個 API 來指定下列內容。
- 部署至模型服務之模型的
model_uri
。 - 下列其中之一:
- 模型的
input_data
呼叫之預期格式的mlflow.pyfunc.PyFuncModel.predict()
。 -
input_path
,它可定義檔案,其中包含將載入並用於呼叫predict
的輸入資料。
- 模型的
- 格式為
content_type
或csv
的json
。 - 可選用的
output_path
,用於將預測寫入檔案。 如果忽略此參數,預測會列印至stdout
。 - 環境管理工具
env_manager
,用來建置提供服務的環境:- 預設值為
virtualenv
。 建議用於服務驗證。 -
local
可供使用,但在進行服務驗證時可能會出錯。 通常僅用於快速偵錯。
- 預設值為
- 是否使用
install_mlflow
在虛擬環境中安裝您環境中目前版本的 MLflow。 此設定預設為False
。 - 是否進行 update 操作,並測試不同版本的套件相依關係,以便進行疑難排解或偵錯。 您可以使用覆寫參數將此指定為字串相依性覆寫或新增專案的 list,
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 中 update 需求,而不需 having 來記錄另一個模型。
下列範例示範如何就地 update 記錄模型 pip_requirements.txt
。
您可以使用指定的套件版本來update現有的定義,或者將不存在的需求新增至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 來為自訂模型提供服務的已知預期和限制。
端點建立和 update 預期
注意
本節中的資訊不適用於為基礎模型或外部模型提供服務的端點。
部署新註冊的模型版本涉及到封裝模型及其模型環境,以及佈建模型端點本身。 此流程大約需要 10 分鐘。
Azure Databricks 透過維持現有的端點組態直至新組態就緒,以實現端點的零停機 update。 這樣做可降低使用中端點中斷的風險。
如果模型計算花費的時間超過 120 秒,要求將會逾時。如果您認為模型計算需要超過 120 秒的時間,請連絡您的 Azure Databricks 帳戶團隊。
Databricks 會在現有的 Model Serving 端點上偶爾執行零停機系統更新和維護。 在維護期間,Databricks 會重載模型,並在模型無法重載時,將端點標示為失敗。 請確定您的自訂模型堅固耐用,而且可以隨時重載。
端點調整預期
注意
本節中的資訊不適用於為基礎模型或外部模型提供服務的端點。
服務端點會根據流量和已佈建的並行單位的容量自動調整。
- 佈建的並行:系統可處理的平行要求數目上限。 使用公式估計所需的並行:佈建的並行 = 每秒查詢數 (QPS) * 模型執行時間 (秒)。
- 調整行為:隨著流量的增加,端點幾乎會立即擴大,並且每五分鐘縮小一次以匹配減少的流量。
- 調整為零:端點在非使用狀態 30 分鐘後會縮小為零。 調整為零之後的第一個要求會經歷「冷啟動」,這會導致較高的延遲。 對於延遲敏感型應用程式,應考慮可有效管理此功能的策略。
GPU 工作負載限制
以下是使用 GPU 工作負載來服務端點的限制:
由於模型大小和 GPU 上所服務的模型安裝需求增加,GPU 服務的容器映像建立所花費的時間比 CPU 服務的映像建立時間長。
部署非常大的模型時,如果容器組建和模型部署超過 60 分鐘的持續時間,部署過程可能會逾時。 如果發生這種情況,請重新嘗試該過程。 重試應該會成功部署模型。
GPU 服務的自動調整需要比 CPU 服務更長的時間。
調整為零時,不能保證 GPU 容量。 在調整為零之後,GPU 端點可能預期第一個要求會有額外的高延遲。
northcentralus
中無法使用此功能。
Anaconda 授權 update
下列通知適用於依賴 Anaconda 的客戶。
重要
Anaconda Inc. 已更新其 anaconda.org 頻道的服務條款。 根據新服務條款,如果你依賴 Anaconda 的套件和散發,你可能需要商業授權。 如需詳細資訊,請參閱 Anaconda 商業版本常見問題集。 你使用任何 Anaconda 通道都會受到其服務條款的規範。
在 v1.18 之前記錄的 MLflow 模型(Databricks 執行階段 8.3 ML 或更早版本)預設會以 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
值。 例如,具有 conda.yaml
頻道相依性的 defaults
模型可能如下所示:
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_env
的參數 log_model()
指定頻道來執行此動作。
如需 log_model()
API 的詳細資訊,請參閱你正在使用模型類別的 MLflow 文件,例如 scikit-learn 的 log_model。
如需有關 conda.yaml
檔案的詳細資訊,請參閱 MLflow 文件。