RayService 快速入门#

先决条件#

本指南专注于 Ray Serve 多应用 API,该 API 自 Ray 版本 2.4.0 起可用。本指南主要关注 KubeRay v1.1.1 和 Ray 2.9.0 的行为。

  • Ray 2.4.0 或更新版本。

  • KubeRay 0.6.0, KubeRay nightly, 或更新版本。

什么是 RayService?#

RayService 管理这些组件:

  • RayCluster:管理 Kubernetes 集群中的资源。

  • Ray Serve 应用: 管理用户的应用。

RayService 提供了什么?#

  • Kubernetes 原生支持 Ray 集群和 Ray Serve 应用: 在使用 Kubernetes 配置定义 Ray 集群及其 Ray Serve 应用后,您可以使用 kubectl 来创建集群及其应用。

  • Ray Serve 应用程序的就地更新: 更多详情请参见 RayService

  • Ray 集群的零停机升级: 更多详情请参见 RayService

  • 高可用服务: 详情请参阅 RayService 高可用性

示例:使用 RayService 提供两个简单的 Ray Serve 应用程序#

步骤 1:使用 Kind 创建一个 Kubernetes 集群#

kind create cluster --image=kindest/node:v1.26.0

步骤 2:安装 KubeRay 操作员#

按照 此文档 从 Helm 仓库安装最新稳定版的 KubeRay 操作员。请注意,此示例中的 YAML 文件使用 serveConfigV2 来指定多应用程序 Serve 配置,该功能从 KubeRay v0.6.0 开始可用。

步骤 3:安装 RayService#

kubectl apply -f https://raw.githubusercontent.com/ray-project/kuberay/v1.1.1/ray-operator/config/samples/ray-service.sample.yaml

步骤 4:验证 Kubernetes 集群状态#

# Step 4.1: List all RayService custom resources in the `default` namespace.
kubectl get rayservice

# [Example output]
# NAME                AGE
# rayservice-sample   2m42s

# Step 4.2: List all RayCluster custom resources in the `default` namespace.
kubectl get raycluster

# [Example output]
# NAME                                 DESIRED WORKERS   AVAILABLE WORKERS   STATUS   AGE
# rayservice-sample-raycluster-6mj28   1                 1                   ready    2m27s

# Step 4.3: List all Ray Pods in the `default` namespace.
kubectl get pods -l=ray.io/is-ray-node=yes

# [Example output]
# ervice-sample-raycluster-6mj28-worker-small-group-kg4v5   1/1     Running   0          3m52s
# rayservice-sample-raycluster-6mj28-head-x77h4             1/1     Running   0          3m52s

# Step 4.4: List services in the `default` namespace.
kubectl get services

# NAME                                          TYPE        CLUSTER-IP      EXTERNAL-IP   PORT(S)                                                   AGE
# ...
# rayservice-sample-head-svc                    ClusterIP   10.96.34.90     <none>        10001/TCP,8265/TCP,52365/TCP,6379/TCP,8080/TCP,8000/TCP   4m58s
# rayservice-sample-raycluster-6mj28-head-svc   ClusterIP   10.96.171.184   <none>        10001/TCP,8265/TCP,52365/TCP,6379/TCP,8080/TCP,8000/TCP   6m21s
# rayservice-sample-serve-svc                   ClusterIP   10.96.161.84    <none>        8000/TCP                                                  4m58s

当 Ray Serve 应用程序健康且准备就绪时,KubeRay 为 RayService 自定义资源创建一个头部服务和一个 Ray Serve 服务。例如,第 4.4 步中的 rayservice-sample-head-svcrayservice-sample-serve-svc

步骤 5:验证 Serve 应用程序的状态#

# (1) Forward the dashboard port to localhost.
# (2) Check the Serve page in the Ray dashboard at http://localhost:8265/#/serve.
kubectl port-forward svc/rayservice-sample-head-svc 8265:8265
  • 有关 RayService 可观测性的更多详情,请参阅 rayservice-troubleshooting.md。以下是 Ray 仪表板中 Serve 页面的截图示例。Ray Serve 仪表板

步骤6:通过Kubernetes服务向Serve应用程序发送请求#

# Step 6.1: Run a curl Pod.
# If you already have a curl Pod, you can use `kubectl exec -it <curl-pod> -- sh` to access the Pod.
kubectl run curl --image=radial/busyboxplus:curl -i --tty

# Step 6.2: Send a request to the fruit stand app.
curl -X POST -H 'Content-Type: application/json' rayservice-sample-serve-svc:8000/fruit/ -d '["MANGO", 2]'
# [Expected output]: 6

# Step 6.3: Send a request to the calculator app.
curl -X POST -H 'Content-Type: application/json' rayservice-sample-serve-svc:8000/calc/ -d '["MUL", 3]'
# [Expected output]: "15 pizzas please!"

步骤 7:清理 Kubernetes 集群#

# Delete the RayService.
kubectl delete -f https://raw.githubusercontent.com/ray-project/kuberay/v1.1.1/ray-operator/config/samples/ray-service.sample.yaml

# Uninstall the KubeRay operator.
helm uninstall kuberay-operator

# Delete the curl Pod.
kubectl delete pod curl

下一步#

  • 请参阅 RayService 文档以获取 RayService 功能的完整列表,包括就地更新、零停机升级和高可用性。

  • 如果在使用过程中遇到任何问题,请参阅 RayService 故障排除指南

  • 更多 RayService 示例请参见 示例MobileNet 示例 是一个很好的起点,因为它不需要 GPU 并且易于在本地机器上运行。