本文基于E-HPC自定义Ray集群方案,给出了具体的Ray集群环境部署过程,并基于搭建好的Ray集群,介绍了基于PyTorch的图像分类批量推理基础实践。对于Ray分布式计算框架而言,其不仅适用于AI场景的分布式训练、仿真评估、策略服务执行任务,也可通用于大数据及各类大规模批量计算场景,支持用户结合具体业务场景进行灵活的功能定制研发。
背景信息
Ray 是一个通用的开源分布式计算框架,特别适用于机器学习、强化学习和其他计算密集型任务。它提供了一套简单、灵活、高效、通用的API,来帮助开发者轻松构建可扩展的分布式应用。
本文结合E-HPC自定义集群及模板,提供了一套Ray集群的高效部署使用方式,并支持云上CPU、GPU等各类资源扩容缩容,降低AI应用研发人员的学习维护成本,提升行业研究效率。
准备工作
选择以下任一方式创建Ray集群。
重要目前支持创建Ray集群的地域包括杭州、上海和北京。
本文使用的集群配置示例如下:
配置项
配置
系列
标准版
部署模式
自定义集群
集群类型
CUSTOM
节点配置
包含
1
个登录节点和1
个计算节点,规格如下:登录节点:采用ecs.c8a.xlarge实例规格,该规格配置为4 vCPU,8 GiB内存。
计算节点:采用ecs.c8a.xlarge实例规格,该规格配置为4 vCPU,8 GiB内存。
重要创建集群后,扩容Ray集群计算节点。具体操作,请参见创建节点。
说明请根据实际业务需求,调整登录节点和计算节点的实例规格,以提高或降低资源配置。
实例安全组
放行5901(VNC访问端口)、8265(Ray Dashboard访问端口)。具体操作,请参见管理安全组规则。
集群镜像
登录节点/计算节点:ray_ubuntu20.04_v1.0
说明在社区镜像里选择ray_ubuntu20.04_v1.0
系统名称
Ubuntu 20.04 64位
步骤一:查看集群状态
通过Workbench远程连接Ray集群登录节点。更多信息,请参见使用Workbench连接实例。
执行命令
ray status
查看集群状态。ray status
Ray Dashboard查看。
通过VNC连接,在浏览器上输入地址
IP:8265
查看Genome图形桌面。更多信息,请参见使用VNC登录实例。(可选)若需公网访问可单击
配置弹性公网IP。
步骤二:Pytorch图像分类批量推理
基于创建的Ray集群提交Pytorch推理任务主要有两种方式。
Ray job方式提交(推荐)
说明基于Ray job方式,适合批处理及无需保持连接的场景;在Ray集群Head节点,或者与Head网络及8265端口连通的远程机器上执行均可。
单个任务执行。
通过Workbench远程连接Ray集群登录节点。更多信息,请参见使用Workbench连接实例。
下载测试文件images.tar并解压至
/home/test
目录下。tar -zxvf images.tar -C /home/test/
下载ray_image_classify.py脚本至
/home/test
目录下。执行以下命令,查看Ray集群基础信息。
python -c "import ray; ray.init(); print(ray.cluster_resources())"
单个Ray job提交,替换IP为登录节点IP。指定
/home/test/images
为输入文件路径,/home/test/images_prediction
为输出路径。ray job submit --address http://IP:8265 --working-dir . -- /usr/local/fce/Python-3.11.9env/bin/python ray_image_classify.py /home/test/images /home/test/images_prediction
执行成功的输出如下:
分类预测的数据及结果如下:images为输入图片数据,images_prediction为输出数据,图片预测的分类包括tench,bittern及coho等。
通过VNC连接,在对应输出目录下查看。更多信息,请参见使用VNC登录实例。
批量任务执行。
基于Pytorch分类images目录下的所有图像为例(作业数对应子目录数量),批量提交ray作业并输出分类预测结果。
在
/home/test/
目录下创建ray_jobs_batch.sh
脚本。并替换脚本中export RAY_ADDRESS参数的IP
为登录节点IP
。#!/bin/bash # 输入和输出目录 input_dir=$1 output_dir=$2 export RAY_ADDRESS="http://IP:8265" # 检查输入目录是否存在 if [ ! -d "$input_dir" ]; then echo "Input directory does not exist: $input_dir" exit 1 fi # 检查输出的目录是否存在 if [ ! -d "$output_dir" ]; then echo "Input directory does not exist, creating.." mkdir -p "$output_dir" fi # 遍历 input_dir 下的所有子目录 for subdir in "$input_dir"/*; do if [ -d "$subdir" ]; then subdir_name=$(basename "$subdir") input_subdir="${input_dir}/${subdir_name}" output_subdir="${output_dir}/${subdir_name}_prediction" # 提交 Ray 任务 echo "Submitting Ray job for directory: $input_subdir" ray job submit --no-wait --working-dir . -- /usr/local/fce/Python-3.11.9env/bin/python ray_image_classify.py $input_subdir $output_subdir fi done echo "All Ray jobs have been submitted."
执行脚本
ray_jobs_batch.sh
。source ray_jobs_batch.sh /home/test/images /home/test/images_prediction
执行命令
ray job list
查看任务列表。ray job list
也可通过Ray Server Dashboard查看,作业提交运行中如下:
作业运行完成如下:
分类预测的数据及结果如下:
images_input1/images_input2/images_input3为输入图片数据,images_input1_prediction/images_input2_prediction/images_input3_prediction为输出数据,图片预测的分类包括tench,barracouta及coho等。
images_input1_prediction中预测的鲤鱼分类图片示例如下:
Ray Client方式提交
说明基于Ray Client方式,主要适用于交互式的开发调试任务场景,需要保持客户端连接。
在
/home/test/
目录下创建raytask.py
脚本,内容如下。import ray ray.init(address='auto') # 定义任务。 @ray.remote def square(x): return x * x # 启动四个并行的任务。 futures = [square.remote(i) for i in range(4)] # 获取结果。 print(ray.get(futures)) # -> [0, 1, 4, 9]
执行脚本
raytask.py
。python raytask.py