秘密和环境变量#

环境变量是将配置和秘密传递给任务的一种强大方式。在SkyPilot中有两种类型的环境变量:

用户指定的环境变量#

用户指定的环境变量对于传递任务所需的秘密和任何参数或配置非常有用。它们在file_mountssetuprun中可用。

您可以通过几种方式指定环境变量以供任务使用:

  • envs 字段 (字典) 在 任务 YAML 中:

    envs:
      MYVAR: val
    
  • --env-file 标志在 sky launch/exec CLI 中,它是一个指向 dotenv 文件的路径(优先于上述内容):

    # sky launch example.yaml --env-file my_app.env
    # cat my_app.env
    MYVAR=val
    WANDB_API_KEY=MY_WANDB_API_KEY
    HF_TOKEN=MY_HF_TOKEN
    
  • --env 标志在 sky launch/exec CLI 中(优先于上述内容)

提示

要将环境变量标记为必需,并使SkyPilot强制检查其存在性(如果未指定则报错),请在任务YAML中将其设置为空字符串或null。例如,以下任务YAML中的WANDB_API_KEYHF_TOKEN被标记为必需:

envs:
  WANDB_API_KEY:
  HF_TOKEN: null
  MYVAR: val

任务YAML中的file_mountssetuprun部分可以通过${MYVAR}语法访问变量。

传递密钥#

我们建议通过首先在当前 shell 中使其可用,然后使用 --env SECRET 将其传递给 SkyPilot,来将密钥传递给执行任务的任何节点:

$ sky launch -c mycluster --env HF_TOKEN --env WANDB_API_KEY task.yaml
$ sky exec mycluster --env WANDB_API_KEY task.yaml

提示

你不需要直接传递值,例如 --env WANDB_API_KEY=1234。当值未指定时(例如 --env WANDB_API_KEY),SkyPilot 会从本地环境变量中读取它。

file_mounts中使用#

# Sets default values for some variables; can be overridden by --env.
envs:
  MY_BUCKET: skypilot-temp-gcs-test
  MY_LOCAL_PATH: tmp-workdir
  MODEL_SIZE: 13b

file_mounts:
    /mydir:
        name: ${MY_BUCKET}  # Name of the bucket.
        mode: MOUNT

    /another-dir2:
        name: ${MY_BUCKET}-2
        source: ["~/${MY_LOCAL_PATH}"]

    /checkpoint/${MODEL_SIZE}: ~/${MY_LOCAL_PATH}

这些变量的值由SkyPilot在任务YAML解析时填充。

了解更多信息,请访问 examples/using_file_mounts_with_env_vars.yaml

setuprun中使用#

所有用户指定的环境变量都会被导出到任务的setuprun命令中(即在它们运行时可以访问)。

例如,这对于传递秘密(见下文)或传递配置非常有用:

# Sets default values for some variables; can be overridden by --env.
envs:
  MODEL_NAME: decapoda-research/llama-65b-hf

run: |
  python train.py --model_name ${MODEL_NAME} <other args>
$ sky launch --env MODEL_NAME=decapoda-research/llama-7b-hf task.yaml  # Override.

查看完整示例,请访问 llm/vllm/serve.yamlllm/vicuna/train.yaml

SkyPilot 环境变量#

SkyPilot 导出了几个预定义的环境变量,这些变量在任务执行期间可用。这些变量包含有关当前集群或任务的信息,这对于分布式框架(如 torch.distributed、OpenMPI 等)非常有用。请参阅 分布式多节点作业托管作业 中的示例。

这些变量的值由SkyPilot在任务执行时填充。 您可以通过以下方式访问这些变量:

  • 在任务YAML的setup/run命令(一个Bash脚本)中,使用${MYVAR}语法访问它们;

  • setup/run启动的程序中,使用语言的标准方法(例如,Python的os.environ)访问它们。

setuprun 阶段可以访问不同的 SkyPilot 环境变量集:

