すべてのプロダクト
Search
ドキュメントセンター

Container Service for Kubernetes:ACKクラスタでのRayの効率的な展開と最適化

最終更新日:Mar 10, 2025

Rayは、AIおよびPythonアプリケーションをスケーリングするためのオープンソースの統合フレームワークです。 Rayは機械学習分野で広く採用されています。 Container Service for Kubernetes (ACK) クラスターにRayクラスターをすばやく作成し、RayクラスターをSimple Log Service、Managed Service for Prometheus、ApsaraDB for Redisと統合して、ログ管理、可観測性、可用性を最適化できます。 Rayオートスケーラは、ACKオートスケーラと協働して、計算リソーススケーリングの効率を向上させ、リソース利用率を高めることができる。

レイの紹介

Rayは、AIおよびPythonアプリケーションをスケーリングするためのオープンソースの統合フレームワークです。 分散コンピューティングを簡素化し、並列処理および分散Pythonアプリケーションの効率的な開発に役立つAPIを提供します。 Rayは機械学習分野で広く採用されています。 Rayの統合コンピューティングフレームワークは、Ray AIライブラリ、Ray Core、およびRay Clustersレイヤーで構成されています。

image.svg

コンピューティングフレームワークの詳細を表示

Ray AIライブラリ

オープンソース、Python、およびドメイン固有のライブラリセットで、MLエンジニア、データサイエンティスト、研究者に、機械学習アプリケーション用のスケーラブルで統合されたツールキットを提供します。

レイコア

機械学習エンジニアとPython開発者がPythonアプリケーションをスケーリングし、機械学習のワークロードを高速化できるようにする、オープンソースのPython汎用分散コンピューティングライブラリ。 Ray Coreは、タスク、アクター、オブジェクトなどのコアプリミティブを提供します。 タスクは、ワーカーで実行される非同期Ray関数です。 アクタはRay APIをタスクからオブジェクトに拡張します。 Rayでは、タスクとアクターはオブジェクトに対して作成および計算されます。 詳細については、「Ray Framework」および「Ray Coreの概要」をご参照ください。

image.png

Rayクラスター

Rayクラスターは、ヘッドノードと複数のワーカーノードで構成されます。 ヘッドノードはRayクラスターを管理し、ワーカーノードはコンピューティングタスクを実行します。 ワーカーノードは、ネットワーク接続を介してヘッドノードと通信し、協働する。 Rayクラスターは、物理マシン、仮想マシン、Kubernetes、またはクラウドコンピューティングプラットフォームにデプロイできます。 詳細については、「Rayクラスターの概要」および「キーの概念」をご参照ください。

運用環境内の複数のマシンにRayアプリケーションを配置するには、まず、ヘッドノードとワーカーノードで構成されるRayクラスターを作成する必要があります。 RayノードはKubernetesでポッドとして実行されます。 Rayオートスケーラーを使用して、自動スケーリングを実行できます。

次の図は、Rayクラスターのアーキテクチャを示しています。

image.svg

Ray on Kubernetes

KubeRay演算子は、KubernetesネイティブでRayクラスターを管理する方法を提供します。 KubeRay演算子を使用して、ACKクラスターを含むRayクラスターをKubernetes環境にデプロイできます。 KubeRay演算子をインストールするときは、展開演算子とRayCluster、RayJob、およびRayService CustomResourceDefinitions (CRD) を展開する必要があります。

Ray on Kubernetesは、分散アプリケーションのデプロイと管理を大幅に簡素化できます。 Ray on Kubernetesには以下の利点があります。 詳細については、「Ray on Kubernetes」をご参照ください。

  • 自動スケーリング: Kubernetesは、ワークロードに基づいてノード数を自動的にスケーリングできます。 KubernetesでRayオートスケーラーをデプロイした後、Kubernetesはワークロードに基づいてRayクラスターを動的にスケーリングし、リソース使用率を最適化し、分散アプリケーションの管理を簡素化できます。

  • フォールトトレランス: Rayはフォールトトレランスで設計されています。 この機能は、RayがKubernetesで実行されると強化されます。 Rayノードに障害が発生すると、Kubernetesは障害のあるノードを自動的に置き換え、Rayクラスターの安定性と可用性を確保します。

  • リソース管理: Kubernetesでは、リソース要求と制限を作成して、Rayノードで使用されるCPUリソースやメモリリソースなどのリソースをきめ細かく制御および管理できます。 これにより、リソース使用率が向上し、リソースの無駄がなくなります。

  • シンプルデプロイ: Kubernetesは、コンテナ化されたアプリケーションをデプロイ、管理、および監視するための統合システムを提供します。 Ray on Kubernetesは、開発、ステージング、および本番環境でRayクラスターを設定および管理するための一貫したエクスペリエンスを提供します。

  • サービスの検出と負荷分散: Kubernetesはサービスの検出と負荷分散をサポートします。 Kubernetesを使用して、Rayノード間の接続、およびクライアントとRayクラスター間の接続を自動的に管理できます。 これにより、ネットワーク構成が簡素化され、ネットワークパフォーマンスが向上します。

  • マルチテナント: Kubernetesの名前空間を使用して、異なるユーザーまたはチームに属するRayクラスターを分離し、Kubernetesクラスター内のリソースを共有できます。

  • モニタリングとロギング: Kubernetesは、モニタリングとロギングの監視機能を提供し、Rayクラスターのステータスとパフォーマンスを追跡できます。 たとえば、PrometheusとGrafanaを使用してRayクラスターのパフォーマンスメトリックを収集できます。

  • 互換性: Kubernetesはクラウドネイティブエコシステムの中核です。 複数のクラウドサービスプロバイダーやテクノロジースタックと互換性があります。 KubernetesにRayクラスターをデプロイした後、クラスターをさまざまなクラウドコンピューティングプラットフォームまたはハイブリッドクラウド環境に移行またはスケールできます。

