返回目錄
A
掌握時序預測: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」,以及如何在雲原生環境下實現彈性擴容與成本優化。