本文說明使用 Mosaic AI 模型服務自訂模型的支援。 它提供支援的模型記錄選項和運算類型的詳細資訊、如何封裝模型相依性以進行服務,以及端點建立和擴展的預期。
什麼是自訂模型?
模型服務可以使用 CPU 或 GPU 運算資源,將任何 Python 模型或 自訂程式碼 部署為生產級 API。 Databricks 將這類模型稱為自訂模型。 這些 ML 模型可以使用 scikit-learn、XGBoost、PyTorch 和 HuggingFace 轉換器等標準 ML 庫來進行訓練,並可包含任何 Python 程式碼。
若要部署自訂模型,
- 使用原生 MLflow 內建變體或 pyfunc,以 MLflow 格式記錄模型或程式碼。
- 記錄模型之後,請在 Unity 目錄(建議)或工作區登錄中註冊模型。
- 您可以從這裡建立模型服務端點,以部署和查詢您的模型。
- 請參閱建立自訂模型服務端點
- 請參閱查詢自訂模型的服務端點。
如需如何在 Databricks 上提供自訂模型的完整教學課程,請參閱模型服務教學課程。
Databricks 也支援為產生式 AI 應用程式提供基礎模型,請參閱 基礎模型 API 和 外部模型,以了解支援的模型和計算選項。
記錄 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 目錄需要簽章。
以下是簽名範例:
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 進行部署時,您必須確定已設定程式碼,以便使用架構所提供的方法,在 GPU 上執行預測。 MLflow 會針對使用 PyTorch 或 Transformers 變體所記錄的模型自動執行此操作。
| 工作負載類型 | GPU 執行個體 | Memory |
|---|---|---|
CPU |
每個並行 4GB | |
GPU_SMALL |
1xT4 | 16 GB |
GPU_LARGE |
1xA100 | 80GB |
GPU_LARGE_2 |
2×A100 | 160GB |
GPU_LARGE_4 |
4xA100 | 320GB |
部署容器和相依性
在部署期間,會建置生產等級容器並部署為端點。 此容器包含 MLflow 模型中自動擷取或指定的媒體櫃。 基底映像可能包含一些系統層級相依性,但應用程式層級相依性必須在 MLflow 模型中明確指定。
如果模型中未包含所有必要的相依性,您可能會在部署期間遇到相依性錯誤。 在發生模型部署問題時,Databricks 建議您在本機測試模型。
套件和程式碼相依性
自訂或私人媒體櫃可以新增至您的部署。 請參閱搭配使用自訂 Python 媒體櫃與 Model Serving。
針對 MLflow 原生變體模型,系統會自動擷取必要的封裝相依性。
針對自訂 pyfunc 模型,可以明確新增相依性。 如需記錄需求和最佳做法的詳細資訊,請參閱 MLflow 模型檔 和 MLflow Python API 參考。
可以使用下列方式來新增封裝相依性:
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"],)
關於在部署前驗證與更新相依關係的資訊,請參閱 模型服務的預部署驗證。
期望和限制
注意
本節中的資訊不適用於為基礎模型或外部模型提供服務的端點。
下列各節說明使用 Model Serving 來為自訂模型提供服務的已知預期和限制。
端點建立和更新期望
- 部署時間:部署新註冊的模型版本涉及封裝模型及其模型環境,以及佈建模型端點本身。 此程序可能需要大約 10 分鐘,但可能需要更長的時間,視模型複雜性、大小和相依性而定。
- 零停機時間更新:Azure Databricks 會讓現有的端點設定保持正常,直到新的端點設定準備就緒為止,來執行端點的零停機時間更新。 這樣做可降低使用中端點中斷的風險。 在此更新程序期間,您需要支付舊端點和新端點組態的費用,直到轉換完成為止。
- 請求逾時:如果模型計算時間超過 297 秒,請求將會逾時。
重要
Databricks 會在現有的 Model Serving 端點上偶爾執行零停機系統更新和維護。 在維護期間,Databricks 會重新載入模型。 如果模型無法重新載入,則端點更新會標示為失敗,而現有的端點組態會繼續處理請求。 請確定您的自訂模型堅固耐用,而且可以隨時重載。
端點調整預期
服務端點會根據流量和已佈建的並行單位的容量自動調整。
- 佈建的並行:系統可處理的平行要求數目上限。 使用公式估計所需的並行:佈建的並行 = 每秒查詢數 (QPS) * 模型執行時間 (秒)。 若要驗證您的並行設定,請參閱 服務端點的負載測試。
- 調整行為:隨著流量的增加,端點幾乎會立即擴大,並且每五分鐘縮小一次以匹配減少的流量。
- 縮放到零: 擴展到零是端點的可選功能,允許它們在閒置 30 分鐘後縮減到零。 擴展到零後的第一個請求會經歷「冷啟動」,導致更高的延遲。 從零開始擴展通常需要 10-20 秒,但有時可能需要幾分鐘。 在零延遲的條件下,沒有任何 SLA 規範。
- 路線優化: 對於高 QPS 和低延遲使用案例, 路由最佳化 是改善效能的最佳且建議的選項。
- 無伺服器優化部署: 為了更快的端點部署速度,建議使用 無伺服器優化的部署。
警告
「擴展至零」不應用於需要一致運作時間或保證回應時間的生產工作負載。 對於需要持續可用性的延遲敏感應用程式或端點,請停用擴展至零。
GPU 工作負載限制
以下是使用 GPU 工作負載來服務端點的限制:
- 由於模型大小和 GPU 上所服務的模型安裝需求增加,GPU 服務的容器映像建立所花費的時間比 CPU 服務的映像建立時間長。
- 部署非常大的模型時,如果容器組建和模型部署超過 60 分鐘的持續時間,部署過程可能會逾時。
- GPU 服務的自動調整需要比 CPU 服務更長的時間。
- 調整為零時,不能保證 GPU 容量。 在調整為零之後,GPU 端點可能預期第一個要求會有額外的高延遲。
舊版型號的 Anaconda 授權通知
注意
本節僅適用於使用 MLflow v1.17 或更早版本 (Databricks Runtime 8.3 ML 或更早版本) 記錄的模型。 如果您使用的是較新的版本,則可以略過本節。
以下通知適用於依賴 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 不會強制客戶進行任何變更。 如果您通過使用 Databricks 在 Anaconda 條款下使用 Anaconda.com 存放庫是被允許的,那麼您就不需要採取任何動作。
如果您想要變更模型環境中所使用的通道,您可以使用新的 conda.yaml將模型重新登錄至模型登錄。 你可以藉由在 conda_env 的參數 log_model() 指定頻道來執行此動作。
如需 log_model() API 的詳細資訊,請參閱你正在使用模型類別的 MLflow 文件,例如 scikit-learn 的 log_model。
如需有關 conda.yaml 檔案的詳細資訊,請參閱 MLflow 文件。