文档

基于ACK创建Ray Cluster

更新时间:

开源框架Ray支持构建可扩展的人工智能(AI)和Python应用程序,广泛应用于机器学习领域。您可以在ACK集群上快速创建Ray Cluster,与阿里云日志服务SLS、Prometheus监控、Redis等快速集成,增强日志管理、可观测、高可用等能力。同时,Ray autoscaler与ACK autoscaler弹性功能的结合能更充分地发挥云的弹性能力,提高计算资源供给效率和性价比。

什么是Ray?

Ray是一个开源框架,支持构建可扩展的人工智能(AI)和Python应用程序,还提供了简单直观的API简化分布式计算,便于便捷、高效地编写并行和分布式Python应用程序,广泛应用于机器学习领域。Ray的统一计算框架由Ray AI libraries、Ray Core和Ray Cluster三层组成。

image.svg

展开查看计算框架的详细介绍

Ray AI libraries

使用Python语言的开源特定领域库集,为ML工程师、数据科学家和研究人员提供了一个可扩展且统一的ML应用程序工具包。

Ray Core

开源的Python通用分布式计算库,便于机器学习工程师和Python开发人员扩展Python应用程序并加速机器学习。Ray Core包含Task(工作线程中异步执行的函数)、Actor(参与者,将Ray API从Task扩展到Object)、Object(Ray中的Task和Actor都在Object上创建和计算)三个核心概念。更多信息,请参见Ray FrameworkWhat is Ray Core?

image.png

Ray Cluster

Ray Cluster由一个Head节点和若干个Worker节点组成。Head节点负责协调和管理Ray Cluster;Worker节点负责具体计算任务的执行。Worker节点通过网络连接Head节点进行协同和通信。Ray Cluster可以部署在物理机、虚拟机、Kubernetes以及各种云环境之上。更多信息,请参见Ray Cluster OverviewKey Concepts

如需在生产环境中跨多台机器部署Ray应用,您需要先部署一个由Head节点和Worker节点构成的Ray Cluster。Ray节点以Pod的形式在Kubernetes上运行。您可以使用Ray自带的Autoscaler功能实现弹性扩缩。

如需在Kubernetes环境下部署Ray Cluster,推荐您使用Kuberay快速搭建。更多信息,请参见Getting Started with KubeRay — Ray 2.9.1

一个Ray Cluster的基本架构如下。image.svg

Ray on Kubernetes

KubeRay Operator提供了一种Kubernetes原生的方式管理Ray Cluster。您可以通过KubeRay Operator在Kubernetes(包括阿里云ACK)环境中部署Ray Cluster。安装KubeRay Operator时需要部署Operator Deployment和RayCluster、RayJob和RayService的CRD。

将Ray部署在Kubernetes上能够极大地简化分布式应用程序的部署与管理。优势如下。更多信息,请参见Ray on Kubernetes

  • 弹性伸缩:Kubernetes能够根据集群工作负载自动伸缩节点数量。与Ray autoscaler集成后,您可以根据工作负载实现Ray Cluster的动态伸缩,优化资源利用率,轻松管理大规模分布式应用程序。

  • 容错性:Ray本身设计了容错机制。在Kubernetes上运行时,该特性得以增强。如果某个Ray节点失败,Kubernetes会自动替换失败节点,保证集群的稳定性和可用性。

  • 资源管理:在Kubernetes中,您可以通过资源请求(Request)和限制(Limit),精细地控制和管理Ray节点使用的资源,例如CPU和内存,以更有效地利用集群资源,避免资源浪费。

  • 简化部署:Kubernetes提供了一套统一的部署、管理和监控容器化应用的机制。通过Kubernetes部署Ray Cluster,可以简化配置和管理流程,确保在不同环境中(开发、测试、生产)部署的一致性。

  • 服务发现和负载均衡:Kubernetes能够提供服务发现和负载均衡。Ray节点之间的通信以及客户端到Ray Cluster的连接都可以通过Kubernetes实现自动管理,从而简化网络配置并提高性能。

  • 多租户支持:Kubernetes中的命名空间可以实现多用户、多团队在同一个Kubernetes集群中同时运行各自的Ray Cluster且互不干扰,便于资源共享。

  • 监控和日志:Kubernetes集成提供监控和日志的可观测能力,可以跟踪Ray Cluster的状态和性能。例如,您可以使用Prometheus和Grafana监控集群的性能指标。

  • 兼容性:Kubernetes是云原生生态系统的核心,与多种云服务提供商和技术栈兼容。通过Kubernetes部署Ray Cluster后,可以在不同的云平台或混合云环境之间快速迁移和扩展。

Ray on ACK

