聊天視窗

資料科學深度探究:從原理到實務 - 第 8 章

第8章 部署與實務應用:雲端、容器與模型監控

發布於 2026-02-26 11:50

# 第8章 部署與實務應用:雲端、容器與模型監控 ## 8.1 部署概念與重要性 部署是把訓練好的模型轉化為可供外部系統呼叫的服務。除了模型推論本身,部署還涵蓋了: - 可擴縮容器化 - 服務編排 (Kubernetes、Service Mesh) - CI/CD 生命週期 - 監控與告警 - 安全合規 - 成本與效能最適化 ## 8.2 容器化基礎 ### 8.2.1 Dockerfile 與多階段構建 ```dockerfile # 多階段構建,基礎環境 FROM python:3.11-slim AS builder WORKDIR /app COPY requirements.txt . RUN pip install --no-cache-dir -r requirements.txt # 生產環境 FROM python:3.11-slim WORKDIR /app COPY --from=builder /usr/local/lib/python3.11/site-packages /usr/local/lib/python3.11/site-packages COPY . . CMD [uvicorn, app.main:app, --host, 0.0.0.0, --port, 80] ``` ### 8.2.2 Docker Compose 開發環境 ```yaml version: '3.8' services: app: build: . ports: - 8000:80 volumes: - .:/app environment: - PYTHONUNBUFFERED=1 ``` ## 8.3 CI/CD 流程 ### 8.3.1 GitHub Actions 範例 ```yaml name: ci-cd-pipeline on: push: branches: - main jobs: test: runs-on: ubuntu-latest steps: - uses: actions/checkout@v4 - name: Set up Python uses: actions/setup-python@v5 with: python-version: '3.11' - name: Install dependencies run: pip install -r requirements.txt - name: Run unit tests run: pytest tests/ build: runs-on: ubuntu-latest needs: test steps: - uses: actions/checkout@v4 - name: Build Docker image run: docker build -t myapp:${{ github.sha }} . - name: Log in to ECR uses: aws-actions/amazon-ecr-login@v1 with: registry: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com - run: docker push 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:${{ github.sha }} ``` ### 8.3.2 測試、構建、部署 1. **單元測試**:使用 pytest 或 unittest。 2. **集成測試**:確保容器能夠連線至資料庫、訊息佇列。 3. **模型質量測試**:檢查 AUC、F1 等指標是否符合門檻。 4. **構建**:Dockerfile 多階段構建,確保最小化映像體積。 5. **部署**:以 Helm 或 kubectl 直接推送至 Kubernetes。 ## 8.4 Kubernetes 部署 ### 8.4.1 基本資源 ```yaml apiVersion: apps/v1 kind: Deployment metadata: name: credit-risk-service spec: replicas: 3 selector: matchLabels: app: credit-risk template: metadata: labels: app: credit-risk spec: containers: - name: app image: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp:${{ github.sha }} ports: - containerPort: 80 ``` ### 8.4.2 Helm Chart 實作 ```yaml # values.yaml replicaCount: 3 image: repository: 123456789012.dkr.ecr.ap-northeast-1.amazonaws.com/myapp tag: latest pullPolicy: IfNotPresent service: type: ClusterIP port: 80 ``` 在 templates 目錄中可放置 deployment.yaml、service.yaml 等,使用 `helm install` 進行部署。 ## 8.5 雲服務比較 | Provider | Managed Kubernetes | Container Registry | Serving Services | |----------|---------------------|--------------------|-----------------| | AWS | EKS | ECR | SageMaker, ECS | | Azure | AKS | ACR | Azure ML, AKS | | GCP | GKE | Artifact Registry | AI Platform, Cloud Run | ## 8.6 模型服務化範例 ```python # app/main.py from fastapi import FastAPI, Request import joblib app = FastAPI() model = joblib.load('model.pkl') @app.post('/predict') async def predict(request: Request): data = await request.json() features = data['features'] pred = model.predict([features])[0] return {'prediction': pred} ``` 此範例使用 `joblib` 讀取 pickle 模型,並以 `/predict` 端點回傳結果。 ## 8.7 監控與告警 ### 8.7.1 Prometheus 與 Grafana ```yaml apiVersion: v1 kind: Service metadata: name: prometheus spec: selector: app: prometheus ports: - port: 9090 targetPort: 9090 ``` ```yaml apiVersion: v1 kind: Service metadata: name: grafana spec: selector: app: grafana ports: - port: 3000 targetPort: 3000 ``` **Exporter**:在 FastAPI 端點中加入 `prometheus_fastapi_instrumentator` 或使用 `starlette_exporter`,即可自動暴露 metrics。 ### 8.7.2 Loki 與 Alertmanager Loki 用於集中式日誌聚合,Alertmanager 用於設定告警規則。兩者皆可透過 Helm 部署,並在 Prometheus dashboard 中設定告警策略。 ## 8.8 安全與合規 - **鏡像掃描**:利用 Clair、Trivy 或雲端內建掃描服務,確保映像無已知漏洞。 - **憑證管理**:Kubernetes Secret 與雲端 KMS 配合,儲存 API 金鑰、資料庫密碼。 - **RBAC**:設定角色與權限,僅允許必要的 ServiceAccount 具備存取權。 - **網路策略**:透過 NetworkPolicy 限制 pod 之間的通訊範圍。 ## 8.9 成本優化技巧 1. **自動縮放**:Horizontal Pod Autoscaler (HPA) 依據 CPU 或自訂指標調整副本數。 2. **Spot/Preemptible Instance**:在非關鍵工作負載時使用 Spot Instance,節省成本。 3. **Resource Limits**:為容器設定 CPU/mem 限制,避免不必要的資源分配。 4. **使用 Serverless 方案**:如 AWS Lambda、Azure Functions、GCP Cloud Run,僅在有請求時啟動。 ## 8.10 未來趨勢 - **Serverless Kubernetes**:如 Knative、AWS Fargate 讓容器無需自行管理節點。 - **自動化模型漂移偵測**:利用 drift‑detect 或 Evidently 監控特徵分佈變化。 - **端到端監控**:結合 Jaeger、Zipkin 進行分散式追蹤,確保請求全流程可追蹤。 --- 以上即為完整的部署、CI/CD、雲端服務與監控流程。從本地開發到雲端上線,透過 Docker、GitHub Actions、Kubernetes 以及 Helm 等工具,能夠快速、可重複且安全地交付機器學習模型。