背景
从 EMR on VKE 3.15 版本开始,RayCluster 支持了多 workergroup 能力。结构上,每个 workergroup 对应着一组 pod,一个 RayCluster 由一个 headgroup 与多个 workergroup 组成。用户可以通过代码方式,指定一个 ray 作业在哪个 workergroup 上执行,用于解决常驻 RayCluster 的资源隔离问题。可以参考:workergroup 相关资料。
准备条件
- 集群版本在 3.15.0 及以上。
- 已部署 EMR on VKE 产品中 Ray 服务。
- Ray 组件 KubeRayOperator 组件运行正常。
使用指导
RayCluster 管理
目前支持通过表单与通过 YAML 两种方式管理 RayCluster。如果您是基础开发者,建议使用表单方式添加 RayCluster;如果您对 Kubernertes 或者 RayCluster 比较熟悉,那么 YAML 添加提供了更丰富的配置方式。
添加 RayCluster
- 表单添加 RayCluster:
- 在基础信息中:您需要输入 RayCluster 名字,仅支持小写字母。
- 在资源配置中:默认提供了 headgroup 和 1 个 workergroup 的配置模版。在这里,您可以编辑组名称、Pod 规格、Pod 数量、存储配置等。如果 1 个 workergroup 无法满足业务等需要,点击下方添加 workergroup 可以进行新增。
- 在高级配置中:您可以使用 EMR 推荐的基础镜像,或从自定义镜像仓库中选择一个镜像作为 headgroup 与 wokergroup Pod 的运行镜像;GCS 开关建议您在生产环境开启,通过外置 Redis 来保证 RayCluster 的可用性。
- YAML 添加 RayCluster 的方式与 EMR on VKE 3.14 版本前保持一致,同样的 EMR 提供了 YAML 编辑模版,您可以在此基础上进行修改。
无论通过哪种方式添加 RayCluster ,有以下注意项:
- 目前一个 RayCluster 最多支持添加 10 个 workergroup,请您提前做好业务规划。
- 如果您需要使用 GPU 资源,请手动配置节点调度策略,并通过强满足条件使得 workergroup 可以被调度到对应节点上。
- 存储配置支持挂载 VEPFS/NAS/TOS/EBS 存储,需要事先在 VKE 集群中创建对应的 PVC 才能进行绑定;
- 选择 EBS 作为存储的 PVC 时,由于这类 PVC 只允许一个 Pod 挂载,因此对应 workergroup 下只能有一个 Pod,扩容操作将无法正常进行。
- Resource 标签与 wokergroup 绑定,当提交的作业代码中正确配置对应 Resource 标签后,RayCluster 会将作业路由到对应的 workergroup 上执行。
重启 RayCluster
重启 RayCluster 会删除并重新拉起所有相关的 Pod,请谨慎执行。
编辑 RayCluster
控制台支持对已有的 RayCluster 进行编辑,您可以按需选择表单编辑或 YAML 编辑。
- 表单编辑都属于组级别,不会对被操作的 RayCluster 中的其它 workergroup 造成影响:
- 已有 RayCluster 支持新增 wokergroup,配置内容与表单创建 RayCluster 中 workergroup 相关配置一致。
- RayCluster 左侧展示了组个数,展开后可以看到各组信息。点击组名称,可以进一步查看详情,包括 Worker 数量(实际运行 Pod 数/ 期望 Pod 数),存储配置,调度策略等。
- 扩缩容操作用于控制 workergroup 下 Worker Pod 数量。
- 删除操作会移除当前 workergroup, 并清理对应 Worker Pod。
- 重启操作会重新拉起当前 workergroup 下所有Worker Pod。
- 通过编辑 YAML 方式修改 RayCluster 与 EMR on VKE 3.14 版本前保持一致。需要注意的是,YAML 编辑保存后会直接更新 RayCluster CR( 可以在VKE 集群-对象浏览器-raycluster 中查看)。RayCluster CR 发生变更后,对于不同的变更有不同的处理逻辑(开源行为)。
- 当变更是添加 workergroup,或是编辑 workergroup 的副本数这类时,会直接生效(添加 workergroup 后会立即创建相关 Pod;编辑 workergroup 副本数后,相关 Pod 数量会发生增减)。
- 当变更是删除 workergroup,或者编辑 workergroup 相关资源时,不会直接生效(删除 workergroup 后,该 workergroup 下相关 Pod 不会自动清理;编辑 workergroup Cpu,Memory相关资源后,相关 Pod不会重新拉起)。因此在这一类操作后需要手动重启 RayCluster ,或者到 VKE 集群中删除对应 Pod 等待重新拉起后才能生效。
移除 RayCluster
移除 RayCluster 会删除相关的 CR,并清理所有 Pod,请谨慎执行。
提交作业到已有 RayCluster
作业管理新增支持提交作业到已有 RayCluster。提交方式如下:
- 在创建作业界面,作业类型选择 Ray Job,执行资源选择已经部署 RayCluster 的 EMR 集群。
- 填入 RayJob YAML 示例,通过 ray.io/cluster 指定作业运行到对应的 RayCluster 中。
apiVersion: ray.io/v1
kind: RayJob
metadata:
name: rayjob-use-existing-raycluster
spec:
entrypoint: python -c "import ray; ray.init(); print(ray.cluster_resources())"
# Select an existing RayCluster called ${ray-cluster-name} instead of creating a new one.
clusterSelector:
ray.io/cluster: ${ray-cluster-name}
submissionMode: "HTTPMode"
- 如果需要指定作业运行在对应的 workergroup 上,例如有两个 workergroup,资源标签分别是 {"Custom1": 1},{"Custom1": 1, "Custom2": 5}, 可在待执行作业代码中进行如下配置。
import socket
import ray
import time
# Specify the default resource requirements for this remote function.
@ray.remote(resources={"Custom1": 1})
def func():
# 获取主机名
hostname = socket.gethostname()
# 通过主机名获取IP地址
ip_address = socket.gethostbyname(hostname)
print(f"1--当前机器IP地址: {ip_address}")
@ray.remote(resources={"Custom1": 1, "Custom2": 5})
def func2():
# 获取主机名
hostname = socket.gethostname()
# 通过主机名获取IP地址
ip_address = socket.gethostbyname(hostname)
print(f"2--当前机器IP地址: {ip_address}")
def test():
for i in range(0,10):
func.remote()
time.sleep(5)
func2.remote()
ray.init()
test()
将代码保存为 test.py 文件上传到目标 RayCluster headpod 目录下,修改 RayJob YAML 后保存提交。
apiVersion: ray.io/v1
kind: RayJob
metadata:
name: rayjob-use-existing-raycluster
spec:
# execute task
entrypoint: python "${headpod_path}/test.py"
clusterSelector:
ray.io/cluster: ${ray-cluster-name}
submissionMode: "HTTPMode"