跳转到正文

运行环境与环境变量

Web 控制台会为每个角色生成 Kubernetes StatefulSet Task。角色中填写的环境变量会进入该角色 main 容器的 Pod 模板,并由全部副本使用。提交前,可在 Job YAML 预览的容器 env 中逐项核对。

环境变量只会改变容器进程的环境。只有 RLinf、Hydra、准备脚本或运行脚本显式读取变量时,变量才会改变业务行为。

不要用环境变量传递凭据

环境变量值会直接写入 Job 的 Pod 模板,并显示在 YAML 预览中。不要填写密码、访问令牌、私钥或对象存储 Secret;敏感值必须使用组织批准的密钥管理方式。

为每个角色添加变量

在创建或编辑 Job 的 Worker 配置步骤中,为角色逐项添加键和值。变量只属于该角色;多个角色需要同一变量时,要分别添加并核对。

适合在这里配置的内容包括:

  • 应用明确读取的非敏感运行参数;
  • 数据、模型和输出在容器中的路径;
  • 已确认可用于本次运行的功能开关;
  • RAY_TEMP_DIR,用于替换 Ray 包装脚本默认使用的 /tmp/ray

设置 RAY_TEMP_DIR 前,确认该角色的每个副本都能写入目标路径,且空间充足。包装脚本没有为该变量添加 shell 引号,因此只能使用符合 ^/[A-Za-z0-9._/-]+$ 的简单绝对路径,例如 /mnt/ray-tmp。路径中不能包含空格、引号、反斜杠、$;&|<>、括号、*?[ 或其他 shell 元字符。

RAY_TEMP_DIR 只改变 Ray 临时目录,不会改变训练输出、checkpoint 或 TensorBoard 目录。

避开平台保留变量

名称平台用途用户操作
RLARK_TASK_ROLE保存角色显示名称不要自定义。同名输入会被移除,再由 RLark 写入角色名称。
RLINF_NODE_RANK根据 Task 的 rank 起点和 Pod 序号计算节点编号可以读取,不要覆盖,也不要假设它等于节点名称。
RAY_TEMP_DIR指定 Ray 临时目录可以按本页规则设置;未设置时使用 /tmp/ray

Ray 端口、Head 地址、Pod 身份、节点总数、准备脚本、运行脚本和 SSH 公钥等信息还会使用其他 RLARK_* 变量。包装脚本也会读取 POD_NAMEWAIT_NETWORK_SCRIPT

保留平台变量名称

不要自定义 RLARK_*RLINF_NODE_RANKPOD_NAMEWAIT_NETWORK_SCRIPT。覆盖这些名称可能破坏准备脚本、Ray 组网、rank 或 SSH 公钥注入。用户可调的例外只有 RAY_TEMP_DIRRLARK_TASK_ROLE 由 RLark 生成。

除本页说明的变量外,不要让业务脚本长期依赖其他平台变量。确有需要时,先由平台管理员确认目标版本是否支持。

了解变量何时生效

Kubernetes Task 的 main 容器按以下顺序启动:

  1. 计算并导出 RLINF_NODE_RANK
  2. 等待平台网络就绪,并处理可选的 SSH 公钥注入。
  3. 执行对应角色的准备脚本。
  4. 确认镜像中存在 Ray CLI。
  5. Head 启动 Ray 并检查预期节点;其他副本解析并连接 Head。
  6. Head Task 的每个副本执行 Job 运行脚本;非 Head Task 的副本保持 Ray Worker 进程。

准备脚本失败后,Ray 不会继续启动。Head Task 中的运行脚本失败后,对应包装脚本会进入清理流程。日志阶段和判断方法见训练任务与 Worker 排障

Head Task 必须只有一个副本

Head Task 的每个副本都会启动 Ray Head 并执行运行脚本。提交前必须确认完整选择器在全部 Node 中恰好匹配 1 个节点,并在 YAML 预览中确认副本数为 1。

理解 Ray 集群的生命周期

控制台创建的 Kubernetes Job 不会连接已有 Ray 集群。工作负载每次启动时:

  1. Head 包装脚本先执行 ray stop,再执行 ray start --head
  2. RLark 为 Head Task 创建无头 Service。
  3. 其他 Task 解析该 Service,并执行 ray start --address=... --block 加入本次 Job 的 Ray 集群。
  4. 停止、删除或重建 Pod 会终止其中的 Ray 进程;再次启动会创建新的 Pod 和 Ray 运行时。

因此,“启动已停止任务”不会恢复原来的 Ray actor 或容器内存。应用必须从外部配置和持久 checkpoint 恢复状态。参见保留并恢复 RLinf 训练

RLINF_NODE_RANK 会在准备脚本前按以下方式计算:

text
Task 在 Job 中的 rank 起点 + StatefulSet Pod 序号

Task 的 rank 起点由此前 Task 的副本数累加得到。这个编号不会读取 RLinf node_groupscomponent_placement 或 hardware rank;提交前需要把两边的放置顺序逐项核对。参见任务创建字段

每个角色都要验证 Python 和 Ray 环境

包装脚本直接调用 PATH 中的 bashraypython。准备脚本可以在同一个 shell 中激活环境,但控制台不会检查最终使用的解释器或 Ray 版本。提交前,应在每个角色的镜像中分别验证;只验证 Head 镜像还不够。

提交前检查变量

在 YAML 预览中确认:

  • 每个变量只出现在预期角色的 main 容器中;
  • 没有用户定义的平台保留名称;
  • 没有凭据或其他敏感值;
  • 路径变量与该角色的 volumeMount 一致;
  • RAY_TEMP_DIR 是符合 ^/[A-Za-z0-9._/-]+$ 的单个简单绝对路径。

任务运行后,只检查明确、非敏感的单个变量。不要使用一次打印全部环境的命令,也不要把变量值复制到截图或工单。发现值不符时,回到 Job 配置、YAML 预览和角色日志定位来源;容器内的临时修改不会成为持久配置。