快速提交Ray任务

更新时间:
复制 MD 格式

Ray是一个通用的分布式计算框架。PAI-DLC支持直接提交Ray任务,自动构建Ray集群,无需手动搭建集群或配置Kubernetes。

前提条件

如果使用SDK提交训练任务,需要配置环境变量。详情请参见安装Credentials工具Linux、macOSWindows系统配置环境变量

准备工作

准备节点镜像

Ray集群包含HeadWorker两种节点,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社区镜像:

    使用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/为挂载路径。

提交训练任务

通过控制台提交

  1. 进入新建任务页面。

    1. 登录PAI控制台,在页面上方选择目标地域,并在右侧选择目标工作空间,然后单击进入DLC

    2. 分布式训练(DLC)页面,单击新建任务

  2. 新建任务页面,配置以下关键参数,其他参数配置详情,请参见创建训练任务

    参数

    描述

    示例值

    环境信息

    节点镜像

    官方镜像页签,选择预置的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与您在提交任务时配置的物理资源一致。例如,当您配置了18卡的GPU节点时,Ray集群Worker节点默认的资源大小也为8GPUs。

      资源配置需匹配任务需求,推荐使用少量大节点而非大量小节点。每个节点建议至少2 GiB内存,并随 Task/Actor数量增加而扩大,以避免OOM错误。

    • 节点数量:均为1。

    • 资源规格:选择ecs.g6.xlarge。

  3. Worker节点扩缩容。当使用资源配额时,单击image图标,Worker节点支持弹性扩缩容。设定最大和最小实例数后,系统根据资源和负载自动调整运行实例数。

    在 Worker 行中,单击 GPU(卡数) 列的配置图标可修改 GPU 资源,单击行末的齿轮图标可进入节点设置。

    单击弹性伸缩配置,填写角色数量、GPU、CPU、内存大小,选择合适的伸缩策略,伸缩策略支持:

    • Default-节点最大化:系统会在有充足资源的情况下会尽可能将节点数量最大化。

    • RayAutoscaler-动态伸缩:仅支持Ray任务,系统会根据集群负载情况自动调整节点数量。

    • CloudMonitorMetric-云监控指标:系统会根据云监控指标自动调整节点数量(云监控指标支持配置CPU使用率、内存使用率、GPU算力使用率、GPU显存使用率的目标值)。

  4. 日志持久化。使用公共资源时,单击Ray日志采集可将Ray集群日志、框架日志及task日志持久化到OSS,便于后续调试分析。

  5. 参数配置完成后,单击确定

通过SDK提交

  1. 安装Python DLC SDK。

    pip install alibabacloud_pai_dlc20201203==1.4.0
  2. 提交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提交

  1. 下载DLC客户端工具,并完成用户认证。具体操作,请参见准备工作

  2. 提交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相关依赖或部分间接依赖不可用。建议在原镜像中使用pipconda重新安装ray[default]组件,或者尝试基于Ray官方镜像重新构建镜像。