聊天視窗

掌握時序預測:Python 與統計學的實務指南 - 第 9 章

第九章 線上部署與持續迭代:將預測模型搬進實際業務

發布於 2026-02-21 14:53

# 第九章 線上部署與持續迭代:將預測模型搬進實際業務 > **前言** > 在上一章,我們已經建立起完整的模型治理與監控機制,接下來要談的是「如何把實驗室裡的模型,真正放進業務流,並且在生產環境中保持其穩定與可維護性」。 > 本章將從容器化、API、CI/CD、監控到線上再訓練,逐步說明實務流程,並以零售預測為案例,展示從模型生成到部署、監控、再訓練的全流程。 ## 9.1 為什麼需要線上部署 - **即時性**:客戶需求、季節性變動往往需要模型能即時回應。 - **可擴充**:隨著資料量或請求量的增長,部署架構必須能水平擴容。 - **治理**:版本控制、依賴追蹤與合規性檢查必須在生產環境中同樣得到保障。 ## 9.2 Docker 化模型包 ### 9.2.1 基礎 Dockerfile 範例 ```Dockerfile # 基底環境 FROM python:3.11-slim # 安裝必要套件 RUN pip install --no-cache-dir pandas numpy scikit-learn joblib # 複製模型及程式 COPY model.joblib /app/model.joblib COPY predict.py /app/predict.py # 設定工作目錄 WORKDIR /app # 執行 API 服務 CMD ["python", "predict.py"] ``` > **小技巧**:若使用 **MLflow** 的 `mlflow models build-docker` 命令,能直接把模型、環境與依賴打包成一個可執行 Docker 映像,省去手動編寫 `requirements.txt` 的麻煩。 ### 9.2.2 多階段建置 ```Dockerfile # 建置階段:安裝依賴並訓練模型 FROM python:3.11-slim AS builder WORKDIR /build COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt COPY train.py . RUN python train.py # 產生 model.joblib # 部署階段:拷貝模型與 API FROM python:3.11-slim WORKDIR /app COPY --from=builder /build/model.joblib ./model.joblib COPY predict.py . RUN pip install --no-cache-dir fastapi uvicorn CMD ["uvicorn", "predict:app", "--host", "0.0.0.0", "--port", "8000"] ``` > **注意**:多階段建置能確保最終映像尺寸較小,且不含訓練所需的巨量套件。 ## 9.3 API 與服務化 ### 9.3.1 FastAPI 範例 ```python # predict.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel import joblib import numpy as np app = FastAPI(title="零售預測 API") model = joblib.load("model.joblib") class ForecastRequest(BaseModel): past_sales: list[float] # 例如最近 30 天銷售額 holiday: bool = False class ForecastResponse(BaseModel): forecast: list[float] @app.post("/predict", response_model=ForecastResponse) def predict(req: ForecastRequest): try: X = np.array(req.past_sales).reshape(1, -1) if req.holiday: X = np.hstack([X, np.array([[1]])]) # 假設模型有假日特徵 pred = model.predict(X).tolist() return ForecastResponse(forecast=pred) except Exception as e: raise HTTPException(status_code=400, detail=str(e)) ``` > **實務建議**:若模型需要多個特徵(如季節、節假日、促銷),可將特徵工程封裝為單獨的 Python 函式,並在 API 入口呼叫,確保資料格式的一致性。 ## 9.4 CI/CD 連結 GitOps 1. **Git 版本控制**:將 Dockerfile、API 程式、`requirements.txt`、`mlflow.yml`(MLflow 服務設定)等全部放入 Git。 2. **CI Pipeline**:使用 GitHub Actions 或 GitLab CI,設定以下步驟: - 依賴安裝與單元測試 - 重新訓練模型(可選) - 建置 Docker 映像 - 推送至容器倉庫(如 DockerHub、Azure Container Registry) 3. **CD Pipeline**:在 Azure AKS 或 AWS EKS 上使用 Helm 或 Kustomize 進行自動化部署。 4. **Rollout 策略**:採用 Canary 或 Blue/Green 部署,確保新版本無錯誤時才完成切換。 > **安全提醒**:所有密鑰(API Key、DB 連線)請使用 Kubernetes Secret 或 Azure Key Vault 管理,避免硬編碼在程式中。 ## 9.5 線上監控與自動再訓練 ### 9.5.1 監控指標 | 指標 | 監控工具 | 觸發行動 | |---|---|---| | MAE / RMSE | Prometheus + Grafana | 發送 Slack 通知 | | 置信區間偏離 | Statsmodels | 觸發自動再訓練 | | 延遲 | New Relic | 上升至 99% 分位數 | ### 9.5.2 自動再訓練腳本 ```python # retrain.py import mlflow import dvc import joblib import pandas as pd # 1. 下載最新資料 DVC_REPO = "https://gitlab.com/yourproject/data.git" dvc.repo.get_latest(DVC_REPO) # 2. 重新訓練模型 train_df = pd.read_csv("data/train.csv") X = train_df.drop("target", axis=1) y = train_df["target"] from sklearn.ensemble import RandomForestRegressor model = RandomForestRegressor(n_estimators=200, random_state=42) model.fit(X, y) joblib.dump(model, "model.joblib") # 3. 追蹤實驗 mlflow.log_artifact("model.joblib") mlflow.log_metric("mae", 12.3) mlflow.end_run() ``` > **自動化建議**:將上述腳本放入 GitHub Actions 的 scheduled job,每週或每天執行一次;若監控顯示 MAE 超過閾值,可直接觸發此腳本。 ## 9.6 案例:零售預測線上部署全流程 | 步驟 | 行動 | 工具 | 成果 | |---|---|---|---| | 1 | 資料清理、特徵工程 | Pandas, DVC | `data/processed/` | | 2 | 模型訓練 | scikit-learn, MLflow | `model.joblib` | | 3 | Docker 建置 | Dockerfile, MLflow | `retail-pred:latest` | | 4 | 部署到 AKS | Helm, Azure Container Registry | 產生 API 服務 | | 5 | 監控與告警 | Prometheus, Grafana | 產生報表、Slack 通知 | | 6 | 自動再訓練 | GitHub Actions, DVC | 每週自動更新模型 | > **學習重點**:本案例示範了從資料到模型、再到部署與監控的完整工作流,並使用 GitOps 保障所有改動可追蹤、可回滾。重點在於「持續集成」與「持續部署」的緊密結合,確保模型始終保持最佳效能。 ## 9.7 小結 - **容器化**:確保模型在任何環境中都能以相同方式執行。 - **API 化**:為業務提供統一、易用的預測接口。 - **CI/CD + GitOps**:實現快速迭代與穩定部署。 - **監控與自動再訓練**:保持模型長期精度與可用性。 - **合規治理**:版本追蹤、依賴管理與安全控管同樣重要。 > **未來展望**:在下一章,我們將深入探討「多模型雜湊(Ensemble)與 Meta‑Learning」,以及如何在雲原生環境下實現彈性擴容與成本優化。