快速提交Ray任务

更新时间:2024-11-28 09:40:22

PAI DLC支持基于Ray框架的任务类型,您可以直接提交Ray框架的训练脚本至DLC中进行训练,无需搭建Ray集群或进行底层Kubernetes的配置。同时,您可以享受DLC提供的完善日志和指标监控等服务,帮助您更好的管理任务。本文为您介绍如何提交Ray类型的训练任务。

前提条件

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

准备工作

准备节点镜像

Ray集群包含HeadWorker两种节点类型,DLC任务会同时使用指定的节点镜像来搭建HeadWorker节点容器。创建任务后,DLC会自动构建Ray集群,并在准备就绪后,通过启动一个submitter节点向该集群提交任务,该节点也会使用相同的镜像。

Ray镜像版本应>=2.6,同时必须至少安装了ray[default]所包含的组件。支持使用的镜像如下:

  • PAI官方镜像:PAI平台提供了安装有Ray基础组件的官方镜像供您使用。image

  • 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目前暂不支持闲时资源与竞价资源,不支持任何抢占任务类型,任务本身也无法被抢占。

    公共资源

    框架

    框架类型。

    Ray

    任务资源

    • 任务节点数量:

      Ray集群可配置的任务节点类型为HeadWorker。配置资源时,Head节点数量必须为1,仅用于运行entrypoint脚本,不会被用作Ray Worker节点。通常还需至少一个Worker节点,但非强制。每个Ray任务自动生成一个Submitter节点执行启动命令,并可通过其日志查看任务日志。预付费任务中,Submitter节点共享少量用户资源;后付费任务会生成最小可用的资源类型节点。

    • 资源数量:

      Ray集群Worker节点上的Logical Resources与您在提交任务时配置的物理资源一致。例如,当您配置了18卡的GPU节点时,Ray集群Worker节点默认的资源大小也为8GPUs。

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

    • 节点数量:均为1。

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

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

通过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提交任务的更多配置方法,请参见提交命令

常见问题

为什么Ray任务因环境准备耗时过长而超时失败?

  • 检查Head节点的日志,观察Ray环境是否正常启动。如果没有则说明相关实例中Ray不可用,请参照准备工作章节准备支持Ray的镜像。

image.png

  • 建议检查Head节点的事件日志,如果显示错误Readiness probe failed...,可能意味着该镜像缺失Readiness check相关依赖或部分间接依赖不可用。建议在原镜像中使用pipconda重新安装ray[default]组件,或者尝试基于Ray官方镜像重新构建镜像。

  • 本页导读 (1)
  • 前提条件
  • 准备工作
  • 准备节点镜像
  • 准备启动命令和脚本文件
  • 提交训练任务
  • 通过控制台提交
  • 通过SDK提交
  • 通过CLI提交
  • 常见问题
  • 为什么Ray任务因环境准备耗时过长而超时失败?
AI助理

点击开启售前

在线咨询服务

你好,我是AI助理

可以解答问题、推荐解决方案等