对于**个人 AI/ML 人员在多个云、Kubernetes 集群和本地运行 AI 工作负载**而言,SkyPilot 一直非常易用。只需一个命令即可启动集群、运行作业/服务,让 SkyPilot 在后台优化成本和可用性。

但到目前为止,SkyPilot 很大程度上还是一个本地系统——所有东西都必须从单台笔记本电脑/机器运行。这限制了我们支持异步运行作业、从另一台设备/服务重新连接或团队协作的能力。

今天,我们隆重推出 **SkyPilot 的全新客户端-服务器架构**。可以将其视为从“本地系统”模型转变为一个您可以从任何地方连接的**集中式 API 服务器**。服务器处理所有的资源编排和控制平面逻辑,而您的本地客户端发送轻量级请求。这是一种使用 SkyPilot 的全新方式,为个人和团队解锁了强大的功能。


SkyPilot *之前* 的快速一瞥

在旧模型中,您需要在笔记本电脑上安装 SkyPilot 并运行类似 sky launch 的命令,控制逻辑在本地运行:调配资源并提交作业。这对于个人用例非常有效。

# Install SkyPilot with prerelease allowed for Azure dependencies
uv pip install --prerelease allow skypilot-nightly[all]

# Launch a GPU cluster with 8 H100 GPUs and more than 32 CPU cores
sky launch --gpus H100:8 --cpus 32+ nvidia-smi

但是如果您想

  • 一次运行多个启动操作:您必须编写脚本,并等待每个启动操作的同步控制逻辑完成。
  • 从不同的设备与您的作业/集群交互: 不可能,除非您复制整个 SkyPilot 状态 (~/.sky) 和您的密钥/云凭据(类似于 Terraform 状态文件)。
  • 与队友协作:您必须共享凭据或在同一台机器上运行所有 SkyPilot 命令,因为不支持多租户。
  • 安排定期工作流: 您必须管理管道不同阶段或 cron 作业多次触发的集群/作业的 SkyPilot 状态。

简而言之,旧模型虽然简单,但缺乏多设备和多用户功能。


为什么采用客户端-服务器架构?

通过将 SkyPilot 解耦为**客户端**(您的 CLI 或 SDK)和**服务器**(大脑),解锁了一系列好处:

对于个人用户

  • 异步执行: 快速/异步启动多个作业,而不会被提交过程阻塞。
  • 从不同的设备访问 SkyPilot: 从办公室启动作业,然后在家里笔记本电脑上查看。
  • 与生产工作流编排器集成: 使用编排器安排您的工作流,同时 SkyPilot 管理各种计算/基础设施——不再需要繁琐的 SkyPilot 状态管理。

对于团队用户

  • 集中部署与无缝入职: 设置一个 SkyPilot API 服务器(在云中或 Kubernetes 上),团队成员只需一个端点即可入职。
  • 多租户: 在队友之间安全地共享集群、作业和服务。
  • 统一视图和管理: 在组织和您拥有的所有基础设施中获得所有正在运行的集群和作业的单一视图。
  • 容错和云原生部署: SkyPilot API 服务器可以是云原生的,并且完全容错,不会丢失您的团队工作负载。

客户端-服务器模型将 SkyPilot 从单用户系统转变为可扩展的多用户平台,使个人和团队更容易运行和管理他们的工作负载。

对于个人用户

1. 异步、非阻塞执行

SkyPilot 现在可以启动作业并立即返回——它不会占用您的终端。启动后您可以按 Ctrl+C,启动操作仍会在后台运行。或者,您可以使用新的 CLI 标志 --async 来提交多个任务而不会阻塞。

for i in {1..10}; do
  sky jobs launch -y --async "echo 'Hello from job $i'"
done

这对于进行超参数搜索或大量实验批次的用户来说是一个巨大的优势。

2. 从任何地方连接

