RayJob 批量推理示例#

此示例展示了如何使用 RayJob 自定义资源在 Ray 集群上运行图像分类工作负载的批量推理作业。有关代码的完整解释,请参阅 使用 HuggingFace Vision Transformer 进行图像分类批量推理

先决条件#

您必须有一个正在运行的 Kubernetes 集群,kubectl 配置为使用它,并且有可用的 GPU。本示例提供了一个在 Google Kubernetes Engine (GKE) 上设置必要 GPU 的简要教程,但您可以使用任何带有 GPU 的 Kubernetes 集群。

步骤 0:在 GKE 上创建一个 Kubernetes 集群(可选)#

如果你已经有一个带有GPU的Kubernetes集群,你可以跳过这一步。

否则,请遵循 本教程,但在创建 GPU 节点池时,使用以下命令在 GKE 上创建一个包含四个 Nvidia T4 GPU 的 Kubernetes 集群:

gcloud container node-pools create gpu-node-pool \
  --accelerator type=nvidia-tesla-t4,count=4,gpu-driver-version=default \
  --zone us-west1-b \
  --cluster kuberay-gpu-cluster \
  --num-nodes 1 \
  --min-nodes 0 \
  --max-nodes 1 \
  --enable-autoscaling \
  --machine-type n1-standard-64

此示例使用了四块 Nvidia T4 GPU。机器类型为 n1-standard-64,它具有 64 个 vCPU 和 240 GB 内存

步骤 1:安装 KubeRay 操作员#

按照 这个文档 从 Helm 仓库安装最新稳定的 KubeRay 操作员。如果你正确设置了 GPU 节点池的污点,KubeRay 操作员 Pod 必须在 CPU 节点上。

步骤 2:提交 RayJob#

使用 ray-job.batch-inference.yaml 创建 RayJob 自定义资源。

使用 curl 下载文件:

curl -LO https://raw.githubusercontent.com/ray-project/kuberay/v1.0.0/ray-operator/config/samples/ray-job.batch-inference.yaml

请注意,RayJob 规范包含了一个 RayCluster 的规范。本教程使用了一个带有 4 个 GPU 的单节点集群。对于生产用例,请使用一个多节点集群,其中头节点没有 GPU,这样 Ray 可以自动在不会干扰头节点上关键 Ray 进程的工作节点上调度 GPU 工作负载。

请注意 RayJob 规范中的以下字段,这些字段指定了 Ray 镜像和 Ray 节点的 GPU 资源:

        spec:
          containers:
            - name: ray-head
              image: rayproject/ray-ml:2.6.3-gpu
              resources:
                limits:
                  nvidia.com/gpu: "4"
                  cpu: "54"
                  memory: "54Gi"
                requests:
                  nvidia.com/gpu: "4"
                  cpu: "54"
                  memory: "54Gi"
              volumeMounts:
                - mountPath: /home/ray/samples
                  name: code-sample
          nodeSelector:
            cloud.google.com/gke-accelerator: nvidia-tesla-t4 # This is the GPU type we used in the GPU node pool.

要提交作业,请运行以下命令:

kubectl apply -f ray-job.batch-inference.yaml

使用 kubectl describe rayjob rayjob-sample 检查状态。

示例输出:

[...]
Status:
  Dashboard URL:          rayjob-sample-raycluster-j6t8n-head-svc.default.svc.cluster.local:8265
  End Time:               ...
  Job Deployment Status:  Complete
  Job Id:                 rayjob-sample-ft8lh
  Job Status:             SUCCEEDED
  Message:                Job finished successfully.
  Observed Generation:    2
  ...

要查看日志,首先使用 kubectl get pods 找到运行作业的 pod 名称。

示例输出:

NAME                                        READY   STATUS      RESTARTS   AGE
kuberay-operator-8b86754c-r4rc2             1/1     Running     0          25h
rayjob-sample-raycluster-j6t8n-head-kx2gz   1/1     Running     0          35m
rayjob-sample-w98c7                         0/1     Completed   0          30m

Ray 集群仍在运行,因为 RayJob 规范中未设置 shutdownAfterJobFinishes。如果将 shutdownAfterJobFinishes 设置为 true,则在作业完成后集群将关闭。

接下来,运行:

kubectl logs rayjob-sample-w98c7

获取 RayJobentrypoint 命令的标准输出。示例输出:

[...]
Running: 62.0/64.0 CPU, 4.0/4.0 GPU, 955.57 MiB/12.83 GiB object_store_memory:   0%|          | 0/200 [00:05<?, ?it/s]
Running: 61.0/64.0 CPU, 4.0/4.0 GPU, 999.41 MiB/12.83 GiB object_store_memory:   0%|          | 0/200 [00:05<?, ?it/s]
Running: 61.0/64.0 CPU, 4.0/4.0 GPU, 999.41 MiB/12.83 GiB object_store_memory:   0%|          | 1/200 [00:05<17:04,  5.15s/it]
Running: 61.0/64.0 CPU, 4.0/4.0 GPU, 1008.68 MiB/12.83 GiB object_store_memory:   0%|          | 1/200 [00:05<17:04,  5.15s/it]
Running: 61.0/64.0 CPU, 4.0/4.0 GPU, 1008.68 MiB/12.83 GiB object_store_memory: 100%|██████████| 1/1 [00:05<00:00,  5.15s/it]

2023-08-22 15:48:33,905 WARNING actor_pool_map_operator.py:267 -- To ensure full parallelization across an actor pool of size 4, the specified batch size should be at most 5. Your configured batch size for this operator was 16.
<PIL.Image.Image image mode=RGB size=500x375 at 0x7B37546CF7F0>
Label:  tench, Tinca tinca
<PIL.Image.Image image mode=RGB size=500x375 at 0x7B37546AE430>
Label:  tench, Tinca tinca
<PIL.Image.Image image mode=RGB size=500x375 at 0x7B37546CF430>
Label:  tench, Tinca tinca
<PIL.Image.Image image mode=RGB size=500x375 at 0x7B37546AE430>
Label:  tench, Tinca tinca
<PIL.Image.Image image mode=RGB size=500x375 at 0x7B37546CF7F0>
Label:  tench, Tinca tinca
2023-08-22 15:48:36,522 SUCC cli.py:33 -- -----------------------------------
2023-08-22 15:48:36,522 SUCC cli.py:34 -- Job 'rayjob-sample-ft8lh' succeeded
2023-08-22 15:48:36,522 SUCC cli.py:35 -- -----------------------------------