setup的环境变量#

名称

定义

示例

SKYPILOT_SETUP_NODE_RANK

节点的排名(一个从0到num_nodes-1的整数ID)。

0

SKYPILOT_SETUP_NODE_IPS

集群中节点的IP地址字符串,顺序与节点排名相同,每行包含一个IP地址。

请注意,这不一定与run阶段中的节点相同:setup阶段在集群的所有节点上运行,而run阶段可以在节点的子集上运行。

1.2.3.4
3.4.5.6

SKYPILOT_NUM_NODES

集群中的节点数量。与 $(echo "$SKYPILOT_NODE_IPS" | wc -l) 的值相同。

2

SKYPILOT_TASK_ID

分配给每个任务的唯一ID。

此环境变量仅在任务提交时使用sky launch --detach-setup,或作为托管点作业运行时可用。

请参考运行环境变量中的描述。

sky-2023-07-06-21-18-31-563597_myclus_1

对于托管spot作业:sky-managed-2023-07-06-21-18-31-563597_my-job-name_1-0

SKYPILOT_CLUSTER_INFO

一个包含集群信息的JSON字符串。要访问这些信息,你可以在bash中解析JSON字符串 echo $SKYPILOT_CLUSTER_INFO | jq .cloud 或者在Python中:

import json
json.loads(
  os.environ['SKYPILOT_CLUSTER_INFO']
)['cloud']

{“cluster_name”: “my-cluster-name”, “cloud”: “GCP”, “region”: “us-central1”, “zone”: “us-central1-a”}

SKYPILOT_SERVE_REPLICA_ID

服务中副本的ID(从1开始)。仅适用于服务的副本任务。

1

由于设置命令总是在集群的所有节点上运行,SkyPilot确保这些环境变量(排名和IP列表)在同一个集群的多次设置中永远不会改变。

run的环境变量#

名称

定义

示例

SKYPILOT_NODE_RANK

执行任务的节点的排名(从0到num_nodes-1的整数ID)。了解更多信息这里

0

SKYPILOT_NODE_IPS

保留用于执行任务的节点IP地址字符串,其中每行包含一个IP地址。了解更多这里

1.2.3.4

SKYPILOT_NUM_NODES

分配给执行当前任务的节点数量。与$(echo "$SKYPILOT_NODE_IPS" | wc -l)的值相同。了解更多信息,请访问这里

1

SKYPILOT_NUM_GPUS_PER_NODE

每个节点上保留用于执行任务的GPU数量;与accelerators: :中的计数相同(如果是分数则向上取整)。了解更多这里

0

SKYPILOT_TASK_ID

分配给每个任务的唯一ID,格式为“sky-__”。 对于日志记录非常有用:例如,在集群上使用唯一的输出路径;传递给Weights & Biases;等等。 每个任务的日志都存储在集群上的~/sky_logs/${SKYPILOT_TASK_ID%%_*}/tasks/*.log

如果一个任务作为托管点任务运行,那么该任务的所有恢复都将具有相同的ID值。ID的格式为“sky-managed-_(_)_-”,其中在使用管道时会出现,即在托管点任务中有多个任务时。了解更多这里

sky-2023-07-06-21-18-31-563597_myclus_1

对于托管spot作业:sky-managed-2023-07-06-21-18-31-563597_my-job-name_1-0

SKYPILOT_CLUSTER_INFO

一个包含集群信息的JSON字符串。要访问这些信息,你可以在bash中解析JSON字符串 echo $SKYPILOT_CLUSTER_INFO | jq .cloud 或者在Python中:

import json
json.loads(
  os.environ['SKYPILOT_CLUSTER_INFO']
)['cloud']

{“cluster_name”: “my-cluster-name”, “cloud”: “GCP”, “region”: “us-central1”, “zone”: “us-central1-a”}

SKYPILOT_SERVE_REPLICA_ID

服务中副本的ID(从1开始)。仅适用于服务的副本任务。

1