Ray 是一個高效能的分散式計算框架,方便開發者建構和管理叢集。本文首先介紹手動建立 Ray 叢集的流程,包含啟動 Ray runtime、設定資源、處理網路地址轉換等。接著說明如何使用 ray.init() 連線到叢集,並使用工具測試連線狀態。文章也涵蓋了使用 ray stop 命令停止叢集的步驟。更進一步,本文將引導讀者使用 KubeRay 這個 Kubernetes 原生的 Ray 叢集部署工具,講解如何部署和管理 Ray 叢集,包含自定義資源、異構工作節點支援、Prometheus 監控等功能。文章也提供逐步教學,示範如何在 Kubernetes 上建立第一個 KubeRay 叢集,並透過 YAML 檔案設定 head 節點和 worker 節點等資源配置。最後,文章說明如何透過 Ray Job Submission 和 Ray Client 與叢集互動,執行 Python 指令碼,並涵蓋如何使用 kubectl 管理叢集和服務,以及雲端叢集部署和檔案同步等進階議題。

Ray叢集的建立和管理

Ray是一個高效能的分散式計算框架,允許使用者輕鬆地建立和管理自己的叢集。在這一節中,我們將介紹如何建立和管理Ray叢集。

手動建立Ray叢集

要手動建立Ray叢集,首先需要在每個節點上執行Ray的runtime。可以使用以下命令:

ray start --address=<head-address> --num-cpus=10 --num-gpus=1

這個命令會在指定的節點上啟動Ray的runtime,並指定CPU和GPU的數量。

如果節點之間有網路地址轉換(NAT),則需要使用DNS或其他方法來解析節點之間的地址。

連線到Ray叢集

要連線到Ray叢集,需要使用ray.init()函式,並指定叢集的地址:

import ray

ray.init(address='auto')

這個函式會自動連線到叢集,並傳回一個Ray的context物件。

測試Ray叢集

要測試Ray叢集,需要使用nmapnc工具來檢查節點之間的連線性。例如:

$ nmap -sV --reason -p $PORT $HEAD_ADDRESS
Host is up, received echo-reply ttl 60 (0.00087s latency).

PORT STATE SERVICE REASON VERSION
6379/tcp open redis? syn-ack
Service detection performed. Please report any incorrect

這個命令會檢查指定的節點是否可以連線到指定的埠。

停止Ray叢集

要停止Ray叢集,需要使用ray stop命令:

ray stop

這個命令會停止Ray的runtime,並關閉所有的節點。

部署Ray叢集到Kubernetes

Kubernetes是一個業界標準的叢集資源管理平臺,允許使用者輕鬆地部署、管理和擴充套件自己的應用程式。

要部署Ray叢集到Kubernetes,需要使用KubeRay專案,這是一個標準的Ray叢集部署和管理工具。KubeRay提供了一個自定義的RayCluster資源,允許使用者輕鬆地建立和管理自己的Ray叢集。

KubeRay的特點

KubeRay提供了以下特點:

  • 管理RayCluster的自定義資源
  • 支援單個Ray叢集中的異構工作者型別
  • 內建的Prometheus監控
  • 使用PodTemplate建立Ray Pods
  • 根據正在執行的Pod更新狀態
  • 自動填充容器中的環境變數
  • 自動在容器命令中新增Ray啟動命令
  • 自動在 /dev/shm 新增共享記憶體的volumeMount
  • 使用ScaleStrategy從特定群組中刪除特定節點

建立第一個KubeRay叢集

要建立第一個KubeRay叢集,需要使用以下命令:

export KUBERAY_VERSION=v0.3.0

這個命令會部署KubeRay的operator,並建立一個新的Ray叢集。

圖表翻譯:

  flowchart TD
    A[建立Ray叢集] --> B[連線到Ray叢集]
    B --> C[測試Ray叢集]
    C --> D[停止Ray叢集]
    D --> E[部署Ray叢集到Kubernetes]
    E --> F[建立第一個KubeRay叢集]

