全部產品
Search
文件中心

Platform For AI:快速提交Ray任務

更新時間:Nov 29, 2024

PAI DLC支援基於Ray架構的任務類型,您可以直接提交Ray架構的訓練指令碼至DLC中進行訓練,無需搭建Ray叢集或進行底層Kubernetes的配置。同時,您可以享受DLC提供的完善日誌和指標監控等服務,協助您更好的管理工作。本文為您介紹如何提交Ray類型的訓練任務。

前提條件

如果使用SDK提交訓練任務,需要配置環境變數。詳情請參見安裝Credentials工具在Linux、macOS和Windows系統配置環境變數

準備工作

準備節點鏡像

Ray叢集包含Head和Worker兩種節點類型,DLC任務會同時使用指定的節點鏡像來搭建Head和Worker節點容器。建立任務後,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叢集可配置的任務節點類型為Head和Worker。配置資源時,Head節點數量必須為1,僅用於運行entrypoint指令碼,不會被用作Ray Worker節點。通常還需至少一個Worker節點,但非強制。每個Ray任務自動產生一個Submitter節點執行啟動命令,並可通過其日誌查看任務日誌。預付費任務中,Submitter節點共用少量使用者資源;後付費任務會產生最小可用的資源類型節點。

    • 資源數量:

      Ray叢集Worker節點上的Logical Resources與您在提交任務時配置的實體資源一致。例如,當您配置了1個8卡的GPU節點時,Ray叢集Worker節點預設的資源大小也為8卡GPUs。

      資源配置需匹配任務需求,推薦使用少量大節點而非大量小節點。每個節點建議至少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相關依賴或部分間接依賴不可用。建議在原鏡像中使用pip或conda重新安裝ray[default]組件,或者嘗試基於Ray官方鏡像重新構建鏡像。