Skip to content

將 MLflow 模型部署到 Kubernetes

使用 MLServer 作為推論伺服器

預設情況下,MLflow 部署使用 Flask(廣泛使用的 Python WSGI Web 應用程式框架)來服務推論端點。然而,Flask 主要是為輕量級應用程式設計的,可能不適合大規模生產用例。為了彌補這一差距,MLflow 與 MLServer 整合作為替代部署選項,後者在 Seldon CoreKServe 等 Kubernetes 原生框架中用作核心 Python 推論伺服器。

使用 MLServer,您可以利用 Kubernetes 的可擴充性和可靠性來大規模為您的模型提供服務。請參閱Serving Framework,以了解 Flask 和 MLServer 之間的詳細比較,以及為什麼 MLServer 是 ML 生產用例的更好選擇。

Serving Frameworks 比較

預設情況下,MLflow 使用 Flask(一個用於 Python 的輕量級 WSGI Web 應用程式框架)來服務推論端點。然而,Flask 主要是為輕量級應用程式設計的,可能不適合大規模生產用例。為了解決這一差距,MLflow 與 MLServer 整合作為替代服務引擎。 MLServer 透過利用非同步請求/回應範例和工作負載卸載來實現更高的效能和可擴充性。此外,MLServer 也用作 Seldon Core 和 KServe 等 Kubernetes 原生框架中的核心 Python 推論伺服器,因此它提供了金絲雀部署和開箱即用自動擴展等高級功能。

Flask MLServer
Use Case 輕量級目的,包括本地測試。 高規模生產環境。
Set Up Flask 預設隨 MLflow 一起安裝。 需要單獨安裝。
Performance 適合輕量級應用程序,但未針對高效能進行最佳化,如 WSGI 應用程式。 WSGI 是基於同步請求/回應範例,由於阻塞性質,這對於 ML 工作負載來說並不理想。機器學習預測通常涉及大量計算,並且可能需要很長時間才能完成,因此在處理請求時阻塞伺服器並不理想。雖然 Flask 可以透過 Uvicorn 等非同步框架進行增強,但 MLflow 並不支援它們開箱即用,而只是使用 Flask 的預設同步行為。 專為高性能機器學習工作負載而設計,通常可提供更好的吞吐量和效率。 MLServer 支援非同步請求/回應範例,透過將 ML 推理工作負載卸載到單獨的工作池(進程),以便伺服器可以在處理推理時繼續接受新請求。請參閱 MLServer Parallel Inference 以了解有關它們如何實現這一點的更多詳細資訊。此外,MLServer 支援自適應 Bacthing,可以透明地批量處理請求,以提高吞吐量和效率。
Scalability 出於與性能相同的原因,本質上不具有可擴展性。 除了上述的平行推理的支援之外,MLServer 還被用作 Kubernetes 原生框架(例如 Seldon Core 和 KServe(以前稱為 KFServing))中的核心推理伺服器。透過使用 MLServer 將 MLflow 模型部署到 Kubernetes,您可以利用這些框架的進階功能(例如自動縮放)來實現高可擴充性。

為 MLflow 模型建立 Docker 鏡像

將 MLflow 模型部署到 Kubernetes 的基本步驟是建立包含 MLflow 模型和推論伺服器的 Docker 鏡像。這可以透過 build-docker CLI 命令或 Python API 來完成。

mlflow models build-docker -m runs:/<run_id>/model -n <image_name> --enable-mlserver

mlflow models build-docker -m models:/<model_name>/<version> -n <image_name> --enable-mlserver

如果您想使用基本的 Flask 伺服器而不是 MLServer,請刪除 --enable-mlserver 標誌。有關其他選項,請參閱 build-docker 命令文件。

build-docker

使用 python_function 風格建立一個 Docker 映像,其預設入口點在連接埠 8080 處提供 MLflow 模型。如果在呼叫 build-docker 時指定,容器將提供 --model-uri 引用的模型。如果在呼叫 build_docker 時未指定 --model-uri,則必須將 MLflow Model 目錄作為磁碟區安裝到容器中的 /opt/ml/model 目錄中。

使用 --model-uri 建置 Docker 映像:

# Build a Docker image named 'my-image-name' that serves the model from run 'some-run-uuid'
# at run-relative artifact path 'my-model'
mlflow models build-docker --model-uri "runs:/some-run-uuid/my-model" --name "my-image-name"


# Serve the model
docker run -p 5001:8080 "my-image-name"

建置不含 --model-uri 的 Docker 映像:

# Build a generic Docker image named 'my-image-name'
mlflow models build-docker --name "my-image-name"

# Mount the model stored in '/local/path/to/artifacts/model' and serve it
docker run --rm -p 5001:8080 -v /local/path/to/artifacts/model:/opt/ml/model "my-image-name"

Options:

  • -m, --model-uri <URI> 模型的 URI。local path、'runs:/' URI、'models:/{model_name}/{version}' 或遠端儲存 URI(例如 's3://' URI)。
  • -n, --name <name> 用於建立映像的名稱
    • local 使用本地環境
    • virtualenv 使用 virtualenv (和 pyenv 用於 Python 版本管理)
    • conda 使用 conda

    --env-manager <env_manager> 如果指定,則使用指定的環境管理器為 MLmodel 建立環境。支援以下值:

    如果未指定,則預設為 virtualenv

  • --enable-mlserver 透過 v2 推理協定啟用 MLServer 服務。您可以使用環境變數來設定 MLServer。

generate-dockerfile

產生一個目錄並構建一個 Dockerfile (其預設入口點使用 python_function 風格在連接埠 8080 處提供 MLflow 模型)。產生的 Dockerfile 與模型(如果指定)一起寫入指定的輸出目錄。此 Dockerfile 定義了一個與 mlflow 模型 build-docker 產生的映像等效的映像。

mlflow models generate-dockerfile [OPTIONS]

Options:

  • -m, --model-uri <URI> 模型的 URI。local path、'runs:/' URI、'models:/{model_name}/{version}' 或遠端儲存 URI(例如 's3://' URI)。
  • -d, --output-directory <output_director> 儲存產生的 Dockerfile 的輸出目錄。
    • local 使用本地環境
    • virtualenv 使用 virtualenv (和 pyenv 用於 Python 版本管理)
    • conda 使用 conda

    --env-manager <env_manager> 如果指定,則使用指定的環境管理器為 MLmodel 建立環境。支援以下值:

    如果未指定,則預設為 virtualenv

  • --enable-mlserver 透過 v2 推理協定啟用 MLServer 服務。您可以使用環境變數來設定 MLServer。

import mlflow

mlflow.models.build_docker(
    model_uri=f"runs:/{run_id}/model",
    name="<image_name>",
    enable_mlserver=True,
)

如果您想使用基本的 Flask 伺服器而不是 MLServer,請刪除 enable_mlserver=True。有關其他選項,請參閱 mlflow.models.build_docker 函數文件。

部署步驟

請參閱以下合作夥伴文檔,以了解如何使用 MLServer 將 MLflow 模型部署到 Kubernetes。您也可以按照下面的教學來學習端到端的流程,包括環境設定、模型訓練和部署。