Rayとは?分散処理フレームワークの仕組みと採用判断を実装目線で解説【2026年版】
Rayは、Pythonで書いた処理を1台のマシンからクラスタまで同じコードのまま広げる分散実行フレームワークです。中核のRay Coreがタスク・アクター・オブジェクトストアという3つの部品を提供し、その上にデータ処理・分散学習・探索・推論配信・強化学習の5つのライブラリが載る構成をとります。この記事では、Ray Coreの最小コードから5ライブラリの守備範囲、SparkやDaskとの切り分け、KubeRayでのクラスタ運用、導入時につまずく箇所、そして採用してよい条件と見送るべき条件までを実装の順序で並べました。前提とするバージョンは2.56系(2026年8月時点)です。
まとめ:Rayは単一ノードで詰まった処理から段階導入する
Rayの導入判断は、機能比較より先に「いま何が詰まっているか」で決まります。1台のCPUコアを使い切っても処理が終わらない、GPU1枚にモデルが載らない、推論リクエストが1プロセスでさばけない。この3つのどれかに当たっていなければ、分散化のオーバーヘッドだけが増えます。
着手する順序は、Ray Coreのray.remoteで既存のPython関数を並列化するところからにしてください。ここで効果が出れば、同じクラスタの上にRay TrainやRay Serveを載せる拡張が効きます。逆にCoreの段階で速くならないなら、タスクの粒度かデータの受け渡し方が原因なので、ライブラリを増やしても改善しません。
本番運用に乗せる段階ではKubeRayを前提に設計します。KubernetesのオペレータとしてRayCluster・RayJob・RayServiceの3つのカスタムリソースを提供し、バッチ実行と常駐サービスを別リソースとして分けられるためです。手元のノートPCからクラスタへ持ち上げる経路が、この3つで説明できます。
見送る判断も同じくらい明確に持ってください。データ量が数十GBに収まり、専任でクラスタを見る担当者がいない体制では、Rayを入れるより単一ノードの大きいインスタンスへ寄せるほうが総コストは下がります。
RayとRay Coreの構成|タスク・アクター・オブジェクトストアの役割
Rayという名前は、分散実行のランタイムと、その上に載るAIライブラリ群の総称として使われます。まず土台にあたるRay Coreの3つの部品を切り分けます。
Rayの定義とAIワークロードを支える統一基盤としての位置づけ
公式ドキュメントはRayを「AIとPythonアプリケーションをスケールさせる統一フレームワーク」と定義しています。オーケストレーション、スケジューリング、障害時の復旧、オートスケールをランタイム側が引き受けるため、書き手はPythonの関数とクラスにデコレータを付けるだけで並列実行に移せる設計です。
PyPI上のrayパッケージは2.56.1が最新版で、対応Pythonは3.10以上という表記になっています(2026年8月時点)。バージョン系列の更新頻度が高いライブラリなので、クラスタ側とクライアント側で系列を揃える運用が前提になります。
タスクとアクターの違い|状態を持つ処理をどちらで書くかの判断基準
タスクは関数に@ray.remoteを付けたもので、呼び出すたびに空のワーカーで実行されます。状態を持たないので、前処理や独立した計算をばらまく用途に向きます。
アクターはクラスに同じデコレータを付けたもので、インスタンスごとに専用のワーカープロセスが割り当てられ、メソッド呼び出しの間も内部状態が残ります。公式ドキュメントはアクターのメソッドが投入順に直列実行されると明記しており、1つのアクターへ大量のリクエストを集中させると、そこが直列化のボトルネックになります。判断の目安はひとつ。モデルの重みやコネクションのように「1度読み込んで使い回したいもの」を抱えるならアクター、それ以外はタスクです。
オブジェクトストアの仕組み|ゼロコピー共有とObjectRefの扱い
タスクやアクターの戻り値は、ノードごとの共有メモリ上にあるオブジェクトストアへ置かれ、呼び出し元にはObjectRefという参照だけが返ります。実体をコピーせず参照を渡し合えるので、大きな配列を複数のタスクへ配る場合でもメモリの重複を抑えられます。
明示的に置きたいときはray.putを使います。同じ大きなデータを何度もタスク引数に渡すと、そのたびにストアへ格納されて無駄が出るため、先に一度ray.putして参照を配る書き方が定石です。取り出しはray.getで、参照を実体へ戻します。
Ray Coreの最小実装|3つのAPIで並列化する手順と注意点
Rayの入門で覚えるAPIは3つに絞られます。ここを外すと、後段のライブラリを触っても挙動が読めません。
ray.initからray.getまでの実行順序と戻り値の受け取り方
最小の流れは次の4段です。
ray.initでランタイムへ接続する(引数なしならローカルに起動)- 並列化したい関数に
@ray.remoteを付ける - 関数を
.remote()で呼び、即座にObjectRefを受け取る - 結果が必要になった時点で
ray.getを呼び、実体を取り出す
ここでの落とし穴は、ループの内側でray.getを呼んでしまう書き方です。参照を取るたびに完了を待つので、並列に投げたつもりの処理が逐次実行へ戻ります。まず参照のリストを作り切り、最後にまとめてray.getへ渡してください。
並列化で効果が出る処理と、かえって遅くなるタスク粒度の見極め方
タスク1件の実行時間が数ミリ秒しかない処理を大量に投げると、スケジューリングとシリアライズのコストが計算時間を上回ります。目安として、1タスクが数十ミリ秒から数秒の粒度になるよう、ループをまとめてバッチ化してから投げる形にします。
逆に効果が出やすいのは、画像の前処理やシミュレーションのように、入力ごとに独立して計算でき、1件あたりの計算が重い処理です。CPUバウンドな処理をプロセスレベルで分散させる点は、Python標準のmultiprocessingと同じ発想ですが、Rayは複数ノードへそのまま拡張できる点が異なります。
Ray上位5ライブラリの守備範囲|Data・Train・Tune・Serve・RLlib
Ray Coreの上には、機械学習の工程ごとに分かれた5つのライブラリが載ります。全部を同時に入れる必要はなく、詰まっている工程だけを選びます。
Data・Train・Tune・Serve・RLlibの担当範囲と使う場面
| ライブラリ | 担当範囲 | 使う場面 |
|---|---|---|
| Ray Data | データ読み込みと変換 | 学習前のバッチ前処理 |
| Ray Train | 分散学習の実行 | 複数GPUでのモデル学習 |
| Ray Tune | ハイパーパラメータ探索 | 学習率やバッチ幅の探索 |
| Ray Serve | オンライン推論の配信 | 推論APIの常時提供 |
| RLlib | 強化学習の分散実行 | 方策学習のシミュレーション |
RLlibを検討する場合は、報酬設計と方策更新の前提を押さえておく必要があります。仕組みの側は強化学習とは?報酬から学ぶ仕組みとQ学習・方策勾配・企業導入の判断で整理しているため、本記事では分散実行の担当範囲に絞ります。
Ray TrainとRay Serveの最小構成|学習と推論の接続点
Ray TrainのPyTorch向けクイックスタートは、TorchTrainerに学習ループの関数とScalingConfigを渡す形をとります。ワーカー数とGPU使用の有無はScalingConfig側で宣言し、学習ループ内ではprepare_modelとprepare_data_loaderがモデルの分散ラップとサンプラー設定を引き受ける分担です。
Ray Serve側はクラスに@serve.deploymentを付け、.bind()でアプリケーションを組み立て、serve runで起動します。レプリカ数はnum_replicas、CPUやGPUの割り当てはray_actor_optionsで指定する構成です。学習で作った成果物をそのままServeのデプロイメントへ読み込ませられるため、学習と推論を同じクラスタ設定の上で扱えます。大規模言語モデルの推論そのものを高速化したい場合は、vLLMとは?PagedAttentionの仕組み・使い方とOllamaとの違いで扱う専用エンジンをServeの内側に置く構成が現実的でしょう。
SparkやDaskとの違い|Rayを選ぶ条件と選ばない条件の切り分け
分散処理の選定でRayが比較されるのは、たいていSparkとDaskです。3者は同じ土俵に見えて、中心に据えている抽象が違います。
SparkやDaskとの設計思想の違いと得意な処理の向き不向き
| 観点 | Ray | Spark | Dask |
|---|---|---|---|
| 中心の抽象 | タスクとアクター | データフレームとRDD | 配列とデータフレーム |
| 得意な処理 | Python中心のAI処理 | 大規模なETLと集計 | NumPy系の数値計算 |
| 状態の保持 | アクターで保持可能 | 基本は非保持 | 基本は非保持 |
| 主な利用言語 | Python | ScalaとPython | Python |
テーブル形式のデータを集計してデータウェアハウスへ流す処理なら、Sparkのほうが実績もエコシステムも厚くなります。Spark側の高速化を先に検討する道もあり、GPUで処理を押し上げる選択肢はAccelerator for Apache Spark|RAPIDSでSpark処理をGPU高速化する仕組みにまとめました。Rayが優位に立つのは、状態を持つワーカーが必要な処理、つまり強化学習のシミュレータやモデルを常駐させる推論のような形です。
Kubeflowなど既存のML基盤と併用するときの役割分担の決め方
RayとKubeflowは競合ではなく層が違います。Kubeflowはパイプラインの定義と実行管理を担い、Rayはその1ステップの内側で計算を分散させる位置です。すでにKubeflowとは?Kubernetes上の機械学習基盤の全体像とPipelinesの使い方の構成で回っているなら、学習ステップの中身をRay Trainへ置き換える形が移行コストの少ない入り方になります。
実験管理や監視まで含めた周辺スタックの並びはMLOpsツール比較|実験管理・パイプライン・監視の主要スタックと選定基準で整理しています。Rayを入れても実験管理は別途必要になるため、そこを先に決めておくと後戻りを防げます。
KubeRayでのクラスタ運用|3つのカスタムリソースの使い分け
ローカルのray.initから本番へ移すときの標準経路がKubeRayです。Kubernetesのオペレータとして動き、Rayクラスタをマニフェストで宣言的に管理します。
RayClusterでヘッドノードとワーカーを定義する構成の考え方
RayClusterは、ヘッドノードのPodとワーカーPod群からなるクラスタ本体を管理します。ワーカーはグループ単位で種類を分けられるため、CPUのみのグループとGPU付きのグループを同じクラスタ内に共存させる構成が取れます。オートスケールも任意で有効化でき、Rayのバージョンが異なるクラスタを並行して立てることも可能です。
設計時に決めておくのは、ヘッドノードに計算タスクを載せるかどうかです。ヘッドはクラスタ全体のメタ情報を持つため、ここが落ちるとジョブごと失われます。ワーカー側にだけ計算を寄せる指定にしておくのが無難な出発点になります。
RayJobとRayServiceの選択基準|バッチか常駐かの分岐
RayJobは一度きりのジョブ向けで、クラスタの作成からジョブ投入、終了後の後片付けまでを1つのリソースで扱います。夜間の学習バッチのように、走り終えたらリソースを返したい処理はこちらです。
RayServiceは常駐するアプリケーション向けで、Ray Serveのデプロイメントを載せて長時間動かす用途に対応するリソースです。更新時に新しい構成へ切り替える運用を前提としているため、推論APIを止めずに入れ替えたい場合に選びます。加えて、周期実行を扱うリソースも用意されています。
導入時につまずく箇所|メモリ枯渇とシリアライズの実務的な回避策
Rayの障害は、分散処理そのものよりデータの受け渡しで起きることが多くなります。よく踏む3つを先に潰しておきます。
オブジェクトストアのメモリ枯渇とスピル発生時に見直す3つの設定
オブジェクトストアは共有メモリ上に置かれ、上限を超えた分はディスクへ退避されます。退避が始まると処理は止まらないものの、実行時間が桁で伸びる場合があります。見直す先は3つです。
- 1タスクが返すデータ量(返り値を小さくし、集計はワーカー側で済ませる)
- 同時に生存している
ObjectRefの本数(使い終えた参照を保持し続けない) - ノードあたりのストア割当量とディスクの空き容量
参照が残っている間、実体は解放されません。長いループで参照をリストへ貯め込む書き方は、そのままメモリ圧迫につながります。
シリアライズできないオブジェクトを渡して失敗する典型的なパターン
タスクの引数と戻り値はプロセス間を越えるため、シリアライズできる形である必要があります。データベース接続、ファイルハンドル、スレッドロックを引数で渡そうとすると、そこで失敗します。
回避の型は決まっています。接続のように持ち回りたい資源は、引数で渡さずアクターの内部で生成して保持してください。アクターなら状態がワーカー内に留まるため、シリアライズの対象になりません。
バージョン差異とPython環境の不一致で起きるクラスタ接続エラー
クライアント側とクラスタ側でRayのバージョン系列やPythonのマイナーバージョンがずれると、接続時点またはデシリアライズ時点でエラーになります。コンテナイメージを共通化し、ヘッド・ワーカー・投入元の3者で同じイメージを使う運用にしておくと、この種の障害はほぼ消えます。
依存ライブラリを実行時に足したい場合は、Rayのランタイム環境の指定でジョブごとに追加パッケージを宣言できます。ただしジョブ起動のたびにインストールが走るため、常用する依存はイメージ側へ焼き込んでおくほうが起動時間の面で有利です。
Rayを採用する条件と見送る場面|規模と運用体制からの判断基準
ここが本記事の結論部分です。機能の多さではなく、詰まっている箇所と運用体制の2軸で決めます。
Rayを採用してよい条件|単一ノードの処理上限に当たっている状態
採用してよいのは、次のどれかに実測で当たっている場合に限ります。単一マシンのメモリに学習データが載らない、GPU1枚では学習時間が許容範囲に収まらない、推論のスループットが1プロセスの上限で頭打ちになっている。いずれも「測ったうえで足りない」ことが条件です。
加えて、処理がPythonで書かれていることも実質的な前提になります。既存のPython資産をほぼそのまま分散へ持ち上げられる点がRayの利点であり、JVM側の資産が中心ならSparkのほうが接続コストは低くなります。推論だけが詰まっているケースでは、分散化の前にLLM推論とは?仕組みと高速化の手法・推論基盤の選び方で扱う単体での高速化の余地を先に確認してください。
見送りが妥当な場面|データ量が小さく専任の運用担当者がいない体制
データが数十GB規模に収まり、クラスタを継続的に見る担当を置けない組織では、Rayを導入しないほうがよい結果になります。理由は3つあります。クラウド側の大きいインスタンス1台へ寄せたほうが安く済むこと、分散化するとエラーの切り分け先がヘッド・ワーカー・オブジェクトストアへ分かれること、バージョン更新の追随コストが継続的にかかることです。
「将来スケールするかもしれないから先に入れておく」という理由での採用も見送りが妥当でしょう。分散前提のコードは単一ノード時よりデバッグが重くなるため、必要になった時点でCoreから段階導入するほうが総工数は小さく収まります。開発チームが2〜3名でMLOpsの運用設計をこれから作る段階なら、まずMLOpsとは?機械学習の運用を支える仕組みと導入判断で扱う運用の型を固めるほうが先です。
受託開発でRayを導入するときの体制づくりと外部委託の判断基準
社内にKubernetesの運用経験がある人がいれば、KubeRayまで自走できます。経験がない状態でクラスタ設計から始めると、Podのリソース割当とオートスケールの調整に時間を取られ、本来の機械学習側へ工数が回りません。
切り分けの目安を置くなら、クラスタ構築と運用設計を外部へ、モデルとデータの設計を社内へ、という分担が回りやすい形です。一創では機械学習基盤の構築を含む生成AI開発・AI受託開発を手がけており、既存のKubernetes環境へRayを載せる部分だけを切り出した相談にも対応しています。全面委託ではなく、詰まっている工程だけを外へ出す進め方が、内製の知見を残す観点でも扱いやすい選択です。
よくある質問
Rayの検討時に実際に挙がる疑問を5つまとめました。
RayとPythonのmultiprocessingは何が違いますか?
プロセスレベルで並列化する点は同じですが、multiprocessingは1台のマシン内で完結します。Rayは同じコードのまま複数ノードへ広げられ、オブジェクトストアによる参照渡しやアクターによる状態保持、障害時の再実行といった仕組みを備えます。1台で足りるうちはmultiprocessingで十分で、ノードをまたぐ必要が出た時点がRayの出番です。
Rayの学習コストはどのくらいですか?
Ray Coreに限れば、ray.init・@ray.remote・ray.getの3つを押さえれば動かせます。既存の関数へデコレータを付けるだけで並列化できるため、入門は半日程度です。負荷がかかるのはその先で、タスク粒度の調整、メモリ管理、クラスタ運用の3点に実務時間の大半が向かいます。
GPUがなくてもRayを使う意味はありますか?
あります。CPUバウンドな前処理やシミュレーションの並列化はGPUを必要としません。Ray Dataでの大量ファイルの変換や、RLlibでの環境シミュレーションはCPUコア数がそのまま効く処理です。GPUは分散学習と推論配信の局面で効いてくる要素という整理になります。
Ray Serveだけを推論基盤として使えますか?
使えます。Ray Serveは単体でHTTPの推論エンドポイントを提供でき、レプリカ数とリソース割当をデプロイメント単位で指定できます。学習側でRayを使っていなくても問題ありません。ただしモデルの重み管理やバージョニングは別途必要になるため、そこは既存のモデルレジストリと組み合わせてください。
Rayのバージョン更新はどの頻度で追うべきですか?
2.56系のように更新が細かく刻まれるため、毎回追う必要はありません。本番クラスタは四半期に一度程度、パッチ版まで含めた検証を挟んで上げる運用が扱いやすい水準です。クライアントとクラスタで系列がずれると接続時に失敗するので、上げるときは両方まとめて上げてください。
関連記事
- Kubeflowとは?Kubernetes上の機械学習基盤の全体像とPipelinesの使い方:パイプライン層との役割分担を確認する材料になります。
- Accelerator for Apache Sparkとは|RAPIDSでSpark処理をGPU高速化する仕組みと導入判断:Spark側を伸ばす選択肢との比較に使えます。
- vLLMとは?PagedAttentionの仕組み・使い方とOllama・TensorRT-LLMとの違いを実装者目線で解説:Ray Serveの内側に置く推論エンジンを扱っています。
- LLM推論とは?仕組みと高速化の手法・推論基盤の選び方を実装視点で解説【2026年】:分散化の前に確認する単体高速化の手順をまとめています。
- 強化学習とは?報酬から学ぶ仕組みとQ学習・方策勾配・企業導入の判断を実装目線で解説:RLlibを検討する前提知識を整理しています。