Rayサンドボックスで分散RayクラスタにgVisorの隔離環境を導入
公開:
Googleは、Anyscaleとのパートナーシップにより、Rayの試験運用版ライブラリを導入しました。Rayサンドボックスは、分散Rayクラスタへサンドボックス環境を直接提供し、gVisorがノード上の隔離を担います。日本語版は米国時間2026年8月26日の投稿の抄訳です。[1]
モデルが生成したコードを、GKEのRayクラスタ上で隔離して実行したい場合に関係する発表です。各ハイレベルサンドボックスはRayアクターとして表現され、Ray 2.58以降は使い慣れたRay APIで管理でき、GKEで試すためのユーザーガイドも用意されています。[1]
Rayサンドボックス(試験運用版)の発表の要点
Rayサンドボックスは、Anyscaleとのパートナーシップによる試験運用版ライブラリとして導入されました。隔離された実行のための新たな抽象化を導入せず、既存のRayプログラミングモデルに自然に馴染ませることを重要な設計目標としています。主な点は次のとおりです。[1]
- Google Cloudの顧客はマルチモーダルデータパイプラインから最先端のRLまでRayを活用
- トレーニング後のワークロードをオーケストレートするための標準的なランタイムとしてRayが定着(Google Cloud)
- Google Cloudは安全で分離されたサンドボックスの大規模なオーケストレーションを課題と指摘
- 試験運用版ライブラリはネイティブで高性能なサンドボックス環境を分散Rayクラスタに直接提供(Google Cloud)
- 試験運用版ライブラリはGoogleで開発中のエージェント型AIテクノロジーを活用
- 各ハイレベルサンドボックスをRayアクターとして表現
- 配置、リソースの割り当て、作成と破棄、障害からの復旧は他のRayリソースと同様の管理が必要
- 周囲のワークロードに応じたスケーリングも他のRayリソースと同様の管理が必要
- Rayスケジューラが実行ノードを決めCPUとメモリを予約
- サンドボックスアクターが自身のライフサイクルを管理
- 初期サンドボックスランタイムはgVisor
- Ray 2.58以降はフレームワークの作成者と研究者がサンドボックス環境を管理できる
- その際は他のワークロードで使い慣れたRay APIやパターンをそのまま使える
- Ray 2.58以降はローカルのgVisorサンドボックスをSandboxRuntimeでより詳細に制御できる[1]
Google Cloudによると、強化学習のエコシステムでは、複雑なトレーニング後のワークフローを支える統合コンピューティングランタイムとしてRayの採用が急速に進んでいます。発表の基本情報を次の表にまとめます。[1]
| 項目 | 内容 |
|---|---|
| 記事末尾の記名(Google) | Googleのスタッフ ソフトウェア エンジニア、Andrew Sy Kim |
| 記事末尾の記名(Anyscale) | Anyscaleの最高技術責任者、Philipp Moritz氏 |
| 日本語版の扱い | 米国時間2026年8月26日にGoogle Cloud blogへ投稿された記事の抄訳 |
| 対象と対象版 | 分散Rayクラスタ上のサンドボックス環境(Ray 2.58以降) |
| 提供状態 | Anyscaleとのパートナーシップによる試験運用版ライブラリ |
| 課題が浮上した経緯(Google Cloudの見解) | エージェントモデルと推論モデルの進化につれて浮き彫りに |
| 背景(Google Cloudの見解) | 動的なロールアウト、コード生成、マルチターンのツール操作を安全に実行するための課題 |
| Rayをすでに使うフレームワーク例 | veRL、NeMo-RL、SLIME、MILES、SkyRLが分散トレーナー、推論エンジン、ロールアウトワーカーを調整[1] |
意見や要望は、GitHubのissueでのディスカッションで伝えられます。GoogleとAnyscaleは、強化学習におけるRayの未来を一緒に考えていこうと呼びかけています。[1]
Rayサンドボックスの採用検討で着目する観点
今回の発表の論点のうち、この記事ではコードの書き方と隔離の仕組み、試し方と版の条件を詳しく扱います。採用を検討しやすいと考えて、この4点を選びました。
難易度と緊急度は編集部が定めた非公式の目安です。難易度は、基礎がこの記事の説明だけで理解できる、中級がRayの基本的な使い方の知識が要る、上級がクラスタ運用や隔離技術の知識が要る水準です。緊急度は、高が試す前、中が導入の検討時、低が必要になったときに確認する目安です。
| 見出し | こんな人におすすめ | 難易度 | 緊急度 |
|---|---|---|---|
| Rayサンドボックスを試す前の注意点 | 試験運用版を試す前に版や前提条件を確認したい人 | 基礎 | 高 |
| Ray 2.58以降の試験運用版Rayサンドボックスの使い方 | Rayのアクターの基本を知っていてサンドボックスを作りたい人 | 中級 | 高 |
| Ray 2.58以降の試験運用版Rayサンドボックスの制御 | 詳細な制御が必要な人 | 中級 | 低 |
| RayサンドボックスがgVisorを選ぶ理由 | 採用を検討する段階で隔離の仕組みを理解したい人 | 基礎 | 中 |
| RayサンドボックスをGKEで試す手順 | GKEクラスタとKubeRayを操作できる人 | 上級 | 中 |
Rayサンドボックスを試す前の注意点
試す前に、版と提供状態、ノードの前提、ネットワークの既定値を確認します。
発表時点の提供状態と対象版は次のとおりです。[1]
| 項目 | 内容 | 根拠資料・時点 |
|---|---|---|
| 提供状態 | Rayの試験運用版ライブラリ | 発表時点 |
| 対象版 | Ray 2.58以降 | 発表時点 |
| 今回の発表に含まれない点 | 安定版への移行時期と、他ランタイムに対応するRayの版 | 発表時点 |
Ray開発版ドキュメント(2026-09-22確認)が示すAPIの提供状態、ノードとネットワークの前提は次のとおりです。[2][3]
| 項目 | 内容 | 根拠資料・時点 |
|---|---|---|
| アルファ版ライブラリ | ray.experimental.sandboxはアルファ版で、安定版の前にAPIが変更・削除される可能性 | Ray開発版のSandboxes資料(2026-09-22確認) |
| ノードのOS | サンドボックスを動かす各RayノードにLinux(x86_64かarm64) | Ray開発版のSandboxes資料(2026-09-22確認) |
| runsc | サンドボックスを動かす各Rayノードで$PATHから到達できること | Ray開発版のSandboxes資料(2026-09-22確認) |
| network既定値 | network="none"が既定で、信頼できないコードは外向き接続とKubernetesクラスタサービスの探索が不可 | Ray開発版のKubeRayガイド(2026-09-22確認) |
| network="public" | ノードが到達できる他のPodや内部クラスタサービスに到達可能 | Ray開発版のKubeRayガイド(2026-09-22確認)[2][3] |
Rayの今後のバージョンでは、Agent SubstrateやKata Containersといった他のサンドボックスランタイムにもサポートを拡大する予定です。[1]
Ray 2.58以降の試験運用版Rayサンドボックスの使い方
Ray 2.58以降では、sandbox.createでサンドボックスを作成し、返されたアクターのハンドルからexecを呼び出します。[1]
作成と実行のコード例
import ray
from ray.experimental import sandbox
ray.init()
# Create a gVisor sandbox environment and return an actor handle for a proxy actor
sb = sandbox.create(
cpu=1.0,
memory="512Mi",
image="python:3.12-slim"
)
# Execute code inside the sandbox
result = ray.get(sb.exec.remote("python -c 'import sys; print(sys.version)'"))
print(result.stdout)公式資料からの抜粋:分散 Ray クラスタに gVisor サンドボックスを導入(Ray プリミティブとしてのサンドボックス)。対象版・範囲:Ray 2.58以降。[1]
Ray 2.58以降の試験運用版ライブラリでの指定は次のとおりです。サンドボックスを動かすノードの前提は、試す前の注意点で確認してください。[1]
| 項目 | 指定例 | 意味 |
|---|---|---|
| sandbox.create | image="python:3.12-slim" | OCI互換イメージからgVisorサンドボックスを作成 |
| sandbox.create | cpu=1.0、memory="512Mi" | コード例で指定するCPUとメモリの値 |
| 戻り値sb | Rayアクターのハンドル | 操作をgVisorへ転送するプロキシのアクター |
| sb.exec.remote | "python -c 'import sys; print(sys.version)'" | 通常のアクター呼び出しとしてサンドボックス内で実行 |
| 配置 | execは通常のアクター呼び出し | サンドボックスはクラスタ内のどこにでも配置可能 |
| result.stdout | print(result.stdout) | コード例で表示する実行結果の出力 |
ライフサイクル管理の範囲
サンドボックスAPIは、エージェント型ワークロードに必要な次のライフサイクル管理に対応しています。[1]
- OCIコンテナイメージからの環境作成
- CPUとメモリの上限設定
- 環境変数、作業ディレクトリ、ネットワーキングの構成
- コマンドの実行
- ファイルの読み取り、書き込み、アップロード、ダウンロード
- サンドボックスの状態の検査
- 環境の終了または削除[1]
開発版ドキュメントの書き込み保護の確認例
書き込み保護は、Ray開発版ドキュメント(2026-09-22確認)の例です。編集部は、sandbox.createで作成した稼働中のサンドボックスを用意して試すことを勧めます。既定のreadonly=Trueでは/etcへの書き込みが失敗し、Read-only file systemが出ます。[3]
# Assuming an active sandbox `sb = sandbox.create(...)`
# Attempting to modify /etc or rootfs will fail
res = ray.get(sb.exec.remote("touch /etc/hacked.txt"))
print(res.exit_code) # Non-zero exit code
print(res.stderr) # "Read-only file system"
公式資料からの抜粋:Deploy Ray sandboxes with KubeRay #(Deploy Ray sandboxes with KubeRay # / (Optional) Step 4: Verify isolation and security guarantees # / Filesystem write protection #)。対象版・範囲:Ray開発版ドキュメント(docs.ray.io/en/master、確認日2026-09-22時点)。[3]
開発版ドキュメントのネットワーク既定値の例
ネットワークの既定値の例も、Ray開発版ドキュメント(2026-09-22確認)にあります。編集部は、モデルが生成したコードを実行する場合、外向き接続が要らないなら既定のnetwork="none"のまま使うことを勧めます。既定のnetwork="none"では外向き接続を確立できず、公式の確認例では終了コードが0以外になります。[3]
# Attempting network egress will immediately fail
res = ray.get(sb.exec.remote("python3 -c 'import urllib.request; urllib.request.urlopen(\"http://google.com\", timeout=2)'"))
print(res.exit_code) # Non-zero exit code
公式資料からの抜粋:Deploy Ray sandboxes with KubeRay #(Deploy Ray sandboxes with KubeRay # / (Optional) Step 4: Verify isolation and security guarantees # / Network isolation #)。対象版・範囲:Ray開発版ドキュメント(docs.ray.io/en/master、確認日2026-09-22時点)。[3]
Ray 2.58以降の試験運用版Rayサンドボックスの制御
Ray 2.58以降では、SandboxRuntimeを使うと、ローカルのgVisorサンドボックスを直接操作し、gVisorへ渡す前のOCI仕様を編集できます。次のコードは、アクター内にローカルサンドボックスのプールを作る例です。[1]
import ray
from ray.experimental.sandbox.runtime import SandboxRuntime
@ray.remote
class SandboxPool:
def __init__(self, size: int = 3, image: str = "python:3.10-slim"):
self.runtime = SandboxRuntime()
self.sandboxes = [
self.runtime.create(image=image, memory="512Mi")
for _ in range(size)
]
def run_command(self, index: int, command: str):
return self.runtime.exec(self.sandboxes[index], command)
def close(self):
for sb_id in self.sandboxes:
self.runtime.delete(sb_id)
# Deploy an actor managing a pool of local sandboxes
pool = SandboxPool.remote(size=3)
result = ray.get(pool.run_command.remote(0, "python3 -c 'print(\"Hello from pool!\")'"))
print(result.stdout)
ray.get(pool.close.remote())公式資料からの抜粋:分散 Ray クラスタに gVisor サンドボックスを導入(Ray プリミティブとしてのサンドボックス)。対象版・範囲:Ray 2.58以降。[1]
| 項目 | 指定例 | 意味 |
|---|---|---|
| SandboxRuntime() | self.runtime = SandboxRuntime() | ローカルのgVisorサンドボックスを直接操作する入口 |
| self.runtime.create | image=image, memory="512Mi" | range(size)の数だけサンドボックスを作成 |
| self.runtime.exec | self.sandboxes[index], command | 指定した番号のサンドボックスでコマンドを実行 |
| self.runtime.delete | sb_id | closeメソッドで各IDに対して呼び出す |
| SandboxPool.remote | size=3 | プールを管理するアクターをデプロイ[1] |
RayサンドボックスがgVisorを選ぶ理由
Rayサンドボックスは、GoogleのオープンソースのアプリケーションカーネルであるgVisorを、初期サンドボックスランタイムとして使います。その前提にある考え方は、次の引用のとおりです。[1]
モデルが生成したコードを実行する際は、その環境内のコードを「信頼できないもの」として扱う必要があります。
出典:Google Cloud「分散 Ray クラスタに gVisor サンドボックスを導入」[1]
gVisorの特徴と、GoogleとAnyscaleによる評価を観点別に整理します。[1]
| 観点 | 内容 | 区分 |
|---|---|---|
| 隔離の仕組み | Linuxシステムコールインターフェースの大部分をユーザー空間に実装 | gVisorの特徴 |
| 分離境界 | ワークロードとホストカーネルの間に分離境界を追加 | gVisorの特徴 |
| イメージ | OCI互換で標準のコンテナイメージをそのまま利用 | gVisorの特徴 |
| Docker | DockerデーモンやホストDockerソケットをサンドボックスに公開する必要がない | gVisorの特徴 |
| 起動と資源 | 1秒未満の高速起動と低メモリオーバーヘッドを両立 | GoogleとAnyscaleの評価 |
| 活用形態 | サンドボックスを粒度の細かい分散リソースとして柔軟に活用 | GoogleとAnyscaleの評価 |
| 隔離の強さ | 生成されたコードを通常のコンテナで直接実行するより強力な隔離環境 | GoogleとAnyscaleの評価 |
| 適性 | 環境を動的に作成できるほど軽量で、エージェント型ワークロードに非常に適する | GoogleとAnyscaleの評価[1] |
RayサンドボックスをGKEで試す手順
Rayサンドボックスの詳細はRayのドキュメントに、GKEで試す手順はユーザーガイドにあります。掲載するStep 1〜3と確認、任意のStep 5の手順と出力例は、Ray開発版ドキュメント(2026-09-22確認)の内容です。任意のStep 4にあたる書き込み保護とネットワークの例は、使い方の節で扱います。[1][3]
| 手順 | 実施内容 | 補足 |
|---|---|---|
| 準備(ツール) | 設定済みkubectlと認証済みgcloud CLI、Helm v3 | 開発版 |
| 準備(Ray) | ray.experimental.sandboxを含むRay 2.58.0以降 | 開発版 |
| Step 1 | 標準のLinuxワーカーノードでGKEクラスタを作成 | containerdの標準GKEノードプールを使用可能 |
| Step 2 | Helmリポジトリから最新の安定版KubeRay operatorを導入 | KubeRay operatorのインストール手順に従う |
| Step 3 | サンプルのRayJobをkubectl applyで作成 | 起動時にrunscを導入するRayClusterを作成 |
| Step 3のジョブ | サンドボックスを作りPythonコードを実行 | ジョブ完了後にサンドボックスを終了する構成 |
| 確認 | kubectl getとkubectl logsでPodとログを確認 | Rayクラスタの準備完了を待つ |
| Step 5(任意) | runscを事前導入した独自のRayイメージを作成 | 本番ではイメージへの事前導入が勧められている[3] |
実行と確認のコマンド
Ray開発版ドキュメント(2026-09-22確認)の例です。以下はGKEクラスタの作成、RayJobの適用、PodとログのコマンドでStep 2のKubeRay operatorはインストール手順に従って導入します。[3]
gcloud container clusters create ray-sandbox-cluster \
--region=us-central1 \
--machine-type=e2-standard-16 \
--num-nodes=3
公式資料からの抜粋:Deploy Ray sandboxes with KubeRay #(Deploy Ray sandboxes with KubeRay # / Step 1: Create a GKE cluster #)。対象版・範囲:Ray開発版ドキュメント(docs.ray.io/en/master、確認日2026-09-22時点)。[3]
kubectl apply -f https://raw.githubusercontent.com/ray-project/kuberay/master/ray-operator/config/samples/ray-job.sandbox.yaml
公式資料からの抜粋:Deploy Ray sandboxes with KubeRay #(Deploy Ray sandboxes with KubeRay # / Step 3: Run sandboxes with a RayJob #)。対象版・範囲:Ray開発版ドキュメント(docs.ray.io/en/master、確認日2026-09-22時点)。[3]
# List running job pods (wait for Ray cluster to be in ready state)
kubectl get pods -l job-name=rayjob-sandbox
# Stream the demo logs
kubectl logs -f -l job-name=rayjob-sandbox
公式資料からの抜粋:Deploy Ray sandboxes with KubeRay #(Deploy Ray sandboxes with KubeRay # / Step 3: Run sandboxes with a RayJob #)。対象版・範囲:Ray開発版ドキュメント(docs.ray.io/en/master、確認日2026-09-22時点)。[3]
Ray開発版ドキュメントの手順で試す場合、編集部は次の表の2か所を出力例と照合することを勧めます。出力は例と似た形になるとされ、完全一致は前提にしません。[3]
Ray開発版ドキュメント(2026-09-22確認)の出力例との照合先です。[3]
| 確認対象 | 照合の条件 | 確認できること |
|---|---|---|
| kubectl logsのPlatformの行 | Platformの行にgvisorが含まれる | 公式出力例と同様にgvisorを含むこと |
| kubectl logsのJobの行 | Jobの行が succeeded で終わる | ジョブが成功したこと |
Sandbox output:
=== Hello from inside Ray Sandbox! ===
Python Version : 3.12.14 (main, Aug 13 2026, 19:41:13) [GCC 14.2.0]
Platform : Linux-4.19.0-gvisor-x86_64-with-glibc2.41
RayJob completed successfully!
2026-08-15 17:38:41,535 INFO sdk.py:520 -- WebSocket closed for job rayjob-sandbox-gz8j6 with close code 1000
2026-08-15 17:38:41,546 SUCC cli.py:66 -- ------------------------------------
2026-08-15 17:38:41,546 SUCC cli.py:67 -- Job 'rayjob-sandbox-gz8j6' succeeded
2026-08-15 17:38:41,546 SUCC cli.py:68 -- ------------------------------------
公式資料からの抜粋:Deploy Ray sandboxes with KubeRay #(Deploy Ray sandboxes with KubeRay # / Step 3: Run sandboxes with a RayJob #)。対象版・範囲:Ray開発版ドキュメント(docs.ray.io/en/master、確認日2026-09-22時点)。[3]
出典
- ^ Google Cloud. 「分散 Ray クラスタに gVisor サンドボックスを導入」. https://cloud.google.com/blog/ja/products/containers-kubernetes/gvisor-sandboxes-for-ray-clusters-on-gke, (参照 26-09-08).
- ^ Ray. 「Ray Sandboxes #」. https://docs.ray.io/en/master/ray-core/sandboxes.html, (参照 26-09-22).
- ^ Ray. 「Deploy Ray sandboxes with KubeRay #」. https://docs.ray.io/en/master/cluster/kubernetes/examples/ray-sandboxing.html, (参照 26-09-22).







