Ray on ACK 實踐探索之旅 - RayCluster 篇

作者:張傑、霍智鑫、行疾

什麼是 Ray?

Ray 是一個開源框架,專爲構建可擴展的分佈式應用程序而設計,旨在通過提供簡單直觀的 API,簡化分佈式計算的複雜性,讓開發者能夠便捷高效地編寫並行和分佈式 Python 應用程序。

Ray 的統一計算框架由三層組成:

  • Ray AI libraries

    一個開源、Python 語言的特定領域庫集,爲 ML 工程師、數據科學家和研究人員提供了一個可擴展且統一的 ML 應用程序工具包。

  • Ray Core

    一個開源的 Python 通用分佈式計算庫,使機器學習工程師和 Python 開發人員能夠擴展 Python 應用程序並加速機器學習工作負載。

  • Ray Cluster

    Ray 集羣由一個 Head 節點(負責協調和管理整個 Ray 集羣,以及運行 Ray 的一些關鍵的全局服務)和若干個 Worker 節點(實際執行計算任務的節點,可以自動伸縮以適應工作負載的資源需求變化)組成,Worker 節點連接到 Head 節點。Ray 集羣可以部署在物理機、虛擬機、Kubernetes 以及各種雲環境之上。

圖源:https://docs.ray.io/en/latest/ray-overview/index.html

Ray Core 包含以下三個核心概念:

  • Tasks

    Ray 支持在獨立的 Python 工作線程中異步執行任意函數,這些可異步執行的函數稱作“任務(Task)”。開發者能夠爲每個任務配置所需的 CPU、GPU 及其他自定義資源。Ray 集羣調度器會根據這些資源請求在集羣中合理調度任務,從而實現高效並行處理。

  • Actors

    參與者(Actor)將 Ray API 從函數(即任務)擴展到類。參與者本質上是一個有狀態的工作實體(或服務)。每當一個新的參與者被實例化時,將創建一個新的工作線程,並將該參與者調度到該特定的工作線程上,並且可以訪問和改變該工作線程的狀態。與任務一樣,參與者也支持 CPU、GPU 和自定義資源需求。

  • Objects

    在 Ray 中,任務和參與者在對象(Objects)上創建和計算。我們將這些對象稱爲遠程對象(remote objects),因爲它們可以存儲在 Ray 集羣中的任何位置,並且我們使用 objects ref 來引用它們。遠程對象緩存在 Ray 的分佈式共享內存的對象存儲中,並且集羣中的每個節點都有一個對象存儲。在 Ray 集羣設置中,一個遠程對象可以駐留在一個或多個節點上,與誰持有 objects ref 無關。

Ray Cluster

Ray Cluster 的基本架構如下圖所示。一個 Ray 集羣由一個 Head 節點和若干個 Worker 節點組成,Worker 節點通過網絡連接到 Head 節點,進行協同和通信。

Head 節點主要負責運行 Ray 集羣管理相關的控制進程(以藍色突出顯示),例如 Autoscaler、GCS,以及負責運行 Ray 作業的 Driver processes。除此之外,主節點與其他 Worker 節點無異,Ray 可以像任何其他 Worker 節點一樣在 Head 節點上調度任務。

Worker 節點則專注於執行 Ray 作業中用戶的應用程序代碼,不運行任何 Head 節點中的控制和管理進程。它們參與分佈式調度,以及 Ray Objects 在集羣內存中的存儲和分發。

圖源:https://docs.ray.io/en/latest/cluster/key-concepts.html

要在生產環境中跨多臺機器部署 Ray,首要步驟是部署一個由 Head 節點和 Worker 節點(Ray 節點在 Kubernetes 上運行時實現爲 pod)構成的 Ray 集羣。該集羣支持通過 Ray 自帶的 autoscaler 功能實現彈性擴縮。

Ray 集羣的創建方式有多種,對於在 Kubernetes 環境下的部署,我們推薦使用 kuberay,它提供了一種便捷的方式來快速搭建 Ray 集羣。詳情可參考 Ray 官方文檔 Getting Started with KubeRay — Ray 2.9.1 [ 1]

Ray on Kubernetes

