秘密和环境变量#
环境变量是将配置和秘密传递给任务的一种强大方式。在SkyPilot中有两种类型的环境变量:
用户指定的环境变量: 由用户传递给任务,适用于机密和配置。
SkyPilot 环境变量: 由 SkyPilot 预定义,包含有关当前集群和任务的信息。
用户指定的环境变量#
用户指定的环境变量对于传递任务所需的秘密和任何参数或配置非常有用。它们在file_mounts、setup和run中可用。
您可以通过几种方式指定环境变量以供任务使用:
envs字段 (字典) 在 任务 YAML 中:envs: MYVAR: val
--env-file标志在sky launch/execCLI 中,它是一个指向 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/execCLI 中(优先于上述内容)
提示
要将环境变量标记为必需,并使SkyPilot强制检查其存在性(如果未指定则报错),请在任务YAML中将其设置为空字符串或null。例如,以下任务YAML中的WANDB_API_KEY和HF_TOKEN被标记为必需:
envs:
WANDB_API_KEY:
HF_TOKEN: null
MYVAR: val
任务YAML中的file_mounts、setup和run部分可以通过${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。
在setup和run中使用#
所有用户指定的环境变量都会被导出到任务的setup和run命令中(即在它们运行时可以访问)。
例如,这对于传递秘密(见下文)或传递配置非常有用:
# 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.yaml 和 llm/vicuna/train.yaml。
SkyPilot 环境变量#
SkyPilot 导出了几个预定义的环境变量,这些变量在任务执行期间可用。这些变量包含有关当前集群或任务的信息,这对于分布式框架(如 torch.distributed、OpenMPI 等)非常有用。请参阅 分布式多节点作业 和 托管作业 中的示例。
这些变量的值由SkyPilot在任务执行时填充。 您可以通过以下方式访问这些变量:
在任务YAML的
setup/run命令(一个Bash脚本)中,使用${MYVAR}语法访问它们;在
setup/run启动的程序中,使用语言的标准方法(例如,Python的os.environ)访问它们。
setup 和 run 阶段可以访问不同的 SkyPilot 环境变量集:
setup的环境变量#
名称 |
定义 |
示例 |
|---|---|---|
|
节点的排名(一个从0到 |
0 |
|
集群中节点的IP地址字符串,顺序与节点排名相同,每行包含一个IP地址。 请注意,这不一定与 |
1.2.3.4
3.4.5.6
|
|
集群中的节点数量。与 |
2 |
|
分配给每个任务的唯一ID。 此环境变量仅在任务提交时使用 请参考运行环境变量中的描述。 |
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 |
|
一个包含集群信息的JSON字符串。要访问这些信息,你可以在bash中解析JSON字符串 import json
json.loads(
os.environ['SKYPILOT_CLUSTER_INFO']
)['cloud']
|
{“cluster_name”: “my-cluster-name”, “cloud”: “GCP”, “region”: “us-central1”, “zone”: “us-central1-a”} |
|
服务中副本的ID(从1开始)。仅适用于服务的副本任务。 |
1 |
由于设置命令总是在集群的所有节点上运行,SkyPilot确保这些环境变量(排名和IP列表)在同一个集群的多次设置中永远不会改变。
run的环境变量#
名称 |
定义 |
示例 |
|---|---|---|
|
执行任务的节点的排名(从0到 |
0 |
|
保留用于执行任务的节点IP地址字符串,其中每行包含一个IP地址。了解更多这里。 |
1.2.3.4
|
|
分配给执行当前任务的节点数量。与 |
1 |
|
每个节点上保留用于执行任务的GPU数量;与 |
0 |
|
分配给每个任务的唯一ID,格式为“sky- 如果一个任务作为托管点任务运行,那么该任务的所有恢复都将具有相同的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 |
|
一个包含集群信息的JSON字符串。要访问这些信息,你可以在bash中解析JSON字符串 import json
json.loads(
os.environ['SKYPILOT_CLUSTER_INFO']
)['cloud']
|
{“cluster_name”: “my-cluster-name”, “cloud”: “GCP”, “region”: “us-central1”, “zone”: “us-central1-a”} |
|
服务中副本的ID(从1开始)。仅适用于服务的副本任务。 |
1 |