Ray on Ubuntu — 分散ML学習クラスターのセットアップと使い方

AI/MLツール

Ray(レイ)は、Pythonで書いた処理を複数のCPUコアや複数のマシンに自動で分散させるためのフレームワークです。機械学習のハイパーパラメータ探索・大規模データ処理・強化学習など、「1台では遅すぎる」という場面で真価を発揮します。本記事では、Ubuntu 24.04 LTS に実際に Ray をインストールし、単一ノードで動かすところから Ray Dashboard・クラスター構築・Ray Tune までを、すべて実際にコンテナで動かした実測データとともに解説します。

結論から言うと、pip install "ray[default]" の1コマンドで Ray 2.55.1 が入ります。2026年6月15日に Ubuntu 24.04.4 LTS(Python 3.12.3)の公式Dockerイメージで実際に動かし、10個のタスクを並列実行して直列の1.007秒 → 並列0.493秒(約2.04倍速)になることを確認しました。Ray Dashboard やクラスター情報のスクリーンショットもすべて実画面です。

この記事のポイント

  • Ubuntu 24.04 LTS(Python 3.12.3)で pip install "ray[default]" の1コマンドで Ray 2.55.1 がインストールできる
  • @ray.remote を付けるだけで、既存のPython関数を分散タスクに変換できる
  • 実測では4CPUで 直列1.007秒 → 並列0.493秒(約2.04倍速)。理論上の10倍ではなくCPUコア数が上限になる
  • Ray Dashboard(ポート8265)でジョブ・ノード・リソースをブラウザから監視できる
  • Ubuntu 22.04(Python 3.10.12)でも動くが、Python が新しい Ubuntu 24.04 LTS を推奨

目次

  1. Rayとは何か — 分散処理フレームワークの基礎
  2. Ubuntu 24.04 への Ray インストール手順
  3. 基本的な使い方 — @ray.remote で並列タスクを実行
  4. Ray Dashboard の起動と使い方
  5. 2台以上のVPSでクラスターを組む
  6. ML実践例 — ハイパーパラメータ探索(Ray Tune)
  7. よくあるエラーと解決策
  8. まとめ

Rayとは何か — 分散処理フレームワークの基礎

Ray(ray.io)は、UCバークレー発のオープンソースの分散コンピューティングフレームワークです。Pythonから使えて、関数に @ray.remote を付けるだけで並列・分散実行に変換できるシンプルな設計が特徴です。フレームワーク(特定の処理の枠組みを提供するソフトウェア)の中でも、機械学習との相性のよさで人気があります。

たとえばハイパーパラメータの組み合わせが100通りあるとき、1台のマシンで順番に試すと100回分の時間がかかります。Rayを使えば、空いているCPUコアや複数台のマシンに自動で割り振って、コア数の分だけ並列に処理できます。後述の実測でも、4コアで約2倍速になることを確認しています。

似た用途のツールとの住み分けを整理すると、次のようになります。

分散処理フレームワーク比較(Ray/Dask/Spark/multiprocessing、概念図)
分散処理フレームワーク比較(Ray/Dask/Spark/multiprocessing、概念図)

Spark や Dask が「大規模データ処理」寄りなのに対し、Ray はML訓練やタスク並列・強化学習に強く、デコレータを付けるだけで始められる学習コストの低さが魅力です。

Ubuntu 24.04 への Ray インストール手順

Ray の最小要件は Python 3.9 以上です。Ubuntu 24.04 LTS には Python 3.12.3 が標準搭載されており、条件を満たしています。今回は ubuntu:24.04 の公式Dockerイメージ(Ubuntu 24.04.4 LTS / aarch64 / kernel 5.10.76-linuxkit)に Docker 20.10.12 環境でインストールしました。

注意:Ubuntu 24.04 は pip を直接実行できません

Ubuntu 24.04 では pip install を直接実行すると error: externally-managed-environment(PEP 668)で弾かれます。必ず python3 -m venv で仮想環境を作ってからインストールしてください。実際のエラーは後述の「よくあるエラー」で紹介します。

手順1:前提パッケージをインストールする




ubuntu@linuxlab: ~
$ sudo apt update
$ sudo apt install -y python3 python3-pip python3-venv curl
$ python3 –version
Python 3.12.3

手順2:仮想環境を作成して Ray をインストールする

"ray[default]" を指定すると、Ray 本体に加えて Ray Dashboard に必要な依存(aiohttp / prometheus_client など)もまとめて入ります。あとでダッシュボードを使うので、最初から [default] 付きがおすすめです。




