全部產品
Search
文件中心

Container Service for Kubernetes:Ray在ACK叢集高效部署與最佳化實踐

更新時間:Nov 15, 2024

開源架構Ray支援構建可擴充的人工智慧(AI)和Python應用程式,廣泛應用於機器學習領域。您可以在ACK叢集上快速建立Ray Cluster,與阿里雲Log ServiceSLS、Prometheus監控、Redis等快速整合,增強日誌管理、可觀測、高可用等能力。同時,Ray autoscaler與ACK autoscaler的彈性功能結合能更充分地發揮雲的彈效能力,提高計算資源供給效率和性價比。

Ray簡介

Ray是一個開源架構,支援構建可擴充的人工智慧(AI)和Python應用程式,還提供了簡單直觀的API簡化分散式運算,便於高效地編寫並行和分布式Python應用程式,廣泛應用於機器學習領域。Ray的統一計算架構由Ray AI libraries、Ray Core和Ray Cluster三層組成。

image.svg

展開查看計算架構的詳細介紹

  1. Ray AI libraries

    使用Python語言的開源特定領域庫集,為ML工程師、資料科學家和研究人員提供了一個可擴充且統一的ML應用程式工具包。

  2. 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

  3. 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功能實現彈性擴縮。一個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

  • Auto Scaling: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

Container Service for Kubernetes是全球首批通過Kubernetes一致性認證的Container Service平台,提供高效能的容器應用管理服務,支援企業級Kubernetes容器化應用的生命週期管理。結合ACK的雲原生化部署方式,您可以通過KubeRay在ACK叢集上快速建立Ray Cluster。

  • 與阿里雲SLS日誌、ARMS Prometheus監控、Redis等產品無縫對接,可以增強日誌管理、可觀測和高可用等能力。

  • Ray autoscaler與ACK autoscaler的彈性功能相結合,可以充分發揮雲的彈效能力,按需提供計算資源。

image.png

計費說明

本文在ACK叢集上建立Ray Cluster後,與阿里雲Log ServiceSLS、Prometheus監控、Redis等快速整合,以增強日誌管理、可觀測、高可用等能力。

除ACK本身產生的費用外,其他產品也會根據使用的資源產生相應的費用。關於其他產品的計費說明,請參見:

1.環境準備

1.1 建立叢集

關於如何建立叢集,請參見建立ACK託管叢集;如需升級叢集版本,請參見手動升級叢集。建立ACK託管叢集Pro版且符合以下要求。

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

  • 節點規格:已配置一台8 CPU 32 GB規格及以上的節點。

  • 測試環境可使用推薦的最低規格:生產環境中需以實際情況為準,如需使用GPU節點,請配置GPU節點。

    關於ECS支援的執行個體規格,請參見執行個體規格類型系列

  • 已開啟Log ServiceSLS。

  • 已開啟阿里雲可觀測監控Prometheus版。

  • 已通過kubectl串連Kubernetes叢集,且已在本地安裝kubectl。具體操作,請參見擷取叢集KubeConfig並通過kubectl工具串連叢集

(可選)建立雲資料庫Tair

本文使用Redis執行個體實現Ray Cluster的容錯性和高可用性,您可按需進行建立。建立阿里雲雲資料庫Tair(相容 Redis)執行個體,且滿足以下要求。

  • 建立的雲資料庫Tair(相容 Redis)執行個體需要與本文使用的ACK託管叢集Pro版處於同Region、同VPC。具體操作,請參見步驟1:建立執行個體

  • 添加白名單分組,允許VPC位址區段訪問。具體操作,請參見步驟2:設定白名單

  • 獲得Redis執行個體的串連地址(推薦使用專有串連地址)。具體操作,請參見查看串連地址

  • 獲得Redis執行個體的密碼。具體操作,請參見修改或重設密碼

1.2 安裝Kuberay-Operator組件

登入Container Service管理主控台,在左側導覽列選擇叢集單擊目的地組群名稱,進入叢集詳情頁面,如下圖所示按照序號依次單擊營運管理 > 組件管理 > 應用管理 > 點擊安裝Kuberay-Operator,為目的地組群安裝Kuberay-Operator組件。

重要

ACK叢集提供的Kuberay-Operator託管組件當前處於邀測階段,如您有使用需求, 請提交工單申請。

image

1.3 部署Ray Cluster