在 Kubernetes(包括阿里雲 ACK)上部署 Ray Cluster 是通過 KubeRay Operator 來支持的,它提供了一種 Kubernetes 原生的方式來管理 Ray 集羣。KubeRay Operator 的安裝包括部署 Operator Deployment 和 RayCluster、RayJob 和 RayService 的 CRD。

在 Kubernetes 上部署 Ray 集羣有多方面好處:

彈性伸縮: Kubernetes 能夠根據集羣工作負載自動伸縮節點數量,與 Ray 的 autoscaler 緊密集成,可以實現 Ray 集羣根據工作負載需求動態伸縮,優化資源利用率,輕鬆管理大規模分佈式應用程序。

容錯性: Ray 本身就設計有容錯機制,在 Kubernetes 上運行時,這一特性得到了增強。如果某個 Ray 節點失敗,Kubernetes 會自動處理,替換失敗節點,保證集羣的穩定性和可用性。

資源管理: 在 Kubernetes 中,可以通過資源請求和限制,精細地控制和管理 Ray 節點所能使用的資源,比如 CPU 和內存。這樣可以更有效地利用集羣資源,避免資源浪費。

簡化部署: Kubernetes 提供了一套統一的部署、管理和監控容器化應用的機制。通過 Kubernetes 部署 Ray 集羣,可以簡化配置和管理流程,確保在不同環境中(開發、測試、生產)部署的一致性。

服務發現和負載均衡: Kubernetes 能夠提供服務發現和負載均衡的功能。這意味着 Ray 節點之間的通信以及客戶端到 Ray 集羣的連接都可以通過 Kubernetes 自動管理,從而簡化網絡配置並提高性能。

多租戶支持: Kubernetes 支持命名空間,可以實現多用戶、多團隊在同一個 Kubernetes 集羣中同時運行各自的 Ray 集羣而不會相互干擾,這在共享資源的環境中尤其有用。

監控和日誌: 與 Kubernetes 集成之後,可以利用它的監控和日誌系統來跟蹤 Ray 集羣的狀態和性能。例如,可以使用 Prometheus 和 Grafana 來監控集羣的性能指標。

兼容性: Kubernetes 是雲原生生態系統的核心,與多種雲服務提供商和技術棧兼容。因此,利用 Kubernetes 部署 Ray 集羣可以輕鬆地在不同的雲平臺或者混合雲環境之間進行遷移和擴展。

總體而言,將 Ray 部署在 Kubernetes 上能極大地簡化分佈式應用程序的部署與管理,因此,當下它成爲衆多需要運行大規模機器學習任務的組織的熱門選擇。詳情可參考 Ray 官方文檔 Ray on Kubernetes — Ray 2.9.1 [ 2]

Ray on ACK

阿里雲容器服務 ACK 致力於幫助企業構建高效和易於管理的雲原生環境,提供高性能且可伸縮的容器應用管理能力。通過 KubeRay 結合 ACK 的雲原生化部署方式,可以實現在 ACK 集羣上快速創建 Ray 集羣,不僅便於與阿里雲 SLS 日誌、Arms Prometheus 監控、Redis 等產品無縫對接,增強日誌管理、可觀測、高可用等能力,還可以通過 Ray autoscaler 與 ACK autoscaler 彈性功能結合,充分發揮雲的彈性能力,爲客戶按需提供計算資源。

接下來,我們將提供一個詳細的教程,指導您在 ACK 集羣中部署 ack-kuberay-operator 組件,並迅速創建一個 RayCluster。

部署 ack-kuberay-operator

阿里雲容器服務 ACK 應用市場 [ 3] 裏集成了社區的 kuberay 組件,並在社區組件的基礎上做了能力增強和安全權限收斂,組件名爲:ack-kuberay-operator [ 4]

前置條件

  • 創建一個 ACK Pro [ 5] 集羣, K8s 版本爲 1.24 及以上
    • 開啓日誌服務
    • 開啓阿里雲可觀測監控 Prometheus 版
    • 節點配置:1 臺 ecs.g6e.xlarge 4vCPU 16GiB (測試環境最低規格建議,生產環境中建議以實際需求爲準)
  • 本地安裝 kubectl [ 6] 、helm [ 7]
    • 保存 ACK 集羣的 kubeconfig 文件到本地 $HOME/.kube/config 文件
  • 創建阿里云云數據庫 Redis 版 [ 8] (支持 RayCluster 高可用需要,可根據實際需求選擇創建)
    • 與新建的 ACK Pro 集羣同 Region、同 VPC
    • 添加白名單分組,允許 VPC/Pod CIDR 地址段訪問
    • 獲得 redis 實例的地址 [ 9]
    • 獲得 redis 實例的密碼 [ 10]