ubuntu@linuxlab: ~
$ python3 -m venv ray_env
$ source ray_env/bin/activate
(ray_env) $ pip install “ray[default]”
Collecting ray
Downloading ray-2.55.1-cp312-cp312-manylinux2014_aarch64…whl
Installing collected packages: … ray, aiohttp_cors, …
Successfully installed ray-2.55.1 aiohttp-3.14.1 …

Ubuntu 24.04.4 LTS + Python 3.12.3 の組み合わせで、Ray 2.55.1 のインストールが完了しました。aarch64(ARM)環境でも公式 wheel が用意されており、ビルドなしで入ります。

手順3:バージョンを確認する




ubuntu@linuxlab: ~
(ray_env) $ python3 -c “import ray; print(ray.__version__)”
2.55.1
(ray_env) $ ray –version
ray, version 2.55.1

実際に取得したバージョン構成は次のとおりです。

Ray/Python/Ubuntuバージョン実測表(実測)
Ray/Python/Ubuntuバージョン実測表(実測)

Ubuntu 22.04 でも動くが 24.04 を推奨

「手元が Ubuntu 22.04 なんだけど大丈夫?」という方も多いはずです。実際に ubuntu:22.04ubuntu:24.04 の両コンテナで標準 Python を確認したところ、22.04 は Python 3.10.12、24.04 は Python 3.12.3 でした。どちらも Ray の最小要件(Python 3.9以上)を満たすので動きますが、新しい Python のほうがライブラリ対応や性能改善が進んでいるため、これから始めるなら 24.04 LTS がおすすめです。

Ubuntu 22.04 と 24.04 の Python バージョン差(実測)
Ubuntu 22.04 と 24.04 の Python バージョン差(実測)

基本的な使い方 — @ray.remote で並列タスクを実行

Rayの最大の特徴は、既存のPython関数を1行の変更で分散タスクに変換できることです。効果を確かめるため、「0.1秒スリープして二乗を返す」関数を10個、直列と並列で実行して比較しました。

①直列との比較スクリプト




ubuntu@linuxlab: ~/ray_project
(ray_env) $ cat ray_demo.py
import ray, time
ray.init(num_cpus=4, include_dashboard=False)

# @ray.remote を付けると分散タスクになる
@ray.remote
def square(x):
time.sleep(0.1)
return x * x

start = time.time()
futures = [square.remote(i) for i in range(10)]
results = ray.get(futures) # 全タスクの完了を待つ
print(“results:”, results)
print(“parallel: %.3fs” % (time.time() – start))
ray.shutdown()

②実行結果




ubuntu@linuxlab: ~/ray_project
(ray_env) $ python3 ray_demo.py
INFO worker.py:2012 — Started a local Ray instance.
results: [0, 1, 4, 9, 16, 25, 36, 49, 64, 81]
parallel: 0.493s
# 同じ処理を直列の for ループで回すと 1.007s

10個のタスク(square(0)〜square(9))が、直列なら1.007秒かかるところを0.493秒(約2.04倍速)で完了しました。これは実際に Ubuntu 24.04 コンテナで Ray 2.55.1 を実行した結果です。

Ray並列実行 vs 直列実行の所要時間(実測)
Ray並列実行 vs 直列実行の所要時間(実測)
著者アイコン
著者アイコン

正直、ここは期待しすぎ注意です。タスク10個でも「10倍速」にはなりません。並列度は使えるCPUコア数が上限で、今回は4コアなので約2倍。コア数(VPSのvCPU数)を増やすほど効く、と覚えておくと裏切られません。

③ ray.cluster_resources() でリソースを確認する

Rayが認識しているリソースは ray.cluster_resources() で確認できます。今回の単一ノードでは次のように返ってきました(実測)。




ubuntu@linuxlab: ~/ray_project
(ray_env) $ python3 -c “import ray; ray.init(num_cpus=4); print(ray.cluster_resources())”
{‘CPU’: 4.0, ‘memory’: 8666358580.0, ‘object_store_memory’: 3714153676.0, …}

④ Ray Actor — 状態を持つ分散オブジェクト

関数だけでなく、クラスを分散オブジェクト(Actor)にすることもできます。Actorは内部状態を持ち続けるため、カウンターやパラメータサーバーのような用途に向いています。実際に5回インクリメントすると、ちゃんと 5 が返りました。




ubuntu@linuxlab: ~/ray_project
(ray_env) $ python3 actor_demo.py
@ray.remote
class Counter:
def __init__(self): self.count = 0
def increment(self): self.count += 1
def get(self): return self.count