這個圖表展示了建立和管理Ray叢集的過程,包括建立Ray叢集、連線到Ray叢集、測試Ray叢集、停止Ray叢集、部署Ray叢集到Kubernetes和建立第一個KubeRay叢集。

部署 Ray 叢集

為了部署 Ray 叢集,我們需要使用 KubeRay 運運算元。首先,讓我們確認運運算元已經部署:

kubectl -n ray-system get pods

這個命令會顯示運運算元的 pod 狀態。

部署新的 Ray 叢集

接下來,讓我們使用預設的叢集配置檔案部署一個新的 Ray 叢集:

# 部署新的 Ray 叢集
kubectl apply -f ray-cluster.yaml

這個命令會建立一個新的 Ray 叢集,包含一個 head pod 和多個 worker pod。

確認叢集狀態

為了確認叢集的狀態,讓我們使用以下命令:

# 確認叢集狀態
kubectl get pods -n ray-system

這個命令會顯示叢集的 pod 狀態。

Ray 叢集服務

KubeRay 運運算元會配置一個 Kubernetes 服務,目標是 Ray head pod。讓我們使用以下命令來確認服務:

# 確認服務
kubectl get svc -n ray-system

這個命令會顯示服務的詳細資訊,包括服務名稱、型別、叢集 IP、外部 IP、埠等。

服務埠

Ray head pod 的服務會暴露三個埠:

  • 6379:Ray head 的 GCS 服務,Ray worker pod 會連線到這個服務以加入叢集。
  • 8265:暴露 Ray Dashboard 和 Ray Job Submission 服務。
  • 10001:暴露 Ray Client 服務。

與 Ray 叢集互動

現在,讓我們使用 Python 指令碼與 Ray 叢集互動。首先,讓我們建立一個簡單的 Python 指令碼,命名為 script.py

import ray

ray.init(address="auto")
print(ray.cluster_resources())

@ray.remote
def test():
    return 12

ray.get([test.remote() for i in range(12)])

這個指令碼會連線到 Ray 叢集,並執行一些標準的 Ray 命令。

執行 Ray 指令碼

有三種方式可以執行這個指令碼:使用 kubectl exec、Ray Job Submission 或 Ray Client。讓我們在下一節中詳細介紹這三種方式。

使用 Ray Job Submission 服務

您可以透過 Ray Job Submission 服務在叢集上執行指令碼。這個服務允許您提交指令碼或依賴包,並使用指定的依賴執行自訂指令碼。要開始使用,首先需要將 Job Submission 服務的埠轉發到本地機器:

kubectl port-forward service/raycluster-complete-head-svc 8265:8265

接下來,提交指令碼使用 Ray Job Submission CLI:

ray job submit --working-dir=. -- python script.py

您將看到類似以下的輸出:

2022-05-20 23:35:36,066 INFO dashboard_sdk.py:276
-- Uploading package gcs://_ray_pkg_533a957683abeba8.zip.
2022-05-20 23:35:36,067 INFO packaging.py:416
-- Creating a file package for local directory '.'.

-------------------------------------------------------
Job 'raysubmit_U5hfr1rqJZWwJmLP' submitted successfully

-------------------------------------------------------

查詢工作記錄

您可以使用以下命令查詢工作記錄:

ray job logs raysubmit_U5hfr1rqJZWwJmLP

查詢工作狀態

您可以使用以下命令查詢工作狀態:

ray job status raysubmit_U5hfr1rqJZWwJmLP

停止工作

您可以使用以下命令停止工作:

ray job stop raysubmit_U5hfr1rqJZWwJmLP

Ray Client

要透過 Ray Client 連線到叢集,首先需要確保本地 Ray 安裝和 Python 版本與叢集中的 Ray 和 Python 版本相符。您可以使用以下命令檢查版本:

ray --version
python --version

接下來,執行以下命令將本地埠 10001 轉發到 Ray head 的 Ray Client 服務:

kubectl port-forward service/raycluster-complete-head-svc 10001:10001

這個命令將會阻塞。現在,您可以在本地 Python shell 中啟動 Ray Client 連線:

import ray

ray.init(address='localhost:10001')