部署 ack-kuberay-operator

點擊阿里雲容器服務 ACK 應用市場 -> 大數據/AI -> ack-kuberay-operator 組件, 點擊右上角: 一鍵部署:

選擇對應的 ACK 集羣,點擊下一步,點擊部署:

部署成功後,會在對應 ACK 集羣的 Helm 頁面,展示對應的 ack-kuberay-operator 的 helm 組件信息。

校驗 ack-kuberay-operator

查看 kuberay-system 命名空間下的 operator pod 是否 running:

# kubectl get pod -n kuberay-system

NAME                                   READY   STATUS    RESTARTS   AGE
ack-kuberay-operator-dbbf56699-4j9hk   1/1     Running   0          120m

部署 ack-ray-cluster

在阿里雲容器服務 ACK 上,我們推薦使用 ack-ray-cluster 組件來部署爲您執行具體 Ray 任務的 RayCluster,ack-ray-cluster 增加了額外的 value 配置,便於與阿里云云產品集成(日誌,監控,高可用)。

創建 RayCluster

增加 aliyunhub helm repo 源,安裝 ack-ray-cluster chart 包。

# helm repo add aliyunhub https://aliacs-app-catalog.oss-cn-hangzhou.aliyuncs.com/charts-incubator/
# helm repo update aliyunhub
# helm search repo ack-ray-cluster
NAME                       CHART VERSION  APP VERSION  DESCRIPTION
aliyunhub/ack-ray-cluster  1.0.0          1.0.0        A ray cluster for Alibaba Cloud

根據默認配置安裝的 ack raycluster,會自動開啓 kuberay 的 auto-scaler 功能,raycluster 默認使用 ray 社區官方鏡像 rayproject/ray:2.7.0。其他配置,請查看ack-ray-cluster chart 包裏的 values 配置。

在 raycluster 命名空間,創建 RayCluster,名爲 myfirst-ray-cluster。

設置環境變量:

export RAY_CLUSTER_NAME='myfirst-ray-cluster'
export RAY_CLUSTER_NS='raycluster'

helm 安裝:


# kubectl create ns ${RAY_CLUSTER_NS}

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

查看 ACK 集羣中 Ray Cluster. SVC、POD 資源。

# 查看ray cluster 實例
#kubectl get rayclusters.ray.io -n ${RAY_CLUSTER_NS}

NAME                  DESIRED WORKERS   AVAILABLE WORKERS   STATUS   AGE
myfirst-ray-cluster                                                  49s

# 查看service 資源
#kubectl get svc -n ${RAY_CLUSTER_NS}

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

# 查看raycluster pod 信息
# kubectl get pod -n ${RAY_CLUSTER_NS}
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

ack-ray-cluster 組件允許用戶在 ACK 集羣創建多個 RayCluster,例如在 default 命名空間,創建第二個 RayCluster,名爲 mysecond-ray-cluster。

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

RayCluster 集成阿里雲日誌服務 SLS

若對 RayCluster 有日誌持久化的需求,需要在 ACK 集羣中創建一個全局的 AliyunLogConfig 資源,使得 ACK 集羣中的 logtail 組件收集 RayCluster pod 的日誌到 ACK 集羣對應的 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 相關參數配置請參考配置說明 [ 11] 。該服務是收費的,具體費用信息參考文檔日誌服務計費概述 [12 ]

在 ACK 集羣資源界面選擇日誌服務 Project 點擊進入 SLS Project 詳情。

在 Projectr 中找到對應 rayclusters 的 logstore,其中包含着您的 raycluster 中的日誌內容:可以根據 tag 查找不同 raycluster 的日誌。

RayCluster 集成阿里雲 Prometheus 監控

ack-ray-cluster 集成了阿里雲 prometheus [1****3] 監控能力。若需要 raycluster 集羣監控能力,則需要在安裝時,將 values 裏的 armsPrometheus.enable 設置爲 true。

🔔 注意:該服務是收費的,具體費用信息參考文檔可觀測監控 Prometheus 版計費概述[14]。

# 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