一旦您部署了远程 SkyPilot API 服务器,您就不再受限于一台笔记本电脑。在办公室启动作业,然后通过连接到同一个 API 服务器端点,从家里的台式机上查看日志或继续工作。

服务器始终开启——即使您的本地机器关闭,它也会继续管理您的资源。

3. 与生产工作流编排器集成

使用 Airflow、Modal 或 Temporal 安排定期生产工作流,并在一个地方找到跨不同基础设施的所有资源/作业。通过远程 API 服务器,工作流中的每个阶段或 cron 作业的每次触发都可以连接到同一个 API 服务器并共享相同的 SkyPilot 状态,即无需手动状态管理即可共享资源/作业。

例如,您现在可以启动一个 Airflow 管道,该管道会定期处理新到达的数据、重新训练 AI 模型并运行评估,其中每个阶段都连接到同一个 SkyPilot API 服务器,以实际在不同的基础设施(例如云或 Kubernetes 集群)上运行 AI 工作负载。

查看与 Airflow 集成的更多详细信息


对于团队用户

1. 集中部署与无缝入职

想象一下,您的团队拥有一个**单一的 SkyPilot 服务器**。每个人只需运行 sky api login 即可连接。就是这样。

早期用户反馈,这种新的集中部署非常节省时间。您的基础设施团队只需设置一次服务器和凭据,整个组织就可以立即开始在多个云和 Kubernetes 集群上运行 AI 集群/作业——而无需向个人提供详细的凭据或权限。

$ sky api login
Enter your SkyPilot API server endpoint: http://user:[email protected]

$ sky check

2. 多租户:共享集群、作业、服务

SkyPilot 现在支持**多用户**资源共享。团队成员可以查看彼此正在运行的作业、检查日志并协调使用。您可以启动一个 GPU 集群,其他人可以使用同一个集群或向其提交作业。无需额外开销。

以下是 SkyPilot 集群如何共享的几个示例:

  1. **Alice** 可以启动一个共享集群
# Alice: Start a shared cluster
sky launch -c shared-gpu --gpus A10G:8
  1. **Bob** 可以查看集群、通过 ssh 连接到它或向该集群提交更多作业
# Bob: Check all available clusters
sky status -u
Clusters
NAME        USER  LAUNCHED    RESOURCES            STATUS   AUTOSTOP
shared-gpu  alice 1 days ago  1x AWS(g5.48xlarge)  UP       -       


# Bob: Interactively ssh into the cluster
ssh shared-gpu
# Bob: Submit additional jobs to the cluster
sky exec shared-gpu --gpus A10G:1 bob-1-gpu.yaml

对于托管的作业和服务,也可以做类似的事情。所有这些都可以提高资源利用率并提高工程效率。

3. 单一管理界面:在一个地方查看和管理

通过远程 API 服务器,您现在可以在一个地方查看组织中所有正在运行的集群、作业和服务

  • 如果集群处于空闲状态,您可以将其关闭或停止。
  • 如果某个作业占用了大量资源,您可以检查日志或进行干预。
  • 如果某个服务需要更新,值班成员可以更新它。

这有助于保持云使用的高效并控制云预算。

检查组织内的所有集群/作业/服务

sky status -u
  • 停止一个空闲集群:sky stop dev
  • 显示作业日志:sky jobs logs 3
  • 更新服务:sky serve update -n deepseek service-v2.yaml

4. 容错和云原生部署

SkyPilot 通过一个简单的 Helm Chart 提供了 SkyPilot API 服务器的简单云原生部署。它开箱即用地提供容错功能。部署快速入门指南可在下一节找到。

