Ray是一个通用的分布式计算框架。PAI-DLC支持直接提交Ray任务,自动构建Ray集群,无需手动搭建集群或配置Kubernetes。
前提条件
如果使用SDK提交训练任务,需要配置环境变量。详情请参见安装Credentials工具和在Linux、macOS和Windows系统配置环境变量。
准备工作
准备节点镜像
Ray集群包含Head和Worker两种节点,DLC使用同一镜像搭建两种节点。创建任务后,DLC自动构建Ray集群,并启动submitter节点向集群提交任务。
Ray镜像版本应>=2.6,同时必须至少安装了ray[default]所包含的组件。支持使用的镜像如下:
-
PAI官方镜像:PAI平台提供了安装有Ray基础组件的官方镜像供您使用。
DLC 平台镜像:在镜像配置弹窗中,将 Repo 筛选为 ray,可选用以下镜像:
-
ray:2.39.0-cpu-py312-ubuntu22.04(3.90 GiB,CPU 版本) -
ray:2.39.0-gpu-py312-cu118-ubuntu22.04(13.61 GiB,GPU 版本)
-
-
Ray社区镜像:
-
建议使用Docker镜像rayproject/ray。
-
也支持使用rayproject/ray-ml镜像,该镜像内置了包括PyTorch、TensorFlow等机器学习框架。
使用GPU时需提供支持CUDA的镜像,更多支持的镜像版本,请查看官方Docker镜像文档。
-
准备启动命令和脚本文件
DLC任务的启动命令会被用作 ray job submit 所提交的entrypoint命令。启动命令可以填写多行或单行,例如python /root/code/sample.py,其中:
-
sample.py为运行的Python脚本文件,您可以通过数据集或代码配置方式,将脚本文件挂载到DLC容器中。示例内容如下:
import ray import os ray.init() @ray.remote class Counter: def __init__(self): # Used to verify runtimeEnv self.name = os.getenv("counter_name") # assert self.name == "ray" self.counter = 0 def inc(self): self.counter += 1 def get_counter(self): return "{} got {}".format(self.name, self.counter) counter = Counter.remote() for _ in range(50000): ray.get(counter.inc.remote()) print(ray.get(counter.get_counter.remote())) -
/root/code/为挂载路径。
提交训练任务
通过控制台提交
进入新建任务页面。
登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入DLC。
在分布式训练(DLC)页面,单击新建任务。
-
在新建任务页面,配置以下关键参数,其他参数配置详情,请参见创建训练任务。
参数
描述
示例值
环境信息
节点镜像
在官方镜像页签,选择预置的Ray官方镜像。
ray:2.39.0-cpu-py312-ubuntu22.04启动命令
本任务需要执行的命令。
python /root/code/sample.py三方库配置
支持通过配置三方库列表来配置Ray的环境运行依赖(runtime_env)。
说明在生产环境中,强烈建议使用已经打包好的镜像来执行任务,避免因为临时安装依赖库造成的任务失败。
无需配置
代码配置
通过在线配置或本地上传的方式,将准备好的脚本文件上传到DLC容器中。
使用本地上传方式:
-
示例代码文件:sample.py。
-
挂载路径:
/root/code/。
资源信息
资源来源
选择使用公共资源或资源配额。
公共资源
框架
框架类型。
Ray
任务资源
-
任务节点数量:
Head节点数量固定为1,仅运行entrypoint脚本。通常还需至少一个Worker节点用于执行计算任务。每个Ray任务会自动生成一个Submitter节点执行启动命令,您可通过其日志查看任务运行情况。
-
资源数量:
Ray集群Worker节点上的Logical Resources与您在提交任务时配置的物理资源一致。例如,当您配置了1个8卡的GPU节点时,Ray集群Worker节点默认的资源大小也为8卡GPUs。
资源配置需匹配任务需求,推荐使用少量大节点而非大量小节点。每个节点建议至少2 GiB内存,并随 Task/Actor数量增加而扩大,以避免OOM错误。
-
节点数量:均为1。
-
资源规格:选择ecs.g6.xlarge。
-
-
Worker节点扩缩容。当使用资源配额时,单击
图标,Worker节点支持弹性扩缩容。设定最大和最小实例数后,系统根据资源和负载自动调整运行实例数。在 Worker 行中,单击 GPU(卡数) 列的配置图标可修改 GPU 资源,单击行末的齿轮图标可进入节点设置。
单击弹性伸缩配置,填写角色数量、GPU、CPU、内存大小,选择合适的伸缩策略,伸缩策略支持:
-
Default-节点最大化:系统会在有充足资源的情况下会尽可能将节点数量最大化。
-
RayAutoscaler-动态伸缩:仅支持Ray任务,系统会根据集群负载情况自动调整节点数量。
-
CloudMonitorMetric-云监控指标:系统会根据云监控指标自动调整节点数量(云监控指标支持配置CPU使用率、内存使用率、GPU算力使用率、GPU显存使用率的目标值)。
-
-
日志持久化。使用公共资源时,单击Ray日志采集可将Ray集群日志、框架日志及task日志持久化到OSS,便于后续调试分析。
-
参数配置完成后,单击确定。
通过SDK提交
-
安装Python DLC SDK。
pip install alibabacloud_pai_dlc20201203==1.4.0 -
提交DLC Ray任务,示例代码如下。
#!/usr/bin/env python3 from alibabacloud_tea_openapi.models import Config from alibabacloud_credentials.client import Client as CredClient from alibabacloud_pai_dlc20201203.client import Client as DLCClient from alibabacloud_pai_dlc20201203.models import CreateJobRequest region_id = '<region-id>' cred = CredClient() workspace_id = '12****' dlc_client = DLCClient( Config(credential=cred, region_id=region_id, endpoint='pai-dlc.{}.aliyuncs.com'.format(region_id), protocol='http')) create_job_resp = dlc_client.create_job(CreateJobRequest().from_map({ 'WorkspaceId': workspace_id, 'DisplayName': 'dlc-ray-job', 'JobType': 'RayJob', 'JobSpecs': [ { "Type": "Head", "Image": "dsw-registry-vpc.<region-id>.cr.aliyuncs.com/pai/ray:2.39.0-gpu-py312-cu118-ubuntu22.04", "PodCount": 1, "EcsSpec": 'ecs.c6.large', }, { "Type": "Worker", "Image": "dsw-registry-vpc.<region-id>.cr.aliyuncs.com/pai/ray:2.39.0-gpu-py312-cu118-ubuntu22.04", "PodCount": 1, "EcsSpec": 'ecs.c6.large', }, ], "UserCommand": "echo 'Prepare your ray job entrypoint here' && sleep 1800 && echo 'DONE'", })) job_id = create_job_resp.body.job_id print(f'jobId is {job_id}')其中:
-
region_id:阿里云区域ID。例如华东1(杭州)为cn-hangzhou。
-
workspace_id:工作空间ID。请在工作空间详情页面进行查看,具体操作,请参见管理工作空间。
-
Image:请将<region-id>替换为实际的阿里云区域ID。例如华东1(杭州)为cn-hangzhou。
-
更多关于SDK的使用方法,请参见Python SDK。
通过CLI提交
-
下载DLC客户端工具,并完成用户认证。具体操作,请参见准备工作。
-
提交DLC Ray任务,示例代码如下。
./dlc submit rayjob --name=my_ray_job \ --workers=1 \ --worker_spec=ecs.g6.xlarge \ --worker_image=dsw-registry-vpc.<region-id>.cr.aliyuncs.com/pai/ray:2.39.0-cpu-py312-ubuntu22.04 \ --heads=1 \ --head_image=dsw-registry-vpc.<region-id>.cr.aliyuncs.com/pai/ray:2.39.0-cpu-py312-ubuntu22.04 \ --head_spec=ecs.g6.xlarge \ --command="echo 'Prepare your ray job entrypoint here' && sleep 1800 && echo 'DONE'" \ --workspace_id=4****通过CLI提交任务的更多配置方法,请参见提交命令。
常见问题
Q:为什么Ray任务因环境准备耗时过长而超时失败?
-
检查Head节点的日志,观察Ray环境是否正常启动。如果没有则说明相关实例中Ray不可用,请参照准备工作章节准备支持Ray的镜像。
Ray 环境正常启动后,日志中将输出如下信息:
-- -------------------- -- Ray runtime started. -- -------------------- -- Next steps -- To add another node to this Ray cluster, run -- ray start --address='192.168.128.203:6379' -- To connect to this Ray cluster: -- import ray -- ray.init() -- To terminate the Ray runtime, run -- ray stop -- To view the status of the cluster, use -- ray status -- --block -- This command will now block forever until terminated by a signal.
-
建议检查Head节点的事件日志,如果显示错误Readiness probe failed...,可能意味着该镜像缺失Readiness check相关依赖或部分间接依赖不可用。建议在原镜像中使用pip或conda重新安装ray[default]组件,或者尝试基于Ray官方镜像重新构建镜像。