VKE场景下,可以通过以下途径,向RayCluster方式提交Ray作业,也可参考官网 进行操作:
kubectl方式提交:需要安装kubectl工具,且配置kubernetes的连接信息。
采用Ray Client SDK(如JobSubmissionClient)提交:需要部署Ray环境。
参考连接VKE集群安装kubectl和配置VKE集群连接信息
获取RayCluster的Head所在的pod名称
export NAMESPACE=<命名空间> APPNAME=<RayCluster应用名称> HEAD_POD=$(kubectl get pods --selector=ray.io/node-type=head -o custom-columns=POD:metadata.name --no-headers -n $NAMESPACE |grep $APPNAME) echo $HEAD_POD
示例中NAMESPACE是RayCluster所在VKE集群中的命名中间。APPNAME是RayCluster的名称。
# 打印集群资源信息 kubectl exec -it $HEAD_POD -n $NAMESPACE -- python -c "import ray; ray.init(); print(ray.cluster_resources())"
# 将本地python文件上传到head pod中 echo ' import ray ray.init() print(ray.cluster_resources())' > test.py kubectl exec -it $HEAD_POD -n $NAMESPACE -c ray-head -- mkdir -p /home/ray/work_dir kubectl cp test.py -n $NAMESPACE -c ray-head $HEAD_POD:/home/ray/work_dir # 执行python文件 kubectl exec -n $NAMESPACE -it $HEAD_POD -- ray job submit --working-dir /home/ray/work_dir -- python /home/ray/work_dir/test.py
kubectl exec -n $NAMESPACE -it $HEAD_POD -- ray job status <jobID>
安装Ray环境。EMR中提供Ray的镜像列表,可以在Docker中部署Ray的环境。
安装Ray环境时,Ray的版本信息需与RayCluster使用的版本一致。
通过下面的命令,获取RayCluster的Head的IP地址,或者手动获取Head的IP地址:
export NAMESPACE=<命名空间> APPNAME=<RayCluster应用名称> HEAD_POD=$(kubectl get pods --selector=ray.io/node-type=head -o custom-columns=POD:metadata.name --no-headers -n $NAMESPACE |grep $APPNAME) IP=$(kubectl describe pod $HEAD_POD -n $NAMESPACE |grep IP |awk '{print $2}' | head -1)
示例中NAMESPACE和APPNAME需根据实际情况填写。
进入Ray环境中,配置export IP=<Head的IP地址>
。然后执行python命令,采用交互式方式执行下面的python代码块
import ray import os head_ip = os.getenv("IP") ray.init(address="ray://{}:10001".format(head_ip)) print(ray.cluster_resources())
其中IP地址是Head的IP,需确保执行环境可以访问RayCluster,可以通过命令telnet $IP 10001
确认网络是否打通。
通过JobSubmissionClient方式提交下面的代码段。也可以采用Ray Cli方式提交。
创建目录,将作业脚本放在该目录下:
mkdir -p /tmp/ray_working_dir cd /tmp/ray_working_dir
编写ray作业脚本:ray_data_demo.py
import ray ds = ray.data.range(100) ds.show(limit=10)
定义SDK方式提交作业:job_submmiter.py
import os from ray.job_submission import JobSubmissionClient os.makedirs("/tmp/ray_working_dir", exist_ok=True) head_ip = os.getenv("IP") dashboard_url="http://{}:8265".format(head_ip) client = JobSubmissionClient(dashboard_url) job_id = client.submit_job( # Entrypoint shell command to execute entrypoint="python ray_data_demo.py", # Path to the local directory that contains the script.py file runtime_env={ "working_dir": "/tmp/ray_working_dir", } ) print(job_id) # 查看状态 job_status = client.get_job_status(job_id) print(job_status)
执行job_submmiter.py
python job_submmiter.py
提交Ray job后,会返回Job ID,这时可以通过下面shell命令查看作业状态
查看任务执行状态
export RAY_ADDRESS=http://$IP:8265 ray job status <jobID>