注意:如果您没有 Kubernetes 集群,SkyPilot 也可以通过一个命令自动在您现有机器上设置一个 Kubernetes 集群:sky local up(在此处 查看更多详细信息

如何部署

部署 SkyPilot API 服务器变得非常容易。对于只想在本地机器上运行 SkyPilot 的本地模式用户,无需执行任何额外操作——SkyPilot 在进行第一次 CLI/SDK 调用时会自动部署一个本地 API 服务器。

远程 API 服务器可以部署在云虚拟机或 Kubernetes 集群上(推荐)。对于后者,部署我们的开源 Helm Chart 将在 Kubernetes 集群上设置一个容错的 SkyPilot API 服务器,可以通过端点立即访问。

您可以在此处 找到在 Kubernetes 上设置 SkyPilot API 服务器的详细说明,但这里是如何操作的快速一瞥:

  1. 使用 Helm Chart 部署 API 服务器
# Add SkyPilot helm chart repository
helm repo add skypilot https://helm.skypilot.co
helm repo update

# Deploy the helm chart
NAMESPACE=skypilot
WEB_USERNAME=user
WEB_PASSWORD=password
AUTH_STRING=$(htpasswd -nb $WEB_USERNAME $WEB_PASSWORD)

helm upgrade --install skypilot skypilot/skypilot-nightly --devel \
  --namespace $NAMESPACE \
  --create-namespace \
  --set ingress.authCredentials=$AUTH_STRING
  1. 查找端点
RELEASE_NAME=skypilot  # This should match the name used in helm install/upgrade
NODE_PORT=$(kubectl get svc ${RELEASE_NAME}-ingress-controller-np -n $NAMESPACE -o jsonpath='{.spec.ports[?(@.name=="http")].nodePort}')
NODE_IP=$(kubectl get nodes -o jsonpath='{ $.items[0].status.addresses[?(@.type=="ExternalIP")].address }')

ENDPOINT=http://${WEB_USERNAME}:${WEB_PASSWORD}@${NODE_IP}:${NODE_PORT}
echo $ENDPOINT

您将看到一个类似这样的端点:http://user:[email protected]:30050

  1. 让 SkyPilot 使用该端点
sky api login -e $ENDPOINT
sky api info
Using SkyPilot API server: http://user:[email protected]:30050
├── Status: healthy, commit: 296a22e868b9bdf1faccbe3effbfb858a5a05905, version: 1.0.0-dev0
└── User: alice (1dca28cd)
  1. 可选:要在 API 服务器中设置云凭据,您可以将凭据挂载到部署中。在此处 查看更多详细信息

现在您的远程 SkyPilot API 服务器已设置完毕,可以与您的团队共享!

💡 提示: 要在没有 Kubernetes 集群的情况下快速测试远程 API 服务器,您也可以尝试将 API 服务器部署到普通虚拟机的说明。请参阅 SkyPilot 文档

升级并迁移到新的客户端-服务器架构

从客户端-服务器架构之前的 SkyPilot 版本 <= 0.8.0 升级时,这里有一些迁移注意事项。

如果您只想在本地运行 SkyPilot,与之前相比无需执行任何额外操作。SkyPilot 会在本地自动启动一个 API 服务器来处理您的所有请求。您无需关心 SkyPilot API 服务器的存在,尽管每当您升级 SkyPilot 时,您可能需要运行 sky api stop 以使最新的 SkyPilot 生效。

对于使用 SkyPilot Python SDK 编写的现有脚本,升级后的主要区别在于其异步执行特性,因此您需要添加 sky.stream_and_get 来等待请求完成。如果需要阻塞执行,此处 是我们的详细迁移指南。

# Previously
handle, job_id = sky.launch(...)

# Now
request_id = sky.launch(...)
handle, job_id = sky.stream_and_get(request_id)

下一步

安装 SkyPilot 并尝试一下

# Install SkyPilot with prerelease allowed for Azure dependencies
uv pip install --prerelease allow skypilot-nightly[all]

# Launch a GPU cluster with 8 H100 GPUs and more than 32 CPU cores
sky launch --gpus H100:8 --cpus 32+ nvidia-smi

如果您想在 Slack 上为您的团队部署服务器,请随时联系我们寻求帮助。