Ray on ACK

Container Service for Kubernetes (ACK) は、世界で初めて認定Kubernetes適合プログラムに参加するサービスの1つです。 ACKは、高性能なコンテナ化アプリケーション管理サービスを提供し、エンタープライズクラスのコンテナ化アプリケーションのライフサイクル管理をサポートします。 KubeRayを使用すると、クラウドでACKクラスターを作成するのと同じ方法で、ACKクラスターでRayクラスターを作成できます。

  • Rayクラスターは、Simple Log Service、Managed Service for Prometheus、およびApsaraDB for Redisと連携して、ログ管理、観測性、および可用性を向上させることができます。

  • rayオートスケーラーとACKオートスケーラーの組み合わせを使用して、必要に応じてコンピューティングリソースをスケーリングできます。

image.png

課金

ACKクラスターにRayクラスターを作成した後、Simple Log Service、Managed Service for Prometheus、ApsaraDB for Redisを使用して、ログの管理、観測性、可用性を向上させることができます。 ACKによって発生する料金に加えて、他のリソースも支払う必要があります。 課金の詳細については、以下のトピックを参照してください。

1環境を準備する

手順1: クラスターの作成

ACKクラスターの作成方法の詳細については、「ACK管理クラスターの作成」をご参照ください。 ACKクラスターの更新方法の詳細については、「ACKクラスターの手動アップグレード」をご参照ください。 ACK Proクラスターが作成され、次の要件を満たしています。

  • クラスターのKubernetesバージョンはv1.24以降です。

  • ノード仕様: 少なくとも8つのvCPUと32 GBのメモリを提供するノードが作成されます。

  • ステージング環境では、推奨される最小仕様を使用できます。 オンデマンドでGPU高速化ノードを設定できます。

    Elastic Compute Service (ECS) インスタンスタイプの詳細については、「インスタンスファミリーの概要」をご参照ください。

  • クラスターに対してSimple Log Serviceが有効になっています。

  • クラスターでPrometheusのサービス管理が有効になっています。

  • kubectlクライアントがクラスターに接続されています。 詳細については、「クラスターのkubeconfigファイルを取得し、kubectlを使用してクラスターに接続する」をご参照ください。

(オプション) Tairインスタンス

高可用性とフォールトトレランスをサポートするRayクラスターをデプロイするには、この例ではApsaraDB for Redisインスタンスを使用します。 オンデマンドでApsaraDB for Redisインスタンスを作成できます。 Tair (Redis OSS互換) インスタンスが作成されました。 インスタンスは次の要件を満たしています。

  • ApsaraDB for Redisインスタンスは、ACK Proクラスターと同じリージョンと仮想プライベートクラウド (VPC) にデプロイする必要があります。 詳細については、「手順1: インスタンスの作成」をご参照ください。

  • VPC CIDRブロックからのアクセスを許可するホワイトリストを追加します。 詳細については、「手順2: ホワイトリストの設定」をご参照ください。

  • ApsaraDB for Redisインスタンスのエンドポイントを取得します。 VPCエンドポイントを使用することを推奨します。 詳細については、「エンドポイントの表示」をご参照ください。

  • ApsaraDB for Redisインスタンスのパスワードを取得します。 詳細については、「パスワードの変更またはリセット」をご参照ください。

ステップ2: Kubernetes-Operatorのインストール

重要

Kubernetes-ACKクラスターが提供するオペレーターは招待プレビュー中です。 このコンポーネントを使用するには、チケットを起票

