在现有机器上部署 SkyPilot#

本指南将帮助您在现有机器上部署 SkyPilot — 无论这些机器是本地的还是云提供商上的预留实例。

提示

要在您的本地机器上运行 SkyPilot,请使用 sky local up 通过 kind 部署一个 Kubernetes 集群

给定 IP 地址列表和 SSH 凭据, SkyPilot 将在远程机器上安装必要的依赖项,并配置自身以在集群上运行作业和服务。

Deploying SkyPilot on existing machines

给定 IP 地址列表和 SSH 密钥,sky local up 将在远程机器上安装必要的依赖项,并配置 SkyPilot 以在集群上运行作业和服务。#

Deploying SkyPilot on existing machines

给定 IP 地址列表和 SSH 密钥,sky local up 将在远程机器上安装必要的依赖项,并配置 SkyPilot 以在集群上运行作业和服务。#

注意

在幕后,SkyPilot 使用 k3s 在远程机器上部署一个轻量级 Kubernetes 集群。

请注意,运行本指南不需要任何 Kubernetes 知识。 SkyPilot 抽象了 Kubernetes 的复杂性,并提供了一个简单的接口来运行您的作业和服务。

先决条件#

本地机器(通常是您的笔记本电脑)

远程机器(您的集群,可选带有 GPU)

  • 基于 Debian 的操作系统(在 Debian 11 上测试)

  • 从本地机器通过基于密钥的身份验证访问所有远程机器的 SSH 权限

  • 建议所有远程机器都使用无密码 sudo。如果无法使用无密码 sudo,则所有机器必须使用相同的 SSH 用户名和密码才能使用 sudo。

  • 所有机器必须使用相同的 SSH 密钥和用户名

  • 所有机器必须能够相互访问网络

  • 您的本地机器必须至少能访问一个节点的 6443 端口

部署 SkyPilot#

  1. 创建一个名为 ips.txt 的文件,每行包含一个机器的 IP 地址。第一个节点将用作头节点 — 您的本地机器必须能够访问该节点的 6443 端口。

    以下是一个 ips.txt 示例文件

    192.168.1.1
    192.168.1.2
    192.168.1.3
    

    在此示例中,第一个节点 (192.168.1.1) 的 6443 端口已打开,并将用作头节点。

  2. 运行 sky local up 并将 ips.txt 文件、SSH 用户名和 SSH 密钥作为参数传递

    IP_FILE=ips.txt
    SSH_USER=username
    SSH_KEY=path/to/ssh/key
    CONTEXT_NAME=mycluster  # Optional, sets the context name in the kubeconfig. Defaults to "default".
    sky local up --ips $IP_FILE --ssh-user $SSH_USER --ssh-key-path $SSH_KEY --context-name $CONTEXT_NAME
    

    提示

    如果您的集群没有无密码 sudo,请使用 --password 选项指定 sudo 密码

    PASSWORD=password
    sky local up --ips $IP_FILE --ssh-user $SSH_USER --ssh-key-path $SSH_KEY --context-name $CONTEXT_NAME --password $PASSWORD
    

    SkyPilot 将在远程机器上部署一个 Kubernetes 集群,设置 GPU 支持,在您的本地机器上配置 Kubernetes 凭据,并设置 SkyPilot 以使用新的集群进行操作。

    sky local up 的示例输出

    $ sky local up --ips ips.txt --ssh-user gcpuser --ssh-key-path ~/.ssh/id_rsa --context-name mycluster
    To view detailed progress: tail -n100 -f ~/sky_logs/sky-2024-09-23-18-53-14-165534/local_up.log
    ✔ K3s successfully deployed on head node.
    ✔ K3s successfully deployed on worker node.
    ✔ kubectl configured for the remote cluster.
    ✔ Remote k3s is running.
    ✔ Nvidia GPU Operator installed successfully.
    Cluster deployment done. You can now run tasks on this cluster.
    E.g., run a task with: sky launch --cloud kubernetes -- echo hello world.
    🎉 Remote cluster deployed successfully.
    
  1. 要验证集群是否正在运行,请运行

    sky check kubernetes
    

    您现在可以使用 SkyPilot 在您自己的基础设施上启动您的开发集群训练作业

    $ sky show-gpus --cloud k8s
    Kubernetes GPUs
    GPU   REQUESTABLE_QTY_PER_NODE  UTILIZATION
    L4    1, 2, 4                   12 of 12
    H100  1, 2, 4, 8                16 of 16
    
    Kubernetes per node GPU availability
    NODE                       GPU       UTILIZATION
    my-cluster-0               L4        4 of 4
    my-cluster-1               L4        4 of 4
    my-cluster-2               L4        2 of 2
    my-cluster-3               L4        2 of 2
    my-cluster-4               H100      8 of 8
    my-cluster-5               H100      8 of 8
    
    $ sky launch --cloud k8s --gpus H100:1 -- nvidia-smi
    

    提示

    为了实现对 Kubernetes 集群的共享访问,您可以部署一个SkyPilot API 服务器

幕后发生了什么?#

当您运行 sky local up 时,SkyPilot 会执行以下操作

  1. 在远程机器上安装并以 systemd 服务形式运行 k3s Kubernetes 分发版。

  2. [如果存在 GPU] 在新配置的 k3s 集群上安装 Nvidia GPU Operator。请注意,此步骤不会修改您的本地 nvidia 驱动程序/cuda 安装,仅在集群内部运行。

  3. 通过 6443 端口在头节点上暴露 Kubernetes API 服务器。此端口上的 API 调用使用集群生成的密钥对进行保护。

  4. 在您的本地机器上配置 kubectl 以连接到远程集群。

清理#

要清理 SkyPilot 在您的机器上创建的所有状态,请使用 --cleanup 标志

IP_FILE=ips.txt
SSH_USER=username
SSH_KEY=path/to/ssh/key
sky local up --ips $IP_FILE --ssh-user $SSH_USER --ssh-key-path $SSH_KEY --cleanup

提示

如果您的集群没有无密码 sudo,请使用 --password 选项指定 sudo 密码

PASSWORD=password
sky local up --ips $IP_FILE --ssh-user $SSH_USER --ssh-key-path $SSH_KEY --password $PASSWORD --cleanup

这将停止远程机器上的所有 Kubernetes 服务。

设置多个集群#

您可以通过为每个集群使用不同的 context-name 值来使用 SkyPilot 设置多个 Kubernetes 集群

# Set up first cluster and save the kubeconfig
sky local up --ips cluster1-ips.txt --ssh-user user1 --ssh-key-path key1.pem --context-name cluster1
# Set up second cluster
sky local up --ips cluster2-ips.txt --ssh-user user2 --ssh-key-path key2.pem --context-name cluster2

然后,通过将它们添加到 ~/.sky/config.yaml 文件中的 allowed_contexts,您可以配置 SkyPilot 以使用多个 Kubernetes 集群

# ~/.sky/config.yaml
 allowed_contexts:
   - cluster1
   - cluster2
# Run on cluster1
sky launch --cloud k8s --region cluster1 -- echo "Running on cluster 1"

# Run on cluster2
sky launch --cloud k8s --region cluster2 -- echo "Running on cluster 2"

# Let SkyPilot automatically select the cluster with available resources
sky launch --cloud k8s -- echo "Running on SkyPilot selected cluster"

您可以使用以下命令查看可用的集群和 GPU

# List GPUs on cluster1
sky show-gpus --cloud k8s --region cluster1

# List GPUs on cluster2
sky show-gpus --cloud k8s --region cluster2