counter = Counter.remote()
for _ in range(5): counter.increment.remote()
print(ray.get(counter.get.remote()))
5

Ray Dashboard の起動と使い方

Ray Dashboard は、クラスターのリソース使用率・ジョブ状況・ノード状態をブラウザから確認できるWebUIです。ポート8265でHTTPサーバーが立ち上がります。"ray[default]" でインストール済みなら追加作業は不要です。

手順1:ダッシュボード付きで Ray を起動する




ubuntu@linuxlab: ~
(ray_env) $ ray start –head –dashboard-host=0.0.0.0 –dashboard-port=8265
Local node IP: 172.17.0.19
Ray runtime started.
To monitor and debug Ray, view the dashboard at 172.17.0.19:8265

VPSで使う場合の注意

VPS上でDashboardを開く場合は、ポート8265にファイアウォール(ufw)の穴を開けます: sudo ufw allow 8265/tcp。ただし Dashboard には認証がないため、本番では特定IPのみ許可するか、SSHポートフォワード(ssh -L 8265:localhost:8265 ...)経由でのアクセスを強く推奨します。

手順2:ブラウザでダッシュボードを開く

ブラウザで http://<サーバーのIP>:8265 にアクセスすると、Ray Dashboard が開きます。以下は実際に Ray 2.55.1 を起動し、Playwright で撮影した Overview 画面です。

Ray Dashboard Overview画面(実撮影)
Ray Dashboard Overview画面(実撮影)

右下の「Resource Status」に 0.0/5.0 CPU / 8.06GiB memory / 3.45GiB object_store_memory と、実際のリソースが表示されています。Overview からは以下が確認できます。

  • Cluster utilization:クラスター全体のCPU・メモリ使用率
  • Recent jobs:直近のジョブ一覧
  • Cluster status / Resource Status:ノード数とリソースの空き状況

時系列グラフを出すには Prometheus + Grafana が必要

  • 初期状態では「Set up Prometheus and Grafana for better Ray Dashboard experience」と表示され、CPU等の時系列グラフは非表示になっている
  • これは仕様で、Prometheus と Grafana を別途立てて連携すると折れ線グラフが出るようになる
  • まずは状態確認だけなら、グラフなしの初期状態でも十分使える

手順3:Jobs / Cluster タブを見る

Jobs タブでは、投入したジョブの状態・所要時間・タスク進捗が一覧できます。実際に2つのジョブを投入したところ、どちらも SUCCEEDED になり、所要時間(1秒838ミリ秒 / 2秒257ミリ秒)まで表示されました。

Ray Dashboard Jobs一覧画面(実撮影)
Ray Dashboard Jobs一覧画面(実撮影)

Cluster タブでは、接続中のノードごとのCPU・メモリ使用率や、Ray内部プロセス(DashboardAgent・RuntimeEnvAgent など)まで確認できます。今回は Head ノード(172.17.0.19)が1台で、CPU約4.5% / メモリ1.07GB中の11.68GB という実値が出ています。

Ray Dashboard Cluster(ノード一覧)画面(実撮影)
Ray Dashboard Cluster(ノード一覧)画面(実撮影)

2台以上のVPSでクラスターを組む

Rayの真価は、複数のマシンを束ねてスケールさせる点にあります。VPSを2台(Head ノード1台 + Worker ノード1台)用意するだけで、分散クラスターが構築できます。流れは次のとおりです。

Rayクラスター構築の流れ(概念図)
Rayクラスター構築の流れ(概念図)

手順1:Head ノード(司令塔)を起動する

実際に ray start --head を実行すると、Worker を参加させるためのコマンドが案内されます(IPは環境により変わります)。




head-node@vps1: ~
(ray_env) $ ray start –head –dashboard-host=0.0.0.0 –port=6379
Ray runtime started.
To add another node to this Ray cluster, run
ray start –address=’172.17.0.19:6379′

手順2:Worker ノードを参加させる




worker-node@vps2: ~
(ray_env) $ ray start –address=’172.17.0.19:6379′
Ray runtime started.

手順3:ray status でクラスターを確認する

クラスターの状態は ray status で確認できます。今回の単一ノード(Head のみ)では、合計5.0 CPU・8.06GiB メモリが利用可能と表示されました(実測)。Worker を足すと、この CPU 数とメモリが合算されていきます。




head-node@vps1: ~
(ray_env) $ ray status
======== Autoscaler status ========
Active:
1 node_8cb241e3e40d…feb100
Resources
0.0/5.0 CPU
0B/8.06GiB memory
0B/3.45GiB object_store_memory