して申請します。

  1. ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。

  2. 作成したクラスターの名前をクリックします。 クラスターの詳細ページで、[操作] > [アドオン] > [アプリケーションの管理] をクリックし、[Kubernetes-Operator] をインストールします。

    image

手順3: Rayクラスターのデプロイ

次のコマンドを実行して、myfirst-Ray-clusterという名前のrayクラスターを作成し、デプロイメントステータスを表示します。

  1. 次のコマンドを実行してRayクラスターを作成します。

    展開してコードを表示

    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クラスターのデプロイメントステータスを照会します。

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

    Rayクラスターを実行するポッドを照会します。

    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クラスターに関連付けられたサービスを照会します。

    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 Simple Log Serviceとの統合

Simple Log ServiceをRayクラスターと統合して、ログを永続化できます。

  1. 次のコマンドを実行してグローバルAliyunLogConfigオブジェクトを作成し、ACKクラスターのLogtailコンポーネントがRayクラスターのポッドによって生成されたログを収集し、そのログをSimple Log Serviceプロジェクトに配信できるようにします。

    展開してコードを表示

    cat <<EOF | kubectl apply -f -
    apiVersion: log.alibabacloud.com/v1alpha1
    kind: AliyunLogConfig
    metadata:
      name: rayclusters
      namespace: kube-system
    spec:
       # The name of the Logstore. If the specified Logstore does not exist, Simple Log Service automatically creates a Logstore. 
      logstore: rayclusters
      # Configure Logtail. 
      logtailConfig:
        # The type of data source. If you want to collect text logs, you must set the value to file. 
        inputType: file
        # The name of the Logtail configuration. The name must be the same as the resource name that is specified in metadata.name. 
        configName: rayclusters
        inputDetail:
          # Configure Logtail to collect text logs in simple mode. 
          logType: common_reg_log
          # The path of the log file. 
          logPath: /tmp/ray/session_*-*-*_*/logs
          # The name of the log file. You can use wildcard characters such as asterisks (*) and question marks (?) when you specify the log file name. Example: log_*.log. 
          filePattern: "*.*"
          # If you want to collect container text logs, you must set dockerFile to true. 
          dockerFile: true
          # The conditions that are used to filter containers. 
          advanced:
            k8s:
              IncludeK8sLabel:
                ray.io/is-ray-node: "yes"
              ExternalK8sLabelTag:
                ray.io/cluster: "_raycluster_name_"
          			ray.io/node-type : "_node_type_"
    EOF

    パラメーター

    説明

    logPath

    ポッドの /tmp/ray/session_*-*-*_*/logsディレクトリにあるすべてのログを収集します。 カスタムパスを指定できます。

    advanced.k8s.ExternalK8sLabelTag

    収集したログにログ取得用のタグを追加します。 デフォルトでは、_raycluster_name_ および _node_type_ タグが追加されます。

    AliyunLogConfigパラメーターの詳細については、「CRDを使用してDaemonSetモードでコンテナログを収集する」をご参照ください。 Simple Log Serviceは有料サービスです。 詳細については、「課金の概要」をご参照ください。

  2. Rayクラスターのログ情報を表示します。

    ACKコンソールにログインします。 左側のナビゲーションウィンドウで、[クラスター] をクリックします。 作成したクラスターの名前をクリックします。 クラスターの詳細ページで、次の図に示すように、[クラスター情報] > [基本情報] > [クラスターリソース] をクリックし、[Log Serviceプロジェクト] の右側にあるハイパーリンクをクリックしてSimple Log Serviceプロジェクトにアクセスします。

    image

  3. raycclustersに対応するLogstoreを選択し、ログの内容を表示します。

    _raycluster_name_ などのタグに基づいて、さまざまなRayクラスターのログを表示できます。

    image

3の管理対象サービスとの統合

RayクラスターでPrometheusモニタリングサービスを使用できます。 Prometheusモニタリングサービスの詳細については、「Prometheusのマネージドサービス」をご参照ください。

次のコマンドを実行してPod MonitorとService Monitorをデプロイし、Rayクラスターのメトリクスデータを収集します。

  1. 次のコマンドを実行して、Podモニターをデプロイします。

    展開してコードを表示

    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. 次のコマンドを実行して、サービスモニターを展開します。

    展開してコードを表示

    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パネルで、作成したACKクラスターを選択し、[OK] をクリックします。

      image

    2. ACKクラスターがマネージドサービスfor Prometheusと統合されたら、[統合管理] を選択して [統合管理] ページに移動します。 [コンポーネント管理] タブで、[コンポーネントタイプ] セクションの [ダッシュボード] をクリックし、[レイクラスター] をクリックします。

      image

    3. 名前空間RayClusterName、およびSessionNameを指定して、Rayクラスターで実行されるタスクのモニタリングデータをフィルター処理します。

      image.png

関連ドキュメント