聊天視窗

數據洞察:從基礎到實踐的資料科學全書 - 第 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、監控與回饋迴路,我們才能把模型從「理論」轉化為「商業價值」。在接下來的章節,我們將進一步探討模型解釋性與可追溯性,確保模型決策透明、可控。