K8s 的應用
Table of contents
背景
訓練階段7500個節點
本文討論了 OpenAI 如何擴展其 Kubernetes 基礎設施以支援 7,500 個節點,重點是優化資源調度、網路管理和 API 伺服器。解決的主要挑戰包括 GPU 資源分配、並行作業的群組調度、高效檢查點、網路效能和 API 伺服器負載管理。他們使用 Azure 的 VMSS 等工具進行擴展,使用 Kubernetes 1.16 的 EndpointSlices 來提高效能,並解決了 Prometheus 監控問題。總的來說,Kubernetes 被證明是一個可擴展且靈活的平台,用於管理 GPT-3 和 DALL·E 等大型 AI 模型。
推論階段可服務人數
在 Kubernetes (K8S) 中部署 GPU 推理服務時,每個節點能夠服務的使用者數量取決於多個因素,包括 GPU 的規格、模型的複雜性、推理的時間要求以及使用者的並發需求。以下是影響 GPU 推理服務能力的幾個關鍵因素:
1. GPU 性能:高性能的 GPU(如 NVIDIA A100 或 V100)能夠處理更多的推理請求。相較於入門級 GPU(如 T4 或 GTX 系列),這些高端 GPU 擁有更多 CUDA 核心、內存和加速能力,能夠更好地支持大規模並發請求。
2. 模型大小與複雜性:較大的模型(如 GPT-3、BERT 這類生成式模型)需要更多的計算資源。相比之下,較小的模型(如 ResNet)對 GPU 資源的要求較低。因此,複雜的模型會降低單一 GPU 能夠同時處理的請求數量。
3. 推理延遲與吞吐量要求:如果應用需要實時回應(如聊天機器人或即時推薦系統),那麼每個使用者的推理請求需要佔用更多的資源。如果允許較高的延遲或批處理推理,則可以增加服務的使用者數量。
4. 並發用戶量:對於需要低延遲響應的場景,可能每個 GPU 同時僅能支持 5 到 10 個並發請求;而對於批次推理的應用場景,這個數量可能會增加。
5. K8S 節點配置:Kubernetes 節點上的資源分配方式(如 GPU 資源分片)也會影響每個 GPU 能夠同時服務的請求數量。K8S 允許將 GPU 資源分配給不同的 Pod,因此你可以將 GPU 資源共享給多個容器,這樣能夠有效提升服務多個用戶的能力。
大約服務人數範圍: 在典型的商業應用中,使用高端 GPU(如 NVIDIA A100),每個 GPU 在低延遲要求下可同時處理 5-10 個使用者的推理請求。如果應用允許較高延遲或批量處理,這一數字可以提升到數十甚至上百個使用者。
k8s架構
我的應用有好幾個docker一起服務,面對使用者的可能會需要複製很多套,但資料庫會需要共用,這樣在k8s的架構中要怎麼規劃?
在 Kubernetes (k8s) 中,你的應用架構有多個 Docker 容器服務和共用的資料庫,建議根據以下方式進行規劃:
1. 應用與資料庫的分離部署
- 應用服務:將每個服務分別部署為獨立的 Deployment 或 StatefulSet,並通過 Horizontal Pod Autoscaler (HPA) 來實現自動伸縮,應對使用者流量的波動。
- 資料庫服務:資料庫通常作為獨立的 StatefulSet 部署,因為資料庫需要穩定的存儲和網路連線。
2. 網路架構
使用 Kubernetes 的 Service 來提供穩定的網路端點:
- 應用服務之間的連線:
- 每個應用的 Pod 通過 ClusterIP 或 Headless Service 進行內部通信。
- 如果需要對外提供服務,使用 LoadBalancer 或 NodePort。
- 資料庫連線:
- 建立一個 ClusterIP Service,為資料庫提供穩定的內部存取點。
- 範例:
apiVersion: v1 kind: Service metadata: name: database-service spec: selector: app: database ports: - protocol: TCP port: 3306 targetPort: 3306
3. 資料持久化
資料庫需要使用 PersistentVolume (PV) 和 PersistentVolumeClaim (PVC) 來確保數據持久化。
- 使用共用的 NAS 或分散式存儲系統(例如 Ceph、GlusterFS)。
- 範例:
apiVersion: v1 kind: PersistentVolume metadata: name: database-pv spec: capacity: storage: 50Gi accessModes: - ReadWriteOnce nfs: path: /data/db server: 192.168.1.10 --- apiVersion: v1 kind: PersistentVolumeClaim metadata: name: database-pvc spec: accessModes: - ReadWriteOnce resources: requests: storage: 50Gi
4. 資源管理與伸縮
- 應用服務:
- 設置資源限制,避免 Pod 過度佔用節點資源。
- 開啟 HPA,根據 CPU 或流量自動調整 Pod 數量。
apiVersion: autoscaling/v2 kind: HorizontalPodAutoscaler metadata: name: app-hpa spec: scaleTargetRef: apiVersion: apps/v1 kind: Deployment name: app-deployment minReplicas: 2 maxReplicas: 10 metrics: - type: Resource resource: name: cpu targetAverageUtilization: 50
- 資料庫:
- 資料庫不建議使用 HPA,因為數據一致性和資料恢復比較複雜。
- 如果需要高可用,考慮使用主從複製(如 MariaDB 的 Galera Cluster 或 MySQL 的 Replication)。
5. 應用配置與環境變數管理
- 將資料庫連線資訊存入 Kubernetes 的 ConfigMap 或 Secret:
apiVersion: v1 kind: ConfigMap metadata: name: db-config data: DB_HOST: database-service DB_PORT: "3306" --- apiVersion: v1 kind: Secret metadata: name: db-secret type: Opaque data: DB_USER: bXl1c2Vy # base64編碼 DB_PASSWORD: cGFzc3dvcmQ= # base64編碼
- 在 Deployment 中引用: ```yaml env:
- name: DB_HOST valueFrom: configMapKeyRef: name: db-config key: DB_HOST
- name: DB_USER valueFrom: secretKeyRef: name: db-secret key: DB_USER
- name: DB_PASSWORD valueFrom: secretKeyRef: name: db-secret key: DB_PASSWORD ```
6. 監控與日誌
- 部署監控工具(如 Prometheus 和 Grafana)來觀察應用服務和資料庫的資源使用情況。
- 日誌採集(如 ELK 或 Loki)用於記錄和分析應用和資料庫的操作。
總結
規劃建議:
- 應用服務獨立部署並允許自動伸縮。
- 資料庫服務使用 StatefulSet 部署,並綁定 NAS 等持久存儲。
- 設定內部 ClusterIP 服務進行通信,並用 PVC 確保數據持久化。
- 為應用與資料庫定義資源限制,避免單個服務佔用過多資源。
這樣的架構既能應對高負載,又能保持數據的一致性與穩定性。