登錄 arms 接入中心 [ 15]  -> 搜索 ray ->點擊 ray:

選擇上文新建的 ACK 集羣,點擊確定:

點擊接入管理:

點擊大盤-> 選擇 Ray Cluster:

選擇對應 Namespace, RayClusterName, SessionName,若 Ray 集羣中有任務在跑,則會有監控數據。

RayCluster 支持 fault toleration

Ray Cluster  GCS (Global Control Service) 組件管理 Ray 集羣級元數據。默認情況下,GCS 缺乏容錯性,因爲它將所有數據存儲在內存中,故障可能導致整個 Ray 集羣失敗。爲了使 GCS 容錯,Ray 要求必須有一個高可用性的 Redis。這樣,在 GCS 重啓的情況下,它從 Redis 實例中檢索所有數據並恢復其常規功能。ack-ray-cluster 支持對阿里云云數據庫 Redis 版的集成,提供 Ray Cluster GCS fault toleration 的能力。

GCS fail toleration 介紹:

  • kuberay gcs fault toleration config [ 16]
  • gcs fault toleration in kuberay [ 17]

手工創建 secret,保存阿里云云數據庫 Redis 版實例的 RAY_REDIS_ADDRESS 和REDIS_PASSWORD 信息。

secret 命名規範: ${RAY_CLUSTER_NAME}-raycluster-redis

# export REDIS_PASSWORD='your redis password'
# export RAY_REDIS_ADDRESS='your redis address'


# kubectl create secret generic ${RAY_CLUSTER_NAME}-raycluster-redis -n ${RAY_CLUSTER_NS} --from-literal=address=${RAY_REDIS_ADDRESS} --from-literal=password=${REDIS_PASSWORD}

創建 RayCluster, gcsFaultTolerance.enable 設置爲 True,會自動爲 RayCluster 實例添加 ray.io/ft-enabled: "true" annotation,用來開啓 GCS fault tolerance 能力,併爲 RayCluster 實例通過 Env 掛載 secret 的信息。

# 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

提交完之後查看 RayCluster 的情況:

# 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

查看對應的 RayCluster 的 Pod 情況:

# kubectl get pod -n ${RAY_CLUSTER_NS}
NAME                             READY   STATUS              RESTARTS   AGE
myfirst-ray-cluster-head-vrltd   2/2     Running             0          12m

這裏以阿里云云數據庫 Redis 實例爲例,使用 DMS 訪問 Redis 查看數據:

可以看到 RayCluster 的 GCS 中的信息已經被存到了 Redis 中。當卸載這個 RayCluster 時,這個 RayCluster 的 GCS 的信息會在 Redis 中自動進行刪除操作。

擴展實踐

Ray DashBoard

使用 kubectl port-forward 對 Ray Dashboard 進行本地訪問:

# kubectl get svc -n ${RAY_CLUSTER_NS}

NAME                           TYPE        CLUSTER-IP        EXTERNAL-IP   PORT(S)                                         AGE
myfirst-ray-cluster-head-svc   ClusterIP   192.168.208.188   <none>        10001/TCP,8265/TCP,8080/TCP,6379/TCP,8000/TCP   18m


# kubectl port-forward svc/myfirst-ray-cluster-head-svc --address 0.0.0.0 8265:8265 -n ${RAY_CLUSTER_NS}
Forwarding from 0.0.0.0:8265 -> 8265

本地瀏覽器訪問 http://127.0.0.1:8265/

ACK-RayCluster DashBoard 默認禁用了 Metric 的展示,後續會提供 Metic 與阿里雲 Prometheus 監控頁面的嵌入集成能力。

提交Ray Job

以本地 RayCluster 提交 Ray Job 爲例:

# kubectl get pod -n ${RAY_CLUSTER_NS}
NAME                                           READY   STATUS    RESTARTS   AGE
myfirst-ray-cluster-head-v7pbw                 2/2     Running   0          39m
myfirst-ray-cluster-worker-workergroup-5dqj8   1/1     Running   0          31m

# kubectl exec -it -n ${RAY_CLUSTER_NS} myfirst-ray-cluster-head-v7pbw -- bash

head pod 裏使用 echo 命令保存 my_script.py 文件:

import ray
import os

# 連接本地或者遠程ray cluster
ray.init()

