返回目錄
A
資料洞察:企業數據分析與決策支援全攻略 - 第 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)做全面測試,包含單元、整合、性能、合規。只有當所有指標達標,才推送至生產。