圖表翻譯:

  flowchart TD
    A[提交指令碼] --> B[轉發埠]
    B --> C[啟動 Ray Client]
    C --> D[執行工作]
    D --> E[查詢工作記錄]
    E --> F[查詢工作狀態]
    F --> G[停止工作]

這個流程圖描述了使用 Ray Job Submission 服務和 Ray Client 連線到叢集的步驟。

Ray 叢集配置與部署

Ray 是一個高效能的分散式計算框架,允許使用者輕鬆地在多個機器上擴充套件他們的應用程式。要在 Kubernetes 上部署 Ray 叢集,需要配置 Ray Cluster 的 YAML 檔案。

Ray 叢集配置檔案

以下是 Ray 叢集配置檔案的範例:

kind: RayCluster
metadata:
  name: raycluster-complete
spec:
  headGroupSpec:
    rayStartParams:
      port: '6379'
      num-cpus: '1'
  template:
    metadata:
    spec:
      containers:
      - name: ray-head
        image: rayproject/ray:1.12.1
        resources:
          limits:
            cpu: "1"
            memory: "1024Mi"
          requests:
            cpu: "1"
            memory: "1024Mi"
        ports:
        - containerPort: 6379
          name: gcs
        - containerPort: 8265
          name: dashboard
        - containerPort: 10001
          name: client
      env:
      - name: "RAY_LOG_TO_STDERR"
        value: "1"
      volumeMounts:
      - mountPath: /tmp/ray
        name: ray-logs
  volumes:
  - name: ray-logs
    emptyDir: {}
  workerGroupSpecs:
  - groupName: small-group
    replicas: 2
    rayStartParams:

這個配置檔案定義了一個名為 raycluster-complete 的 Ray 叢集,包含一個 head節點和兩個worker節點。head節點使用 rayproject/ray:1.12.1 這個映象,worker節點使用相同的映象。

Ray 叢集部署

要部署 Ray 叢集,需要使用 kubectl 命令列工具。以下是部署 Ray 叢集的步驟:

  1. 建立 Ray 叢集配置檔案:raycluster.yaml
  2. 部署 Ray 叢集:kubectl apply -f raycluster.yaml
  3. 等待 Ray 叢集部署完成:kubectl get raycluster -w

Ray 叢集訪問

要訪問 Ray 叢集,需要使用 ray.init() 函式。以下是訪問 Ray 叢集的範例:

import ray

ray.init(address="ray://localhost:10001")
print(ray.cluster_resources())

這個範例初始化了一個 Ray 叢集,連線到 localhost:10001 的 head節點,並列印出叢集的資源。

KubeRay 配置

KubeRay 是一個 Kubernetes 的 Ray 叢集運營工具。要配置 KubeRay,需要建立一個 KubeRay 配置檔案。以下是 KubeRay 配置檔案的範例:

apiVersion: ray.io/v1
kind: KubeRay
metadata:
  name: kuberay
spec:
  rayCluster:
    headGroupSpec:
      rayStartParams:
        port: '6379'
        num-cpus: '1'

這個配置檔案定義了一個名為 kuberay 的 KubeRay 配置,包含一個 head節點。

KubeRay 部署

要部署 KubeRay,需要使用 kubectl 命令列工具。以下是部署 KubeRay 的步驟:

  1. 建立 KubeRay 配置檔案:kuberay.yaml
  2. 部署 KubeRay:kubectl apply -f kuberay.yaml
  3. 等待 KubeRay 部署完成:kubectl get kuberay -w

在 Kubernetes 上部署 Ray 叢集

Ray 是一個高效能的分散式計算框架,適合於大規模的機器學習和深度學習任務。在 Kubernetes 上部署 Ray 叢集可以提供高度的可擴充套件性和可靠性。以下是關於在 Kubernetes 上部署 Ray 叢集的詳細。

Ray 叢集架構

Ray 叢集由一個頭節點(head node)和多個工作者節點(worker node)組成。頭節點負責管理叢集的配置和工作任務的分配,而工作者節點則負責執行工作任務。每個工作者節點可以配置多個 CPU 和 GPU 資源,以滿足不同工作任務的需求。

