返回目錄
A
數據洞察:從基礎到實踐的資料科學全書 - 第 5 章
第 5 章:模型部署與監控
發布於 2026-02-28 05:19
# 第 5 章:模型部署與監控
> **目的**:將第 4 章所建立的預測模型,從「實驗室」帶到「生產環境」,並設計可靠的監控機制,確保模型長期穩定運作、快速回復。
---
## 5.1 部署前的準備
1. **模型封裝**
- 使用 `joblib` 或 `pickle` 將模型序列化:
python
import joblib
joblib.dump(xgb_model, "models/xgb_model.pkl")
- 同時保存預處理管道(StandardScaler、OneHotEncoder 等)以保持特徵工程一致。
2. **API 介面**
- 以 **FastAPI** 為例,提供簡易 RESTful 接口:
python
from fastapi import FastAPI
from pydantic import BaseModel
import joblib
app = FastAPI()
model = joblib.load("models/xgb_model.pkl")
scaler = joblib.load("models/scaler.pkl")
encoder = joblib.load("models/encoder.pkl")
class InputData(BaseModel):
age: int
gender: str
purchase_history: list[float]
...
@app.post("/predict")
async def predict(data: InputData):
df = pd.DataFrame([data.dict()])
df_enc = encoder.transform(df)
df_scaled = scaler.transform(df_enc)
pred = model.predict(df_scaled)[0]
return {"prediction": float(pred)}
3. **容器化**
- 建立 `Dockerfile`:
dockerfile
FROM python:3.11-slim
WORKDIR /app
COPY requirements.txt .
RUN pip install --no-cache-dir -r requirements.txt
COPY . .
CMD ["uvicorn", "main:app", "--host", "0.0.0.0", "--port", "8000"]
- 利用 **Docker Compose** 或 **Kubernetes** 管理多個服務(API、監控、資料庫)。
4. **CI/CD**
- GitHub Actions 範例:
yaml
name: Deploy
on:
push:
branches: [ main ]
jobs:
build:
runs-on: ubuntu-latest
steps:
- uses: actions/checkout@v3
- name: Set up Python
uses: actions/setup-python@v4
with:
python-version: 3.11
- name: Install dependencies
run: pip install -r requirements.txt
- name: Build Docker image
run: docker build -t myapp:${{ github.sha }} .
- name: Push to registry
run: |
echo ${{ secrets.DOCKER_PASSWORD }} | docker login -u ${{ secrets.DOCKER_USERNAME }} --password-stdin
docker push myapp:${{ github.sha }}
- name: Deploy to Kubernetes
run: kubectl set image deployment/myapp-deployment myapp=myapp:${{ github.sha }}
## 5.2 監控指標
| 指標 | 定義 | 目標 | 觸發條件 |
|------|------|------|----------|
| **Latency** | 單次預測耗時 | < 50 ms | > 100 ms |
| **Throughput** | 每秒請求數 | ≥ 200 | < 100 |
| **Prediction Drift** | 分佈差異(KL Divergence) | < 0.05 | > 0.1 |
| **Error Rate** | 無效回應比例 | < 1% | > 5% |
| **Model Accuracy** | RMSE 或 AUC | 參照訓練集 | > 10% 下降 |
- **資料漂移**:利用 `river` 或 `scikit-metrics` 連續監測特徵分佈;如發現異常,啟動自動重新訓練流程。
- **預測漂移**:將預測結果與實際結果做分位數比較,若平均差距 > 5% 以上,啟動警報。
## 5.3 監控平台
- **Prometheus + Grafana**:收集 API 指標,建立儀表板。
- **MLflow**:儲存模型版本、指標、參數;可對比不同模型性能。
- **Sentry**:捕捉例外與錯誤,快速定位問題。
yaml
# example Prometheus scrape config
scrape_configs:
- job_name: 'fastapi'
static_configs:
- targets: ['localhost:8000']
## 5.4 故障排查流程
1. **快速檢查**
- API 是否響應?(curl -I http://localhost:8000/predict)
- 監控指標是否異常?查看 Grafana。
2. **日誌分析**
- 觀察 Sentry 報錯,或 Docker 日誌:`docker logs myapp`。
3. **回退機制**
- 在部署前備份舊模型,若新模型失效即時回退:
bash
kubectl rollout undo deployment/myapp-deployment
4. **人工審核**
- 針對高風險領域(如信用評分),設定人工審核閾值。
## 5.5 循環改進
1. **監測結果回饋**:將漂移指標、用戶反饋寫入資料倉庫。
2. **自動化再訓練**:每週自動拉取最新數據,重新訓練模型;若新模型性能提升 ≥ 2%,自動上線。
3. **A/B 測試**:在少量流量上試驗新模型,確保不會引入額外風險。
4. **合規審查**:每次模型更新後,完成資料隱私與倫理審查。
---
> **小結**:模型部署不是結束,而是資料科學生命周期的一個環節。透過容器化、CI/CD、監控與回饋迴路,我們才能把模型從「理論」轉化為「商業價值」。在接下來的章節,我們將進一步探討模型解釋性與可追溯性,確保模型決策透明、可控。