@ray.remote(num_cpus=1)
class Counter:
    def __init__(self):
        self.name = "test_counter"
        self.counter = 0

    def increment(self):
        self.counter += 1

    def get_counter(self):
        return "{} got {}".format(self.name, self.counter)

counter = Counter.remote()

for _ in range(10000):
    counter.increment.remote()
    print(ray.get(counter.get_counter.remote()))

運行 my_script.py 腳本,執行分佈式任務:

# python my_script.py

2024-01-24 04:25:27,286  INFO worker.py:1329 -- Using address 127.0.0.1:6379 set in the environment variable RAY_ADDRESS
2024-01-24 04:25:27,286  INFO worker.py:1458 -- Connecting to existing Ray cluster at address: 172.16.0.236:6379...
2024-01-24 04:25:27,295  INFO worker.py:1633 -- Connected to Ray cluster. View the dashboard at http://172.16.0.236:8265
test_counter got 0
test_counter got 1
test_counter got 2
test_counter got 3

...

Ray Cluster 內運行 job 作業有多種方式,具體可參照:

  • how do you use the ray-client [ 18]
  • quick start useing the ray job cli [ 19]

Ray Auto-Scaler 結合 ACK Cluster-Autoscaler 實現彈性伸縮

首先 ACK 集羣默認節點池開啓彈性伸縮能力 [ 20]

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

查看 RAY 集羣中資源的運行情況:

# kubectl get pod -n ${RAY_CLUSTER_NS}
NAME                                           READY   STATUS     RESTARTS   AGE
myfirst-ray-cluster-head-kvvdf                 2/2     Running    0          22m


# 登錄head 節點,查看集羣status 信息
# kubectl -n ${RAY_CLUSTER_NS} exec -it myfirst-ray-cluster-head-kvvdf -- bash
(base) ray@myfirst-ray-cluster-head-kvvdf:~$ ray status

======== Autoscaler status: 2024-01-25 00:00:19.879963 ========
Node status
---------------------------------------------------------------
Healthy:
 1 head-group
Pending:
 (no pending nodes)
Recent failures:
 (no failures)

Resources
---------------------------------------------------------------
Usage:
 0B/1.86GiB memory
 0B/452.00MiB object_store_memory

Demands:
 (no resource demands)

在 raycluster 中運行提交如下 job:

import time
import ray
import socket

ray.init()

@ray.remote(num_cpus=1)
def get_task_hostname():
    time.sleep(120)
    host = socket.gethostbyname(socket.gethostname())
    return host

object_refs = []
for _ in range(15):
    object_refs.append(get_task_hostname.remote())

ray.wait(object_refs)

for t in object_refs:
    print(ray.get(t))

上述代碼啓動了 15 個 task,每個 task 需要 1 核 CPU 調度資源。默認創建的 raycluster head pod 的 --num-cpus 爲 0,不允許調度 task, work pod 的 cpu 內存默認爲 1 核,1G 因此需要自動擴容 15 個 work pod。ACK 集羣中整體節點資源不夠,Pending 的 pod 會自動觸發 ACK 的節點池彈性伸縮能力。

# kubectl get pod -n ${RAY_CLUSTER_NS} -w
NAME                                           READY   STATUS    RESTARTS   AGE
myfirst-ray-cluster-head-kvvdf                 2/2     Running   0          47m
myfirst-ray-cluster-worker-workergroup-btgmm   1/1     Running   0          30s
myfirst-ray-cluster-worker-workergroup-c2lmq   0/1     Pending   0          30s
myfirst-ray-cluster-worker-workergroup-gstcc   0/1     Pending   0          30s
myfirst-ray-cluster-worker-workergroup-hfshs   0/1     Pending   0          30s
myfirst-ray-cluster-worker-workergroup-nrfh8   1/1     Running   0          30s
myfirst-ray-cluster-worker-workergroup-pjbdw   0/1     Pending   0          29s
myfirst-ray-cluster-worker-workergroup-qxq7v   0/1     Pending   0          30s
myfirst-ray-cluster-worker-workergroup-sm8mt   1/1     Running   0          30s
myfirst-ray-cluster-worker-workergroup-wr87d   0/1     Pending   0          30s
myfirst-ray-cluster-worker-workergroup-xc4kn   1/1     Running   0          30s
...
# kubectl get node -w
cn-hangzhou.172.16.0.204   Ready    <none>   44h   v1.24.6-aliyun.1

