聊天視窗

資料洞察:企業數據分析與決策支援全攻略 - 第 7 章

第七章 機器學習實務部署

發布於 2026-03-01 12:53

# 第七章 機器學習實務部署 在前幾章已經建立起完整的資料管線、資料治理、建模流程,接下來的重點便是如何將模型從實驗室搬到實際運營環境,並確保其可擴展、可觀測、合規安全。這一章將從**模型訓練**、**容器化**、**CI/CD**、**API 服務**、**擴充性**、**監測與治理**等面向,提供一套完整的實務部署框架。 ## 7.1 部署前的前置工作 | 項目 | 目的 | 主要工具 | |------|------|--------| | 版本管理 | 追蹤模型、程式碼、依賴 | Git, GitHub, GitLab | | 環境隔離 | 避免相依衝突 | conda, virtualenv, Poetry | | 依賴宣告 | 確保可重現性 | requirements.txt, pyproject.toml | | 資料安全 | 合規、保密 | S3 Encryption, Azure Key Vault | ### 1. 設定模型元資料 - **模型名稱**、**版本**、**訓練日期**、**作者** - **特徵清單**:包括原始特徵、衍生特徵、使用的時間窗口 - **性能指標**:訓練集/驗證集的 MAE、RMSE、AUC 等 > **實務提醒**:使用 `mlflow` 或 `Weights & Biases` 追蹤元資料,方便日後回溯與比較。 ## 7.2 容器化模型 ### 7.2.1 Dockerfile 範例 ```Dockerfile # 基礎鏡像 FROM python:3.10-slim # 設定工作目錄 WORKDIR /app # 複製依賴文件並安裝 COPY requirements.txt ./ RUN pip install --no-cache-dir -r requirements.txt # 複製模型檔案 COPY model.joblib ./model.joblib # 複製 API 程式碼 COPY app.py ./app.py # 暴露 HTTP 端口 EXPOSE 8000 # 執行 FastAPI + Uvicorn CMD ["uvicorn", "app:app", "--host", "0.0.0.0", "--port", "8000"] ``` ### 7.2.2 FastAPI + Uvicorn 範例 ```python # app.py from fastapi import FastAPI, HTTPException from pydantic import BaseModel import joblib import numpy as np app = FastAPI(title="ML Model API") model = joblib.load("model.joblib") class PredictRequest(BaseModel): features: list @app.post("/predict") async def predict(request: PredictRequest): try: X = np.array(request.features).reshape(1, -1) pred = model.predict(X)[0] return {"prediction": pred} except Exception as e: raise HTTPException(status_code=400, detail=str(e)) ``` > **注意**:若模型使用 GPU 或大量記憶體,請選擇對應的基礎鏡像,例如 `nvidia/cuda`。 ## 7.3 CI/CD 流程設計 | 階段 | 觸發條件 | 主要作業 | |------|----------|----------| | 建置 | PR 合併 | Docker build + unit test | | 測試 | CI pipeline | 端到端測試、模型性能回歸 | | 部署 | build 成功 | 推送鏡像至私有 registry;更新 k8s Deployment | | 監控 | 監測失效 | 自動 rollback | ### 7.3.1 GitHub Actions 範例 ```yaml name: ML Deploy on: push: branches: [ main ] jobs: build: runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Set up Docker Buildx uses: docker/setup-buildx-action@v2 - name: Build and push uses: docker/build-push-action@v4 with: context: . push: true tags: registry.company.com/ml-model:latest cache-from: type=registry,ref=registry.company.com/ml-model:cache cache-to: type=inline deploy: needs: build runs-on: ubuntu-latest steps: - uses: actions/checkout@v3 - name: Deploy to K8s uses: azure/k8s-deploy@v3 with: namespace: ml manifests: deployment.yaml ``` ### 7.3.2 ArgoCD 連結 將 Deployment YAML 置於 GitRepo,ArgoCD 監控變更,確保「Git 與實際環境同步」的原則。ArgoCD 能自動回滾失敗部署,減少人工干預。 ## 7.4 擴充性與負載平衡 ### 7.4.1 水平擴充 - **HPA (Horizontal Pod Autoscaler)**:根據 CPU、Memory 或自定義指標(如推論延遲)自動調整 Pod 數量。 ```yaml apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: ml-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: ml-deploy minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu target: type: Utilization averageUtilization: 70 ``` ### 7.4.2 API Gateway 使用 **Istio**、**Kong** 或 **NGINX** 作為服務網格,提供流量管理、藍綠部署與流量分裂。 ## 7.5 監測、日誌與告警 | 指標 | 工具 | 目的 | |------|------|------| | 推論延遲 | Prometheus + Grafana | 保障 SLA | | 訓練/推論誤差漂移 | Evidently、Evidently AI | 監測模型品質 | | 系統資源 | node-exporter | 確保可用性 | | 日誌 | Loki | 追蹤故障 | ### 7.5.1 Prometheus 監測示例 ```yaml # prometheus.yml snippet - job_name: 'ml-service' static_configs: - targets: ['ml-service:8000'] metrics_path: '/metrics' ``` > **觀察**:在 Grafana 中建立「推論延遲」儀表板,設定 5 分鐘平均值,若超過 200ms 立即發送 PagerDuty 通知。 ## 7.6 合規與安全 1. **資料加密**:Docker secret、Kubernetes secret、GCP KMS。 2. **存取管控**:RBAC、PodSecurityPolicy、OPA Gatekeeper。 3. **審計日誌**:Kubernetes audit logs、CloudTrail、AWS CloudWatch Logs。 4. **合規標準**:GDPR、ISO 27001、HIPAA(若適用)。 > **實務提醒**:將模型的輸入輸出資料加上 **資料匿名化** 或 **tokenisation**,避免敏感資訊在雲端流動。 ## 7.7 A/B 測試與藍綠部署 - **策略**:將流量 90% 指向舊版模型,10% 指向新版。觀察 KPI(如預測準確率、延遲、成本)。 - **工具**:Istio traffic routing、Argo Rollouts。 - **回退**:若新模型表現低於門檻,自動回滾至舊版。 ## 7.8 模型版本控制與治理 | 層級 | 存儲位置 | 優點 | |------|----------|------| | 1. 代碼 | Git | 可追蹤變更 | | 2. 模型 | MLflow Model Registry / S3 | 版本化、元資料管理 | | 3. 部署 | Docker Registry | 快速拉取 | ### 7.8.1 MLflow 範例 ```python import mlflow mlflow.set_experiment("delivery_delay") with mlflow.start_run(): mlflow.log_params(params) mlflow.log_metrics(metrics) mlflow.sklearn.log_model(model, "model") ``` ## 7.9 迭代循環總結 1. **收集**:從推論日誌中抽取輸入特徵與預測結果。 2. **評估**:計算實際與預測之間的誤差,若誤差 > 5% 即為漂移警報。 3. **更新**:在安全的測試環境下重新訓練模型,使用 A/B 測試驗證效果。 4. **部署**:將新模型推至生產環境,並持續監測 KPI。 > **關鍵點**:在每一次迭代中,都必須保證 **可觀測性**、**合規性**、**業務價值** 三者同步進行。若忽略任何一項,模型可能在生產中失效或違規。 ## 7.10 小結 | 主題 | 重要性 | |------|--------| | 容器化 | 確保環境一致、可重複性 | | CI/CD | 自動化部署、減少人為錯誤 | | 監測 | 保持模型品質、符合 SLA | | 安全合規 | 避免法律風險、保護客戶資料 | | 迭代循環 | 保持模型與業務同步、持續創造價值 | > **實務提醒**:在部署前,先在 **灰度環境**(staging)做全面測試,包含單元、整合、性能、合規。只有當所有指標達標,才推送至生產。