執行以下命令建立名為myfirst-ray-cluster的Ray Cluster,並查看部署情況。

  1. 執行以下命令建立Ray Cluster資源。

    展開查看完整命令代碼

    cat <<EOF | kubectl apply -f -
    apiVersion: ray.io/v1
    kind: RayCluster
    metadata:
      name: myfirst-ray-cluster
      namespace: default
    spec:
      suspend: false
      autoscalerOptions:
        env: []
        envFrom: []
        idleTimeoutSeconds: 60
        imagePullPolicy: Always
        resources:
          limits:
            cpu: 2000m
            memory: 2024Mi
          requests:
            cpu: 2000m
            memory: 2024Mi
        securityContext: {}
        upscalingMode: Default
      enableInTreeAutoscaling: false
      headGroupSpec:
        rayStartParams:
          dashboard-host: 0.0.0.0
          num-cpus: "0"
        serviceType: ClusterIP
        template:
          spec:
            containers:
            - image: rayproject/ray:2.36.1
              imagePullPolicy: Always
              name: ray-head
              resources:
                limits:
                  cpu: "4"
                  memory: 4G
                requests:
                  cpu: "1"
                  memory: 1G
      workerGroupSpecs:
      - groupName: work1
        maxReplicas: 1000
        minReplicas: 0
        numOfHosts: 1
        rayStartParams: {}
        replicas: 1
        template:
          spec:
            containers:
            - image: rayproject/ray:2.36.1
              imagePullPolicy: Always
              name: ray-worker
              resources:
                limits:
                  cpu: "4"
                  memory: 4G
                requests:
                  cpu: "4"
                  memory: 4G
    EOF
  2. 執行以下命令查看Ray Cluster部署情況。

    kubectl get raycluster
    
    NAME                  DESIRED WORKERS   AVAILABLE WORKERS   CPUS   MEMORY   GPUS   STATUS   AGE
    myfirst-ray-cluster   1                 1                   5      5G       0      ready    4m19s

    查看Ray Cluster對應Pod。

    kubectl get pod
    
    NAME                                     READY   STATUS    RESTARTS   AGE
    myfirst-ray-cluster-head-5q2hk           1/1     Running   0          4m37s
    myfirst-ray-cluster-work1-worker-zkjgq   1/1     Running   0          4m31s

    查看Ray Cluster對應Service。

    kubectl get svc
    
    NAME                           TYPE        CLUSTER-IP    EXTERNAL-IP   PORT(S)                                         AGE
    kubernetes                     ClusterIP   192.168.0.1   <none>        443/TCP                                         21d
    myfirst-ray-cluster-head-svc   ClusterIP   None          <none>        10001/TCP,8265/TCP,8080/TCP,6379/TCP,8000/TCP   6m57s

2. 整合Log ServiceSLS能力

您可以在Ray Cluster中整合阿里雲Log ServiceSLS,實現日誌的持久化儲存。

  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不存在,Log Service會自動建立。
      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. 查看Ray Cluster日誌資訊流程。

    登入Container Service管理主控台,在左側導覽列選擇叢集單擊目的地組群名稱,進入叢集詳情頁面,如下圖所示按照序號依次單擊叢集資訊 > 基本資料 > 叢集資源,單擊Log Service Project右側的連結進入對應的SLS Projectimage

  3. 在Project中選擇rayclusters對應的Logstore並查看日誌內容。

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

    image

3. 整合阿里雲Prometheus監控能力

您可以在Ray Cluster中使用阿里雲Prometheus監控能力,關於Prometheus監控功能的更多資訊,請參見使用阿里雲Prometheus監控

您可執行以下命令部署Pod Monitor和Service Monitor資源,用於收集Ray Cluster 的Metric資料。

  1. 執行以下命令部署Pod Monitor資源。

    展開查看完整程式碼範例

    cat <<EOF | kubectl apply -f -
    apiVersion: monitoring.coreos.com/v1
    kind: PodMonitor
    metadata:
      annotations:
        arms.prometheus.io/discovery: 'true'
        arms.prometheus.io/resource: arms
      name: ray-workers-monitor
      namespace: arms-prom
      labels:
        # `release: $HELM_RELEASE`: Prometheus can only detect PodMonitor with this label.
        release: prometheus
        #ray.io/cluster: raycluster-kuberay # $RAY_CLUSTER_NAME: "kubectl get rayclusters.ray.io"
    spec:
      namespaceSelector:
        any: true
      jobLabel: ray-workers
      # Only select Kubernetes Pods with "matchLabels".
      selector:
        matchLabels:
          ray.io/node-type: worker
      # A list of endpoints allowed as part of this PodMonitor.
      podMetricsEndpoints:
      - port: metrics
        relabelings:
        - action: replace
          regex: (.+)
          replacement: $1
          separator: ;
          sourceLabels:
            - __meta_kubernetes_pod_label_ray_io_cluster
          targetLabel: ray_io_cluster
          
    EOF
  2. 執行以下命令部署Service Monitor資源。

    展開查看完整程式碼範例

    cat <<EOF | kubectl apply -f -
    apiVersion: monitoring.coreos.com/v1
    kind: ServiceMonitor
    metadata:
      annotations:
        arms.prometheus.io/discovery: 'true'
        arms.prometheus.io/resource: arms
      name: ray-head-monitor
      namespace: arms-prom
      labels:
        # `release: $HELM_RELEASE`: Prometheus can only detect ServiceMonitor with this label.
        release: prometheus
    spec:
      namespaceSelector:
        any: true
      jobLabel: ray-head
      # Only select Kubernetes Services with "matchLabels".
      selector:
        matchLabels:
          ray.io/node-type: head
      # A list of endpoints allowed as part of this ServiceMonitor.
      endpoints:
        - port: metrics
          path: /metrics
      targetLabels:
      - ray.io/cluster
      
    EOF
  3. 登入控制台查看資源部署接入情況。

    1. 登入ARMS控制台在左側導覽列單擊接入中心,在基礎設定頁面,如下圖所示按照序號依次單擊②搜尋Ray > ③選中Ray,然後在Ray面板選擇上文建立的叢集,單擊確定image

    2. 接入成功後,單擊接入管理,跳轉至ARMS接入管理頁面。在組件管理頁簽,單擊組件類型地區的大盤,選擇Ray Clusterimage

    3. 在大盤中選擇對應NamespaceRayClusterNameSessionName進行過濾,查看Ray Cluster運行中任務的監控資料。image.png

相關文檔