配置 Ray 叢集

要配置 Ray 叢集,需要指定頭節點和工作者節點的配置。頭節點的配置包括頭節點的 CPU 和記憶體資源、頭節點的 Docker 映象等。工作者節點的配置包括工作者節點的 CPU 和記憶體資源、工作者節點的 Docker 映象等。

headGroupSpec 和 workerGroupSpecs

頭節點和工作者節點的配置分別由 headGroupSpecworkerGroupSpecs 指定。headGroupSpec 指定頭節點的配置,包括頭節點的 CPU 和記憶體資源、頭節點的 Docker 映象等。workerGroupSpecs 指定工作者節點的配置,包括工作者節點的 CPU 和記憶體資源、工作者節點的 Docker 映象等。

rayStartParams

rayStartParams 是一個字串-字串對映,指定了 Ray 啟動的引數。其中,num-cpusnum-gpus 是兩個重要的引數,分別指定了 CPU 和 GPU 的數量。

template

template 是一個 Kubernetes Pod 範本,指定了頭節點和工作者節點的配置。範本中可以指定 CPU 和記憶體資源、Docker 映象等。

resources

資源配置是 Ray 叢集配置的重要部分。需要指定容器的 CPU 和記憶體請求和限制。對於 GPU 工作負載,還需要指定 GPU 限制。

nodeSelector 和 tolerations

nodeSelectortolerations 可以用來控制工作者節點的排程。這些欄位可以指定工作者節點可以被排程到的節點。

Ray 容器映象

Ray 容器映象是 Ray 叢集配置的重要部分。需要指定頭節點和工作者節點使用的 Ray 版本。通常,頭節點和工作者節點應該使用相同的 Ray 版本。

內容解密:

Ray 叢集的配置是複雜的,需要仔細考慮各個引數的設定。headGroupSpecworkerGroupSpecs 是兩個重要的配置,分別指定了頭節點和工作者節點的配置。rayStartParams 是一個字串-字串對映,指定了 Ray 啟動的引數。template 是一個 Kubernetes Pod 範本,指定了頭節點和工作者節點的配置。資源配置是 Ray 叢集配置的重要部分,需要指定容器的 CPU 和記憶體請求和限制。

圖表翻譯:

  graph LR
    A[頭節點] --> B[工作者節點]
    B --> C[工作任務]
    C --> D[結果]
    D --> E[輸出]

此圖示 Ray 叢集的架構,包括頭節點、工作者節點、工作任務、結果和輸出。頭節點負責管理叢集的配置和工作任務的分配,而工作者節點則負責執行工作任務。工作任務可以配置多個 CPU 和 GPU 資源,以滿足不同工作任務的需求。結果和輸出是工作任務的最終產物。

Ray叢集配置與部署

Ray叢集是一種強大的分散式計算框架,允許使用者輕鬆地部署和管理大規模的計算任務。在本文中,我們將探討如何配置和部署Ray叢集,包括使用Volume Mounts、容器環境變數和Ray叢集啟動器等技術。

Volume Mounts

Volume Mounts是一種用於儲存日誌或其他應用程式資料的技術。透過使用Volume Mounts,Ray容器可以將資料儲存在主機的檔案系統中,從而實作資料的持久化。例如,以下配置可以將Ray容器的日誌儲存在主機的檔案系統中:

volumeMounts:
  - name: log-volume
    mountPath: /tmp/ray/

容器環境變數

容器環境變數可以用於修改Ray的行為。例如,設定RAY_LOG_TO_STDERR環境變數可以將日誌重定向到STDERR,而不是寫入容器的檔案系統中。

env:
  - name: RAY_LOG_TO_STDERR
    value: "1"

Ray叢集啟動器

Ray叢集啟動器是一種工具,允許使用者輕鬆地部署Ray叢集在任何雲平臺上。以下是Ray叢集啟動器的工作流程:

  1. 預配一個新的例項/機器使用雲平臺的SDK。
  2. 執行Shell命令設定Ray與提供的選項。
  3. 選擇性地執行任何自定義的設定命令。
  4. 初始化Ray叢集。
  5. 部署一個自動擴充套件程序。

