返回目錄
A
資料科學深度探究:從原理到實務 - 第 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 等工具,能夠快速、可重複且安全地交付機器學習模型。