容器服务 Kubernetes 版是全球首批通过Kubernetes一致性认证的容器服务平台,提供高性能的容器应用管理服务,支持企业级Kubernetes容器化应用的生命周期管理。结合ACK的云原生化部署方式,您可以通过KubeRay在ACK集群上快速创建Ray Cluster。

  • 与阿里云SLS日志、ARMS Prometheus监控、Redis等产品无缝对接,可以增强日志管理、可观测和高可用等能力。

  • Ray autoscaler与ACK autoscaler的弹性功能相结合,可以充分发挥云的弹性能力,按需提供计算资源。

image.png

计费说明

本文在ACK集群上创建Ray Cluster后,与阿里云日志服务SLS、Prometheus监控、Redis等快速集成,以增强日志管理、可观测、高可用等能力。除ACK本身产生的费用外,其他产品也会根据使用的资源产生相应的费用。关于其他产品的计费说明,请参见:

前提条件

  • 已创建ACK集群Pro版 , 且符合以下要求。

    关于如何创建集群,请参见创建Kubernetes托管版集群;如需升级集群版本,请参见升级ACK集群

    • 集群版本:v1.24及以上。

    • 节点规格:已配置一台8 CPU 32 GB规格及以上的节点。

      测试环境可使用推荐的最低规格;生产环境中需以实际情况为准。如需使用GPU节点,请配置GPU节点。关于ECS支持的实例规格,请参见实例规格族

    • 已开启日志服务SLS。

    • 已开启阿里云可观测监控Prometheus版。

  • 已通过kubectl连接Kubernetes集群。具体操作,请参见获取集群KubeConfig并通过kubectl工具连接集群

  • 已在本地安装kubectlHelm

  • (可选)已创建阿里云云数据库Redis版实例,且满足以下要求。

    本文使用Redis实例实现Ray Cluster的容错性和高可。您可按需创建。

    • 新建的云数据库Redis版实例需要与本文使用的ACK集群Pro版处于同Region、同VPC。具体操作,请参见步骤1:创建实例

    • 添加白名单分组,允许VPC地址段访问。具体操作,请参见步骤2:设置白名单

    • 获得Redis实例的连接地址(推荐使用专有连接地址)。具体操作,请参见查看连接地址

    • 获得Redis实例的密码。具体操作,请参见修改或重置密码

步骤一:部署ack-kuberay-operator组件

ACK集群应用市场提供ack-kuberay-operator组件。该组件集成了社区的KubeRay组件,并在其基础上进行了能力增强和安全权限收敛。

部署ack-kuberay-operator

  1. 登录容器服务管理控制台,在左侧导航栏选择市场 > 应用市场

  2. 应用市场页面,单击大数据/AI页签,然后单击ack-kuberay-operator,并在ack-kuberay-operator页面单击一键部署

  3. 在面板的基本信息页签,选择目标集群后,单击下一步

  4. 参数配置页签,确认Chart 版本参数信息后,单击确定

    部署成功后,页面跳转至Helm页面,供您查看ack-kuberay-operator的Helm组件信息。

校验ack-kuberay-operator是否运行

执行以下命令,查看kuberay-system命名空间下的Operator Pod状态是否为running

kubectl get pod -n kuberay-system

预期输出如下,表明ack-kuberay-operator已安装成功。

NAME                                   READY   STATUS    RESTARTS   AGE
ack-kuberay-operator-88c879859-f467l   1/1     Running   0          3m48s

步骤二:通过ack-ray-cluster部署Ray Cluster

ack-ray-cluster组件增加了额外的Value配置,可以与阿里云云产品集成,例如阿里云日志服务SLS、Prometheus监控、Redis等。您可以使用ack-ray-cluster组件部署Ray Cluster,用于执行具体的Ray任务。