配置Ray叢集

要執行Ray叢集,必須指定資源需求在一個叢集配置檔案中。以下是一個簡單的叢集配置檔案:

cluster_name: minimal
max_workers: 1

這個配置檔案指定了一個名為minimal的叢集,最大工作者節點數為1。

Mermaid圖表

  flowchart TD
    A[Ray叢集啟動器] --> B[預配例項]
    B --> C[設定Ray]
    C --> D[初始化Ray叢集]
    D --> E[部署自動擴充套件程序]

圖表翻譯

這個Mermaid圖表展示了Ray叢集啟動器的工作流程,從預配例項到部署自動擴充套件程序。

雲端叢集配置

雲端叢集的配置是建立在雲端提供商(Cloud Provider)基礎上的。以下是使用 AWS 作為雲端提供商的配置範例:

provider:
  type: aws
  region: us-west-2
  availability_zone: us-west-2a

在這個範例中,指定了雲端提供商的型別(aws)、區域(us-west-2)和可用性區域(us-west-2a)。

Ray叢集啟動

要啟動 Ray 叢集,可以使用 ray up 命令,後面跟著叢集配置檔案的名稱。例如:

ray up cluster.yaml

這個命令會根據配置檔案的內容,啟動一個 Ray 叢集。

Ray叢集互動

啟動 Ray 叢集後,通常需要與其互動,以執行任務、移動檔案、檢視日誌等。可以使用 ray attach 命令,連線到叢集的頭節點(head node):

ray attach cluster.yaml -p 8265

然後,可以使用 ray job submit 命令,提交任務到叢集:

ray job submit --working-dir=. -- python script.py

這個命令會將本地檔案移到叢集,並在叢集上執行 script.py 指令碼。

檔案同步

如果需要將檔案從叢集下載到本地,可以使用 ray rsync-down 命令:

ray rsync-down cluster.yaml /path/on/cluster/results.log ./results.log

這個命令會將叢集上的 /path/on/cluster/results.log 檔案下載到本地的 ./results.log

雲端叢集部署

以下是部署 Ray 叢集到 AWS 雲端的步驟:

  1. 安裝 boto 庫:pip install boto3
  2. 配置 AWS 認證:在 $HOME/.aws/credentials 檔案中配置 AWS 認證
  3. 啟動叢集:ray up ray/python/ray/autoscaler/aws/example-full.yaml
  4. 連線到頭節點:ray attach ray/python/ray/autoscaler/aws/example-full.yaml
  5. 執行 Ray 程式:ray.init(address="auto")
  6. 刪除叢集:ray down ray/python/ray/autoscaler/aws/example-full.yaml

圖表翻譯:

  graph LR
    A[啟動叢集] --> B[連線到頭節點]
    B --> C[執行 Ray 程式]
    C --> D[檔案同步]
    D --> E[刪除叢集]

這個圖表展示了 Ray 叢集的生命週期,從啟動叢集到刪除叢集。

Ray作為一個新興的分散式計算框架,正逐漸受到關注,尤其在機器學習和深度學習領域。深入剖析Ray的叢集建立和管理機制,可以發現其高度的靈活性和可擴充套件性是其核心優勢。多維比較分析顯示,相較於傳統的叢集管理工具,Ray提供了更簡潔的API和更強大的自動擴充套件能力,簡化了部署和管理的複雜度,但也存在一定的學習曲線和對Kubernetes等容器編排平臺的依賴。技術限制深析指出,Ray的自動擴充套件功能雖然強大,但在處理複雜的依賴關係和網路配置時仍有改進空間,特別是在跨雲或混合雲環境下。對於重視資源效率的企業,建議深入瞭解KubeRay的配置選項,並根據實際需求調整資源分配策略,以達到成本效益最佳化。玄貓認為,Ray在處理大規模資料和複雜計算任務方面展現出巨大潛力,隨著社群的發展和工具鏈的完善,其應用範圍將進一步擴大,成為雲原生時代分散式計算的重要基本。