VPSの選び方(クラスター構築時)

  • Head ノードと Worker ノードは同じデータセンター内に置くとネットワーク遅延が最小になる
  • Vultr の Tokyo リージョンなら複数インスタンス間のプライベートネットワークが使える
  • 並列度はCPUコア数で決まるので、まずは vCPU の多いプランを Head + Worker で2台用意すると効果を体感しやすい

ML実践例 — ハイパーパラメータ探索(Ray Tune)

Rayのエコシステムには、ML向けの拡張ライブラリが揃っています。代表例がハイパーパラメータ自動探索の Ray Tune です。"ray[tune]" を追加インストールして使います。




ubuntu@linuxlab: ~
(ray_env) $ pip install “ray[tune]”
Successfully installed ray[tune]
(ray_env) $ cat tune_demo.py
from ray import tune
def train_model(config):
lr = config[“lr”]
return {“accuracy”: 1.0 – (lr – 0.01)**2 * 10} # 仮の精度
tuner = tune.Tuner(train_model,
param_space={“lr”: tune.grid_search([0.001, 0.01, 0.1, 0.5])})
results = tuner.fit()
print(results.get_best_result(metric=”accuracy”, mode=”max”).config)
(ray_env) $ python3 tune_demo.py
{‘lr’: 0.01}

4通りの学習率(lr)を並列で探索し、Ray Tune が自動で lr=0.01(accuracy=1.0)をベストと判定しました。実際の探索結果は次のとおりです(実測)。

Ray Tune グリッドサーチの実探索結果(実測)
Ray Tune グリッドサーチの実探索結果(実測)

この例では仮の精度計算を使っていますが、実際のモデル(PyTorch・TensorFlow等)でも train_model の中身を置き換えるだけで同じ構造で使えます。組み合わせが増えるほど、CPUコアやノードを足して並列に探索できるのが Ray Tune の強みです。

よくあるエラーと解決策

エラー① externally-managed-environment




ubuntu@linuxlab: ~
$ pip3 install ray
error: externally-managed-environment
× This environment is externally managed
╰─> To install Python packages system-wide, try apt install …

原因:Ubuntu 24.04 ではシステムPythonへの直接 pip install が PEP 668 で禁止されています。

解決策python3 -m venv ray_env && source ray_env/bin/activate で仮想環境を作ってから実行します。

エラー② num_cpus must not be provided(既存クラスターへの接続時)




ubuntu@linuxlab: ~
ValueError: When connecting to an existing cluster,
num_cpus and num_gpus must not be provided.

原因:すでに ray start --head でクラスターが動いている状態で、スクリプト側が ray.init(num_cpus=4) のようにCPU数を指定すると衝突します(実際に検証中に遭遇しました)。

解決策:既存クラスターに接続するときは ray.init(address="auto") とだけ書き、num_cpus は指定しません。ローカルで完結させたい場合は先に ray stop してから実行します。

エラー③ Address already in use(ポート競合)




ubuntu@linuxlab: ~
OSError: [Errno 98] Address already in use
$ ray stop
Stopped all Ray processes.
$ ray start –head

原因:Ray がすでに起動しています。

解決策ray stop で既存プロセスを停止してから再起動します。

object store の警告について

コンテナや小メモリ環境では The object store is using /tmp/ray instead of /dev/shm because /dev/shm has only ... bytes available という警告が出ることがあります。性能に影響するため、Docker で動かす場合は --shm-size=2gb のように共有メモリを増やすと改善します。

まとめ

Ubuntu 24.04 LTS への Ray インストールと基本的な使い方を、実際にDockerコンテナで動かしながら解説しました。

  • Ray 2.55.1 は pip install "ray[default]" の1コマンドでインストール完了(Ubuntu 24.04.4 / Python 3.12.3 / aarch64 で確認)
  • @ray.remote を付けるだけで既存関数が分散タスクになる。4CPUで直列1.007秒 → 並列0.493秒(約2.04倍速)
  • 並列度はCPUコア数が上限。劇的に速くするにはvCPUの多いプランや複数ノードが要る
  • Ray Dashboard(ポート8265)でジョブ・ノード・リソースをブラウザから監視できる(時系列グラフは Prometheus+Grafana 連携が必要)
  • VPS 2台なら ray start --headray start --address でクラスター構築、Ray Tune で探索を並列化できる

本格的に分散ML環境を作るなら、同じデータセンター内に vCPU の多いVPSを複数台借りるのがおすすめです。Vultr の Tokyo リージョンはプライベートネットワーク付きで使え、DigitalOcean も時間課金で気軽に試せます。

コメント

タイトルとURLをコピーしました