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基礎組件的官方鏡像供您使用。
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目前暫不支持閑時資源與競價資源,不支持任何搶占任務類型,任務本身也無法被搶占。
公共資源
框架
框架類型。
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。
參數配置完成后,單擊確定。
通過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提交任務的更多配置方法,請參見提交命令。
常見問題
為什么Ray任務因環境準備耗時過長而超時失敗?
建議檢查Head節點的事件日志,如果顯示錯誤Readiness probe failed...,可能意味著該鏡像缺失Readiness check相關依賴或部分間接依賴不可用。建議在原鏡像中使用pip或conda重新安裝ray[default]組件,或者嘗試基于Ray官方鏡像重新構建鏡像。