Ray クラスターは、EMR Serverless Spark ワークスペースが提供する分散コンピューティングフレームワークです。Python ネイティブの分散コンピューティング、機械学習モデルのトレーニング、推論などのシナリオをサポートしています。このトピックでは、Ray クラスターの作成と起動、および Ray ジョブの送信方法について説明します。
Ray クラスターの作成
EMR Serverless Spark コンソールにログインし、対象のワークスペースに移動します。
左側のナビゲーションペインで、[クラスター管理] をクリックし、次に [Ray クラスター] タブをクリックします。
[Ray クラスターの作成] をクリックします。表示されるパネルで、次のパラメーターを設定し、[作成] をクリックします。
[クラスター名]:クラスター名を入力します。
[エンジンバージョン]:エンジンバージョンを選択します。現在のデフォルトは
emr-1.0.1 (Ray 2.47.1, Python 3.12)です。[ノードグループ]: CPU と GPU のリソースを混在させて使用する必要がある場合は、個別の CPU ノードグループと GPU ノードグループを作成できます。[+ ワーカーノードグループの追加] をクリックし、次のパラメーターを設定します。
[ノードグループ名]: ノードグループに一意の名前を入力します。
[リソースキュー]:リソースキューを選択します。
[リソース仕様]:ノードのリソース仕様を選択します。
[ノード数]:ワーカーノード数を設定します。
(オプション) [ネットワーク接続]:Ray クラスターから同じ VPC 内のサービスにアクセスする場合は、既存のネットワーク接続を選択します。
(任意) [マネージドファイルディレクトリのマウント]:既存のマネージドファイルディレクトリを選択すると、お使いの Ray ジョブでそのディレクトリ内のファイルの読み取りと書き込みが可能になります。マウントは、CPFS、NAS、OSS からのパスをローカルディレクトリにマッピングする一般的なデータアクセス方法であり、プログラムからローカルパスを使用してデータにアクセスできます。新しいマネージドファイルディレクトリを作成するには、「マネージドファイルディレクトリの管理」をご参照ください。
(オプション) クラスターの高度な設定: JSON 形式で高度なパラメーターを設定します。詳細については、「クラスターの高度な設定」をご参照ください。
コンソールでは現在、ワーカーノードのオートスケーリングの設定はサポートされていません。この機能を設定するには、API を使用してください。詳細については、「CreateRayCluster」をご参照ください。
Ray クラスターの起動
Ray クラスターの一覧で、目的のクラスターを見つけ、[開始] をクリックします。
クラスターのステータスが[実行中]になるまで待ちます。
説明ワークスペースで初めて Ray クラスターを起動すると、追加のコンポーネントが作成されるため、2~3 分ほどかかる場合があります。2 回目以降の起動は大幅に高速化されます。
クラスターの起動後、[呼び出し情報] をクリックすると、Ray ジョブのサブミットに必要なエンドポイントアドレスとトークンが表示されます。
警告現在のバージョンでは、Ray クラスターのトークンに有効期限はありません。不正アクセスを防ぐため、トークンは安全に保管してください。
[ダッシュボード] をクリックすると、Ray クラスターのモニタリングインターフェイスが開き、クラスターのリソース使用状況を表示できます。
Ray ジョブの送信
方法1:インタラクティブな開発
この方法は、クイックスタートとデバッグに最適です。EMR Serverless Spark コンソールの Notebook 環境から、追加のネットワーク設定なしで Ray クラスターに直接接続できます。ローカルマシンから接続する場合は、ローカルマシンから Ray クラスターへネットワーク接続できること、および Python 3.12 環境を使用していることを確認してください。
Ray クライアントをインストールします。
pip install ray[client]==2.47.1クラスターの [呼び出し情報] ページで、[gRPC アドレス] と [トークン] を取得します。
次のサンプルコードを使用して、Ray クラスターに接続し、インタラクティブな開発を行います。
import ray import os def get_metadata(): headers = {"ray-token": "<your_token>"} return [(key.lower(), value) for key, value in headers.items()] ray.init(address="<your_gRPC_address>", _metadata=get_metadata()) import time @ray.remote def square(x): time.sleep(0.1) return x * x futures = [square.remote(i) for i in range(10)] results = ray.get(futures) print("Square results:", results)
方法2:SDKによる送信
この方法は、アプリケーションコードに Ray ジョブの送信を組み込む場合に適しています。ローカル環境に Python 3.12 がインストールされている必要があります。
Ray ジョブ送信クライアントライブラリをインストールします。
pip install "ray[default]==2.47.1"クラスターの[呼び出し情報] ページで、[パブリックエンドポイント] と [トークン] を取得します。
次のサンプルコードを使用して、Ray クラスターに接続し、ジョブを送信します。
import time from ray.job_submission import JobSubmissionClient custom_headers = { "ray-token": "<your_token>" } client = JobSubmissionClient("<your_public_endpoint>", headers=custom_headers) # または、内部ネットワークを使用することもできます。この場合、クライアントがクラスターと同じリージョンおよび VPC にあることが必要です。 # 内部ネットワーク経由での送信は、安定性向上のため推奨します。 # client = JobSubmissionClient("http://emr-spark-ray-gateway-cn-beijing-internal.spark.emr.aliyuncs.com", headers=custom_headers) job_id = client.submit_job( entrypoint="python -c 'print(\"Hello from Ray Client!\")'" ) print(f"Submitted job with ID: {job_id}") while True: status = client.get_job_status(job_id) print(f"Job status: {status}") if status.is_terminal(): break time.sleep(1) logs = client.get_job_logs(job_id) print("Job logs:") print(logs)
(オプション) ジョブからマウントされたディレクトリ内のファイルにアクセスするには、Ray クラスターの作成時にマネージドファイルディレクトリをマウントします。次に、ジョブの送信時にマウントパスを使用してファイルを参照します。次の例では、OSS ディレクトリを
/mnt/myossパスにマウントしていることを前提としています。import time from ray.job_submission import JobSubmissionClient custom_headers = { "ray-token": "<your_token>" } client = JobSubmissionClient("<your_public_endpoint>", headers=custom_headers) # マウントパスを使用して、OSS内のスクリプトファイルをエントリポイントとして直接参照します。 job_id = client.submit_job( entrypoint="python /mnt/myoss/main.py" ) print(f"Submitted job with ID: {job_id}") while True: status = client.get_job_status(job_id) print(f"Job status: {status}") if status.is_terminal(): break time.sleep(1) logs = client.get_job_logs(job_id) print("Job logs:") print(logs)説明Ray ジョブコード内では、マウントパスを使用してファイルの読み書きを直接行うこともできます。たとえば、
/mnt/myoss/test.txtから読み取ったり、/mnt/myoss/ディレクトリにファイルを書き込んだりできます。このディレクトリに書き込まれたファイルは、対応する OSS パスに同期されます。次の例は、Ray ジョブ内でマウントされたディレクトリのファイルの読み書きを行う方法を示しています。
# 次のコードはRay クラスターに送信されます。 import ray import time ray.init() @ray.remote def read_from_mount_path(i): with open('/mnt/myoss/test.txt', 'r', encoding='utf-8') as f: content = f.read() return content @ray.remote def write_to_mount_path(i): content = "Hello world " + str(i) with open('/mnt/myoss/output' + str(i) + '.txt', 'w', encoding='utf-8') as f: f.write(content) return 'Write succeeded' print("--- Starting remote tasks ---") start_time = time.time() obj_refs = [read_from_mount_path.remote(i) for i in range(4)] obj_refs2 = [write_to_mount_path.remote(i) for i in range(4)] results = ray.get(obj_refs) results2 = ray.get(obj_refs2)
方法3:コマンドラインによる送信
この方法は、外部システムとの統合に最適です。ローカル環境に Python 3.12 がインストールされている必要があります。
Ray ジョブ送信クライアントライブラリをインストールします。
pip install "ray[default]==2.47.1"クラスターの[呼び出し情報] ページで、[パブリックエンドポイント] と [トークン] を取得します。
次のコマンドを実行して、Ray ジョブを送信します。
# `ray job submit` を実行する前に、RAY_ADDRESS および RAY_JOB_HEADERS 環境変数を設定する必要があります。 export RAY_ADDRESS='<your_public_endpoint>' export RAY_JOB_HEADERS='{"ray-token": "<your_token>"}' # ジョブを送信します # 例: 分散ソートを実行するジョブを送信します。 ray job submit --working-dir "." -- python test-ray-core-sort.py # OSSへの読み書きをサポートします。 ray job submit --working-dir "." -- python test-saving-data-test.py # OSS-HDFSへの読み書きをサポートします。 ray job submit --working-dir "." -- python test-saving-data-oss-hdfs-test.py # コードはマウントされたディレクトリへの読み書きをサポートします。 ray job submit --working-dir "." -- python test-saving-data-test-mount.py
その他のコマンドラインパラメーターについては、「Ray ジョブ送信 CLI 公式ドキュメント」をご参照ください。
クラスターの詳細設定
クラスターの詳細設定は JSON 形式で指定します。すべてのパラメータはオプションです。
パラメータ | 必須 | 説明 |
| オプション | クラスター起動時にヘッドノードとワーカーノードにダウンロードする OSS ファイルを指定します。OSS および OSS-HDFS パスをサポートしています。複数のパスはカンマ (,) で区切ります。ファイルは各ノードの |
| オプション | ヘッドノードとワーカーノードの Python ベース環境を初期化するために使用する |