本步骤以在raycluster命名空间,创建名为myfirst-ray-cluster的Ray Cluster为例。

  1. 执行以下命令,增加aliyunhub helm repo源。

    helm repo add aliyunhub https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
    helm repo update aliyunhub
  2. 执行以下命令,安装ack-ray-clusterChart包。

    helm search repo ack-ray-cluster

    预期输出如下,表明ack-ray-clusterChart包已安装成功。

    NAME                     	CHART VERSION	APP VERSION	DESCRIPTION
    aliyunhub/ack-ray-cluster	1.0.0        	1.0.0      	A ray cluster for Alibaba Cloud
    说明

    默认安装的ack-ray-cluster自动开启了KubeRay的Autoscaler功能。Raycluster默认使用Ray社区官方镜像rayproject/ray:2.7.0。其他配置,请查看ack-ray-clusterChart包中的Value配置。

  3. 执行以下命令,设置环境变量。

    export RAY_CLUSTER_NAME='myfirst-ray-cluster'
    export RAY_CLUSTER_NS='raycluster'
  4. 执行以下命令,创建命名空间。

    kubectl create ns ${RAY_CLUSTER_NS}

    预期输出如下,表明命名空间创建成功。

    namespace/raycluster created
  5. 执行以下命令,在${RAY_CLUSTER_NS}命名空间下创建RayCluster。

    helm install ${RAY_CLUSTER_NAME} aliyunhub/ack-ray-cluster -n ${RAY_CLUSTER_NS}

    预期输出如下,表明Ray Cluster创建成功。

    NAME: myfirst-ray-cluster
    LAST DEPLOYED: Tue Feb  6 09:48:29 2024
    NAMESPACE: raycluster
    STATUS: deployed
    REVISION: 1
    TEST SUITE: None
  6. 执行以下命令,查看ACK集群中Ray Cluster、Service和Pod资源是否成功创建。

    1. 查看Ray Cluster实例。

      kubectl get rayclusters.ray.io -n ${RAY_CLUSTER_NS}

      预期输出如下,表明Ray Cluster实例创建成功。

      NAME                  DESIRED WORKERS   AVAILABLE WORKERS   STATUS   AGE
      myfirst-ray-cluster                                                  49s
    2. 查看Service资源。

      kubectl get svc -n ${RAY_CLUSTER_NS}

      预期输出如下,表明Service创建成功。

      NAME                           TYPE        CLUSTER-IP       EXTERNAL-IP   PORT(S)                                         AGE
      myfirst-ray-cluster-head-svc   ClusterIP   192.168.36.189   <none>        10001/TCP,8265/TCP,8080/TCP,6379/TCP,8000/TCP   82s
    3. 查看Ray Cluster的Pod信息。

      kubectl get pod -n ${RAY_CLUSTER_NS}

      预期输出如下,表明Ray Cluster的Pod正常运行中。

      NAME                                      READY   STATUS     RESTARTS   AGE
      ray-cluster-01-head-zx88p                 2/2     Running    0          27s
      ray-cluster-01-worker-workergroup-nt9wv   1/1     Running    0          27s
  7. (可选)执行以下命令,在default命名空间下创建名为mysecond-ray-cluster的第二个Ray Cluster。

    说明

    ack-ray-cluster组件允许用户在ACK集群中创建多个RayCluster。

    helm install mysecond-ray-cluster aliyunhub/ack-ray-cluster 

(可选)步骤三:在Ray Cluster中集成SLS

您可以在Ray Cluster中集成阿里云日志服务SLS,实现日志的持久化存储。

  1. 执行以下命令,创建一个全局的AliyunLogConfig资源对象,使集群中的Logtail组件自动收集Ray Cluster的Pod产生的日志,并将其存入对应的SLS Project中。

    cat <<EOF | kubectl apply -f -
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      name: rayclusters
      namespace: kube-system
    spec:
       # 设置Logstore名称。如果您所指定的Logstore不存在,日志服务会自动创建。
      logstore: rayclusters
      # 设置Logtail配置。
      logtailConfig:
        # 设置采集的数据源类型。采集文本日志时,需设置为file。
        inputType: file
        # 设置Logtail配置的名称,必须与资源名(metadata.name)相同。
        configName: rayclusters
        inputDetail:
          # 指定通过极简模式采集文本日志。
          logType: common_reg_log
          # 设置日志文件所在路径。
          logPath: /tmp/ray/session_*-*-*_*/logs
          # 设置日志文件的名称。支持通配符星号(*)和半角问号(?),例如log_*.log。
          filePattern: "*.*"
          # 采集容器的文本日志时,需设置dockerFile为true。
          dockerFile: true
          #设置容器过滤条件。
          advanced:
            k8s:
              IncludeK8sLabel:
                ray.io/is-ray-node: "yes"
              ExternalK8sLabelTag:
                ray.io/cluster: "_raycluster_name_"
          			ray.io/node-type : "_node_type_"
    EOF

    参数

    描述

    logPath

    收集Pod中/tmp/ray/session_*-*-*_*/logs目录下的所有日志,可自定义路径。

    advanced.k8s.ExternalK8sLabelTag

    在收集的日志中增加Tag索引,便于查找日志。默认新增_raycluster_name__node_type_两个Tag。

    关于AliyunLogConfig参数配置的更多信息,请参见通过DaemonSet-CRD方式采集容器日志。该服务收费,具体费用,请参见计费概述

  2. 登录容器服务管理控制台,在左侧导航栏单击集群

  3. 集群列表页面,单击目标集群名称,然后在左侧导航栏,选择集群信息

  4. 集群信息页面,单击集群资源,然后单击日志服务 Project右侧的链接进入对应的SLS Project。

  5. 在Project中选择rayclusters对应的Logstore并查看日志内容。

    您可以根据Tag,例如_raycluster_name_,查看不同Ray Cluster的日志。

    image

