SkyPilot 对比原生 Kubernetes#

Kubernetes 是一个用于管理容器化应用程序的强大系统。使用 SkyPilot 访问您的 Kubernetes 集群可以提高开发人员的生产力,并允许您将基础设施扩展到单个 Kubernetes 集群之外。

SkyPilot on Kubernetes

SkyPilot 在您的 Kubernetes 集群之上构建,以提供更好的开发者体验。#

SkyPilot on Kubernetes

SkyPilot 在您的 Kubernetes 集群之上构建,以提供更好的开发者体验。#

更快的开发者迭代速度#

SkyPilot 为交互式开发提供了更快的迭代速度。例如,AI 工程师的一个常见工作流程是通过调整代码和超参数并观察训练运行来迭代地开发和训练模型。

  • 使用 Kubernetes,单次迭代是一个多步骤过程,包括构建 Docker 镜像、将其推送到注册表、更新 Kubernetes YAML,然后进行部署。

  • 使用 SkyPilot,一个简单的命令(sky launch)即可处理一切。在幕后,SkyPilot 会配置 Pod、安装所有必需的依赖项、执行作业、返回日志,并提供 SSH 和 VSCode 访问以便调试。

Iterative Development with Kubernetes vs SkyPilot

使用 Kubernetes 进行迭代开发需要繁琐地更新 Docker 镜像和多个步骤来更新训练运行。使用 SkyPilot,您只需要一个 CLI 命令(sky launch)。#

更简单的 YAML 配置#

考虑在 Kubernetes 上使用 vLLM 提供 Gemma 服务

  • 使用原生 Kubernetes,您需要超过 65 行 Kubernetes YAML 来启动使用 vLLM 提供服务的 Gemma 模型。

  • 使用 SkyPilot,只需一个易于理解的 19 行 YAML 即可启动使用 vLLM 提供 Gemma 服务的 Pod。

以下是 SkyPilot 和 Kubernetes 上使用 vLLM 提供 Gemma 服务的 YAML 对比

SkyPilot(19 行)

 1envs:
 2  MODEL_NAME: google/gemma-2b-it
 3  HF_TOKEN: myhftoken
 4
 5resources:
 6  image_id: docker:vllm/vllm-openai:latest
 7  accelerators: L4:1
 8  ports: 8000
 9
10setup: |
11  conda deactivate
12  python3 -c "import huggingface_hub; huggingface_hub.login('${HF_TOKEN}')"
13
14run: |
15  conda deactivate
16  echo 'Starting vllm openai api server...'
17  python -m vllm.entrypoints.openai.api_server \
18  --model $MODEL_NAME --tokenizer hf-internal-testing/llama-tokenizer \
19  --host 0.0.0.0

Kubernetes(65 行)

 1apiVersion: apps/v1
 2kind: Deployment
 3metadata:
 4  name: vllm-gemma-deployment
 5spec:
 6  replicas: 1
 7  selector:
 8    matchLabels:
 9      app: gemma-server
10  template:
11    metadata:
12      labels:
13        app: gemma-server
14        ai.gke.io/model: gemma-1.1-2b-it
15        ai.gke.io/inference-server: vllm
16        examples.ai.gke.io/source: user-guide
17    spec:
18      containers:
19      - name: inference-server
20        image: us-docker.pkg.dev/vertex-ai/ vertex-vision-model-garden-dockers/pytorch-vllm-serve:20240527_0916_RC00
21        resources:
22          requests:
23            cpu: "2"
24            memory: "10Gi"
25            ephemeral-storage: "10Gi"
26            nvidia.com/gpu: 1
27          limits:
28            cpu: "2"
29            memory: "10Gi"
30            ephemeral-storage: "10Gi"
31            nvidia.com/gpu: 1
32        command: ["python3", "-m", "vllm.entrypoints.api_server"]
33        args:
34        - --model=$(MODEL_ID)
35        - --tensor-parallel-size=1
36        env:
37        - name: MODEL_ID
38          value: google/gemma-1.1-2b-it
39        - name: HUGGING_FACE_HUB_TOKEN
40          valueFrom:
41            secretKeyRef:
42              name: hf-secret
43              key: hf_api_token
44        volumeMounts:
45        - mountPath: /dev/shm
46          name: dshm
47      volumes:
48      - name: dshm
49        emptyDir:
50          medium: Memory
51      nodeSelector:
52        cloud.google.com/gke-accelerator: nvidia-l4
53---
54apiVersion: v1
55kind: Service
56metadata:
57  name: llm-service
58spec:
59  selector:
60    app: gemma-server
61  type: ClusterIP
62  ports:
63    - protocol: TCP
64      port: 8000
65      targetPort: 8000

扩展到单个区域/集群之外#

Scaling beyond a single region Kubernetes cluster with SkyPilot

如果 Kubernetes 集群已满,SkyPilot 可以从其他区域和云获取 GPU,以最低成本运行您的任务。#

Kubernetes 集群通常受限于单个云中的单个区域。这是因为 etcd 作为 Kubernetes 状态的控制存储,在面对跨区域较高延迟时可能会超时并失败 [1] [2] [3]

使用原生 Kubernetes 受限于单个区域/云有两个缺点

1. GPU 可用性降低,因为您无法利用其他地方的可用容量。

2. 成本增加,因为您无法利用其他区域更便宜的资源。

SkyPilot 旨在跨云和跨区域扩展:它允许您在 Kubernetes 集群上运行任务,并在需要时爆发到更多区域和云。这样做,SkyPilot 确保您的任务始终在最具成本效益的区域运行,同时保持高可用性。