cn-hangzhou.172.16.0.17    NotReady   <none>   0s    v1.24.6-aliyun.1
cn-hangzhou.172.16.0.17    NotReady   <none>   0s    v1.24.6-aliyun.1
cn-hangzhou.172.16.0.17    NotReady   <none>   0s    v1.24.6-aliyun.1
cn-hangzhou.172.16.0.17    NotReady   <none>   1s    v1.24.6-aliyun.1
cn-hangzhou.172.16.0.17    NotReady   <none>   11s   v1.24.6-aliyun.1
cn-hangzhou.172.16.0.16    NotReady   <none>   10s   v1.24.6-aliyun.1
cn-hangzhou.172.16.0.16    NotReady   <none>   14s   v1.24.6-aliyun.1
cn-hangzhou.172.16.0.17    NotReady   <none>   31s   v1.24.6-aliyun.1
cn-hangzhou.172.16.0.17    NotReady   <none>   60s   v1.24.6-aliyun.1
cn-hangzhou.172.16.0.17    Ready      <none>   61s   v1.24.6-aliyun.1
cn-hangzhou.172.16.0.16    Ready      <none>   64s   v1.24.6-aliyun.1
...

Ray Auto-Scaler 的 ECI 彈性伸縮實踐

首先 ACK 集羣要部署 ACK Virtual Node 組件 [ 21]

RayCluster 可以結合 ray 的 auto-scaler 能力,自動彈 ECI 節點,提供免運維、強隔離、能快速啓動的容器運行環境。

查看 node 節點,新增 virtual-kubelet-cn-hangzhou-kVK 節點。

# kubectl get node
NAME                            STATUS   ROLES    AGE   VERSION
cn-hangzhou.172.16.0.20         Ready    <none>   19h   v1.26.3-aliyun.1
cn-hangzhou.172.16.0.236        Ready    <none>   82m   v1.26.3-aliyun.1
cn-hangzhou.172.16.0.41         Ready    <none>   19h   v1.26.3-aliyun.1
virtual-kubelet-cn-hangzhou-k   Ready    agent    16m   v1.26.3-aliyun.1

創建 values.yaml 文件:

cat > values.yaml <<EOF
worker:
  groupName: workergroup
  labels:
    alibabacloud.com/eci: "true"
EOF

安裝支持 ECI 的 raycluster:

# helm uninstall ${RAY_CLUSTER_NAME} -n ${RAY_CLUSTER_NS}
# helm install ${RAY_CLUSTER_NAME} aliyunhub/ack-ray-cluster -n ${RAY_CLUSTER_NS}  -f values.yaml
# kubectl get pod
NAME                                           READY   STATUS    RESTARTS   AGE     IP             NODE                            NOMINATED NODE   READINESS GATES
myfirst-ray-cluster-head-7fgp4                 2/2     Running   0          7m2s    172.16.0.241   cn-hangzhou.172.16.0.240        <none>           <none>

向 RayCluster 內提交併運行 python  job:

import time
import ray
import socket

ray.init()

@ray.remote(num_cpus=1)
def get_task_hostname():
    time.sleep(120)
    host = socket.gethostbyname(socket.gethostname())
    return host

object_refs = []
for _ in range(2):
    object_refs.append(get_task_hostname.remote())

ray.wait(object_refs)

for t in object_refs:
    print(ray.get(t))

上述代碼啓動了 2 個 task,每個 task 需要 1 核 CPU 調度資源。默認創建的 raycluster head pod 的 --num-cpus 爲 0,不允許調度 task, work pod 的 cpu 內存默認爲 1 核,1G 因此會自動擴容 2 個 eci work pod。

get pod -o wide
NAME                                           READY   STATUS     RESTARTS   AGE     IP             NODE                            NOMINATED NODE   READINESS GATES
myfirst-ray-cluster-head-7fgp4                 2/2     Running    0          4m56s   172.16.0.241   cn-hangzhou.172.16.0.240        <none>           <none>
myfirst-ray-cluster-worker-workergroup-6s2cl   0/1     Init:0/1   0          4m5s    172.16.0.17    virtual-kubelet-cn-hangzhou-k   <none>           <none>
myfirst-ray-cluster-worker-workergroup-l9qgb   1/1     Running    0          4m5s    172.16.0.16    virtual-kubelet-cn-hangzhou-k   <none>