(可选)步骤四:在Ray Cluster中集成阿里云Prometheus监控

ack-ray-cluster组件集成了阿里云Prometheus监控。如果您需要使用raycluster集群监控功能,可参见以下步骤安装ack-ray-cluster。关于Prometheus监控功能的更多信息,请参见阿里云Prometheus监控

  1. 执行以下命令,安装ack-ray-cluster,并将values中的armsPrometheus.enable值设置为true

    helm uninstall ${RAY_CLUSTER_NAME} -n ${RAY_CLUSTER_NS}
    helm install ${RAY_CLUSTER_NAME} aliyunhub/ack-ray-cluster -n ${RAY_CLUSTER_NS} --set armsPrometheus.enable=true
  2. 登录ARMS控制台

  3. 在左侧导航栏单击接入中心,在基础设置页面,搜索并选中Ray,然后在Ray面板选择上文新建的集群,单击确定

  4. 接入成功后,单击接入管理,跳转至ARMS接入管理页面。

  5. 组件管理页签,单击组件类型区域的大盘,选择Ray Cluster

  6. 在大盘中选择对应NamespaceRayClusterNameSessionName进行过滤,查看Ray Cluster中运行中任务的监控数据。image.png

(可选)步骤五:开启容错能力

Ray Cluster GCS(Global Control Service)组件用于管理Ray Cluster集群级别的元数据。GCS将所有数据存储在内存中,默认缺乏容错能力(Fault Toleration)。因此,一旦GCS发生故障,可能导致整个Ray Cluster失效。为了使GCS具备容错能力,Ray Cluster需要配备一个高可用性的Redis实例。当GCS重启时,GCS可以从Redis实例中检索所有数据并恢复其常规功能。ack-ray-cluster组件支持集成云数据库Redis版,提供Ray Cluster GCS容错能力。更多信息,请参见KubeRay GCS Fault Toleration ConfigGCS Fault Toleration in KubeRay

  1. 执行以下命令,手动创建Secret,用于保存阿里云云数据库Redis版实例的RAY_REDIS_ADDRESSREDIS_PASSWORD信息。

    请将REDIS_PASSWORDRAY_REDIS_ADDRESS对应的取值替换为您Redis实例的连接地址和密码。其中,RAY_REDIS_ADDRESS地址格式为redis://{阿里云Redis连接地址}:6379,请按实际情况进行替换。关于如何获得Redis实例的密码,请参见修改或重置密码

    export REDIS_PASSWORD='your redis password'
    export RAY_REDIS_ADDRESS='redis://<阿里云Redis连接地址>:6379' 
    kubectl create secret generic ${RAY_CLUSTER_NAME}-raycluster-redis -n ${RAY_CLUSTER_NS} --from-literal=address=${RAY_REDIS_ADDRESS} --from-literal=password=${REDIS_PASSWORD}
    说明

    Secret命名规范为${RAY_CLUSTER_NAME}-raycluster-redis,请勿手动修改。

  2. 执行以下命令,创建Ray Cluster。

    helm uninstall ${RAY_CLUSTER_NAME} -n ${RAY_CLUSTER_NS}
    helm install ${RAY_CLUSTER_NAME} aliyunhub/ack-ray-cluster -n ${RAY_CLUSTER_NS} --set armsPrometheus.enable=true --set gcsFaultTolerance.enable=true

    gcsFaultTolerance.enable设置为true时,会自动为Ray Cluster实例添加ray.io/ft-enabled: "true"注解,用于开启GCS fault tolerance能力,并为Ray Cluster实例通过Env挂载Secret的信息。

  3. 执行以下命令,查看Ray Cluster。

    kubectl get rayclusters.ray.io ${RAY_CLUSTER_NAME} -n ${RAY_CLUSTER_NS}
    # 预期输出:
    NAME           				DESIRED WORKERS   AVAILABLE WORKERS   STATUS   AGE
    myfirst-ray-cluster   0                 0                   1        11m
  4. 执行以下命令,查看对应的Ray Cluster的Pod。

    kubectl get pod -n ${RAY_CLUSTER_NS}
    # 预期输出:
    NAME                      			 READY   STATUS              RESTARTS   AGE
    myfirst-ray-cluster-head-vrltd   2/2     Running             0          12m
  5. 查看Redis实例的数据。具体操作,请参见通过DMS管理Redis数据库image

    预期输出表明,Ray Cluster的GCS中的信息已经被存储到了Redis中。当卸载此Ray Cluster时,相关的GCS信息也会在Redis中自动删除。

相关文档

联系我们

联系我们

  • 本页导读 (1)