自定义Ray集群的Pytorch图像分类批量推理

本文基于E-HPC自定义Ray集群方案,给出了具体的Ray集群环境部署过程,并基于搭建好的Ray集群,介绍了基于PyTorch的图像分类批量推理基础实践。对于Ray分布式计算框架而言,其不仅适用于AI场景的分布式训练、仿真评估、策略服务执行任务,也可通用于大数据及各类大规模批量计算场景,支持用户结合具体业务场景进行灵活的功能定制研发。

背景信息

Ray 是一个通用的开源分布式计算框架,特别适用于机器学习、强化学习和其他计算密集型任务。它提供了一套简单、灵活、高效、通用的API,来帮助开发者轻松构建可扩展的分布式应用。

本文结合E-HPC自定义集群及模板,提供了一套Ray集群的高效部署使用方式,并支持云上CPU、GPU等各类资源扩容缩容,降低AI应用研发人员的学习维护成本,提升行业研究效率。

准备工作

  1. 选择以下任一方式创建Ray集群。

    重要

    目前支持创建Ray集群的地域包括杭州、上海和北京。

    1. 通过集群模板创建。具体操作,请参见模板创建

      image

    2. 通过手动创建集群。更多内容,请参见创建标准版集群

  2. 本文使用的集群配置示例如下:

    配置项

    配置

    系列

    标准版

    部署模式

    自定义集群

    集群类型

    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

    image

    系统名称

    Ubuntu 20.04 64

步骤一:查看集群状态

  1. 通过Workbench远程连接Ray集群登录节点。更多信息,请参见使用Workbench连接实例

    执行命令ray status查看集群状态。

    ray status

    image.png

  2. Ray Dashboard查看。

    1. 通过VNC连接,在浏览器上输入地址IP:8265查看Genome图形桌面。更多信息,请参见使用VNC登录实例

      image

    2. (可选)若需公网访问可单击实例ID > 绑定弹性公网配置弹性公网IP。

      image

步骤二:Pytorch图像分类批量推理

基于创建的Ray集群提交Pytorch推理任务主要有两种方式。

  1. Ray job方式提交(推荐)

    说明

    基于Ray job方式,适合批处理及无需保持连接的场景;在Ray集群Head节点,或者与Head网络及8265端口连通的远程机器上执行均可。

    1. 单个任务执行。

      1. 通过Workbench远程连接Ray集群登录节点。更多信息,请参见使用Workbench连接实例

      2. 下载测试文件images.tar并解压至/home/test目录下。

        tar -zxvf images.tar -C /home/test/
      3. 下载ray_image_classify.py脚本至/home/test目录下。

      4. 执行以下命令,查看Ray集群基础信息。

        python -c "import ray; ray.init(); print(ray.cluster_resources())"
      5. 单个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
      6. 执行成功的输出如下:

        image

        分类预测的数据及结果如下:images为输入图片数据,images_prediction为输出数据,图片预测的分类包括tench,bitterncoho等。

        image

      7. 通过VNC连接,在对应输出目录下查看。更多信息,请参见使用VNC登录实例

        image

    2. 批量任务执行。

      基于Pytorch分类images目录下的所有图像为例(作业数对应子目录数量),批量提交ray作业并输出分类预测结果。

      1. /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."
      2. 执行脚本ray_jobs_batch.sh

        source ray_jobs_batch.sh  /home/test/images  /home/test/images_prediction
      3. 执行命令ray job list查看任务列表。

        ray job list

        image

        也可通过Ray Server Dashboard查看,作业提交运行中如下:

        image

        作业运行完成如下:

        image

      4. 分类预测的数据及结果如下:

        images_input1/images_input2/images_input3为输入图片数据,images_input1_prediction/images_input2_prediction/images_input3_prediction为输出数据,图片预测的分类包括tench,barracoutacoho等。

        image

        images_input1_prediction中预测的鲤鱼分类图片示例如下:

        image.png

  2. Ray Client方式提交

    说明

    基于Ray Client方式,主要适用于交互式的开发调试任务场景,需要保持客户端连接。

    1. /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]
    2. 执行脚本raytask.py

      python raytask.py

      image