總結

阿里雲容器服務 ACK 提供的 ack-kuberay-operator 和 raycluster 可以實現在 ACK 集羣上快速創建 Ray 集羣,更加方便與阿里雲 SLS 日誌、Arms Prometheus 監控、Redis 等產品無縫對接,增強日誌管理、可觀測、高可用等能力,還可以通過 Ray autoscaler 與 ACK autoscaler 彈性功能結合,充分發揮雲的彈性能力,爲客戶按需提供計算資源。未來 ACK 會進一步提供 Ray 在 ACK 上的增強能力,更好的滿足用戶在分佈式,彈性,AI 方面的需求。

相關鏈接:

[1] Getting Started with KubeRay — Ray 2.9.1

https://docs.ray.io/en/latest/cluster/kubernetes/getting-started.html

[2] Ray on Kubernetes — Ray 2.9.1

https://docs.ray.io/en/latest/cluster/kubernetes/index.html

[3] 應用市場

https://cs.console.aliyun.com/#/next/app-catalog

[4] ack-kuberay-operator

https://cs.console.aliyun.com/#/next/app-catalog/ack/incubator/ack-kuberay-operator

[5] ACK Pro

https://cs.console.aliyun.com/#/k8s/cluster/list

[6] kubectl

https://kubernetes.io/docs/tasks/tools/

[7] helm

https://helm.sh/docs/intro/install/

[8] 阿里云云數據庫 Redis 版

https://www.aliyun.com/product/redis?spm=5176.28508143.J_4VYgf18xNlTAyFFbOuOQe.107.e939154adYavb9&scm=20140722.S_product%40%40雲產品%40%4072449._.ID_product%40%40雲產品%40%4072449-RL_redis-LOC_menuUNDproduct-OR_ser-V_3-P0_0&v=6ff4a055f2f22f9d118832696bb06df3

[9] 地址

https://help.aliyun.com/zh/redis/user-guide/view-endpoints?spm=a2c4g.11174283.0.0.544d303aA6fL7P

[10] 密碼

https://help.aliyun.com/zh/redis/user-guide/change-or-reset-the-password?spm=a2c4g.11186623.0.0.60d14438SOiTpf

[11] 配置說明

https://help.aliyun.com/zh/sls/user-guide/use-crds-to-collect-container-logs-in-daemonset-mode-1?spm=a2c4g.11186623.0.0.fead7fd7ZmC7Q0

[12] 日誌服務計費概述

https://help.aliyun.com/zh/sls/product-overview/billing-overview

[13] 阿里雲 Prometheus

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/use-alibaba-cloud-prometheus-service-to-monitor-an-ack-cluster?spm=a2c4g.11186623.0.i5#task-2461398

[14] 可觀測監控 Prometheus 版計費概述

https://help.aliyun.com/zh/arms/prometheus-monitoring/product-overview/product-billing-new-version1/

[15] arms 接入中心

https://arms.console.aliyun.com/#/intgr/integrations

[16] kuberay gcs fault toleration config

https://docs.ray.io/en/latest/cluster/kubernetes/user-guides/kuberay-gcs-ft.html#kuberay-external-storage-namespace

[17] gcs fault toleration in kuberay

https://docs.ray.io/en/latest/cluster/kubernetes/user-guides/kuberay-gcs-ft.html#kuberay-gcs-ft

[18] how do you use the ray-client

https://docs.ray.io/en/latest/cluster/running-applications/job-submission/ray-client.html#how-do-you-use-the-ray-client

[19] quick start useing the ray job cli

https://docs.ray.io/en/latest/cluster/running-applications/job-submission/quickstart.html

[20] 彈性伸縮能力

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/auto-scaling-of-nodes?spm=a2c4g.11186623.0.i16#task-1893824

[21] 部署 ACK Virtual Node 組件

https://help.aliyun.com/zh/ack/ack-managed-and-ack-dedicated/user-guide/deploy-the-virtual-node-controller-and-use-it-to-create-elastic-container-instance-based-pods?spm=a2c4g.11186623.0.i2#section-nz6-jj2-383

點擊此處,瞭解 ACK 雲原生 AI 套件產品詳情。

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章