ray-data について
ray-dataは、機械学習向け分散データ処理ライブラリRay Dataの活用を支援するスキルです。ストリーミング実行やマルチモーダルデータ、MLフレームワーク連携を使った前処理とバッチ推論を扱います。
主な機能
- 01分散データ処理
- 02メモリを超えるデータのストリーミング処理
- 03GPUによる変換の高速化
- 04マルチモーダルデータの読み込み
- 05PyTorch、TensorFlow、HuggingFace連携
活用シーン
- 01大規模なML訓練データの前処理
- 02バッチ推論パイプラインの構築
- 03画像、音声、動画データの処理
インストール
コマンドをコピーしてターミナルで実行します。
$
npx skills add https:/ / github.com/ kalarislabs/ research-agent-skills --skill ray-dataインストール後、Claude Code で/ray-dataを入力して読み込まれたか確認します。
同梱ファイルreferences/integration.mdreferences/transformations.md
詳細
Ray Data - スケーラブルな ML データ処理
ML および AI ワークロード向けの分散データ処理ライブラリです。
Ray Data を使用する場面
Ray Data を使用する場合:
- ML のトレーニング用に大規模なデータセット(>100GB)を処理する
- クラスター全体で分散データ前処理を行う必要がある
- バッチ推論パイプラインを構築する
- マルチモーダルデータ(画像、音声、動画)を読み込む
- ノート PC からクラスターまでデータ処理をスケーリングする
主な機能:
- ストリーミング実行:メモリより大きなデータを処理
- GPU サポート:GPU で変換を高速化
- フレームワーク連携:PyTorch、TensorFlow、HuggingFace
- マルチモーダル:画像、Parquet、CSV、JSON、音声、動画
代わりに次のツールを使用する場合:
- Pandas:単一マシン上の小規模データ(<1GB)
- Dask:表形式データ、SQL に似た操作
- Spark:エンタープライズ ETL、SQL クエリ
クイックスタート
インストール
pip install -U 'ray[data]'
データの読み込みと変換
import ray
# Read Parquet files
ds = ray.data.read_parquet("s3://bucket/data/*.parquet")
# Transform data (lazy execution)
ds = ds.map_batches(lambda batch: {"processed": batch["text"].str.lower()})
# Consume data
for batch in ds.iter_batches(batch_size=100):
print(batch)
Ray Train との連携
import ray
from ray.train import ScalingConfig
from ray.train.torch import TorchTrainer
# Create dataset
train_ds = ray.data.read_parquet("s3://bucket/train/*.parquet")
def train_func(config):
# Access dataset in training
train_ds = ray.train.get_dataset_shard("train")
for epoch in range(10):
for batch in train_ds.iter_batches(batch_size=32):
# Train on batch
pass
# Train with Ray
trainer = TorchTrainer(
train_func,
datasets={"train": train_ds},
scaling_config=ScalingConfig(num_workers=4, use_gpu=True)
)
trainer.fit()
データの読み込み
クラウドストレージから
import ray
# Parquet (recommended for ML)
ds = ray.data.read_parquet("s3://bucket/data/*.parquet")
# CSV
ds = ray.data.read_csv("s3://bucket/data/*.csv")
# JSON
ds = ray.data.read_json("gs://bucket/data/*.json")
# Images
ds = ray.data.read_images("s3://bucket/images/")
Python オブジェクトから
# From list
ds = ray.data.from_items([{"id": i, "value": i * 2} for i in range(1000)])
# From range
ds = ray.data.range(1000000) # Synthetic data
# From pandas
import pandas as pd
df = pd.DataFrame({"col1": [1, 2, 3], "col2": [4, 5, 6]})
ds = ray.data.from_pandas(df)
変換
バッチのマッピング(ベクトル化)
# Batch transformation (fast)
def process_batch(batch):
batch["doubled"] = batch["value"] * 2
return batch
ds = ds.map_batches(process_batch, batch_size=1000)
行の変換
# Row-by-row (slower)
def process_row(row):
row["squared"] = row["value"] ** 2
return row
ds = ds.map(process_row)
フィルタリング
# Filter rows
ds = ds.filter(lambda row: row["value"] > 100)
グループ化と集計
# Group by column
ds = ds.groupby("category").count()
# Custom aggregation
ds = ds.groupby("category").map_groups(lambda group: {"sum": group["value"].sum()})
GPU による高速化された変換
# Use GPU for preprocessing
def preprocess_images_gpu(batch):
import torch
images = torch.tensor(batch["image"]).cuda()
# GPU preprocessing
processed = images * 255
return {"processed": processed.cpu().numpy()}
ds = ds.map_batches(
preprocess_images_gpu,
batch_size=64,
num_gpus=1 # Request GPU
)
データの書き込み
# Write to Parquet
ds.write_parquet("s3://bucket/output/")
# Write to CSV
ds.write_csv("output/")
# Write to JSON
ds.write_json("output/")
パフォーマンスの最適化
再パーティション化
# Control parallelism
ds = ds.repartition(100) # 100 blocks for 100-core cluster
バッチサイズの調整
# Larger batches = faster vectorized ops
ds.map_batches(process_fn, batch_size=10000) # vs batch_size=100
ストリーミング実行
# Process data larger than memory
ds = ray.data.read_parquet("s3://huge-dataset/")
for batch in ds.iter_batches(batch_size=1000):
process(batch) # Streamed, not loaded to memory
一般的なパターン
バッチ推論
import ray
# Load model
def load_model():
# Load once per worker
return MyModel()
# Inference function
class BatchInference:
def __init__(self):
self.model = load_model()
def __call__(self, batch):
predictions = self.model(batch["input"])
return {"prediction": predictions}
# Run distributed inference
ds = ray.data.read_parquet("s3://data/")
predictions = ds.map_batches(BatchInference, batch_size=32, num_gpus=1)
predictions.write_parquet("s3://output/")
データ前処理パイプライン
# Multi-step pipeline
ds = (
ray.data.read_parquet("s3://raw/")
.map_batches(clean_data)
.map_batches(tokenize)
.map_batches(augment)
.write_parquet("s3://processed/")
)
ML フレームワークとの連携
PyTorch
# Convert to PyTorch
torch_ds = ds.to_torch(label_column="label", batch_size=32)
for batch in torch_ds:
# batch is dict with tensors
inputs, labels = batch["features"], batch["label"]
TensorFlow
# Convert to TensorFlow
tf_ds = ds.to_tf(feature_columns=["image"], label_column="label", batch_size=32)
for features, labels in tf_ds:
# Train model
pass
サポートされているデータ形式
| 形式 | 読み込み | 書き込み | 用途 |
|---|---|---|---|
| Parquet | ✅ | ✅ | ML データ(推奨) |
| CSV | ✅ | ✅ | 表形式データ |
| JSON | ✅ | ✅ | 半構造化データ |
| 画像 | ✅ | ❌ | コンピュータービジョン |
| NumPy | ✅ | ✅ | 配列 |
| Pandas | ✅ | ❌ | DataFrame |
パフォーマンスベンチマーク
スケーリング(100GB のデータを処理):
- 1 ノード(16 コア):約 30 分
- 4 ノード(64 コア):約 8 分
- 16 ノード(256 コア):約 2 分
GPU による高速化(画像の前処理):
- CPU のみ:毎秒 1,000 枚
- GPU 1 基:毎秒 5,000 枚
- GPU 4 基:毎秒 18,000 枚
ユースケース
本番環境へのデプロイ:
- Pinterest:モデルのトレーニング向けラストマイルのデータ処理
- ByteDance:マルチモーダル LLM によるオフライン推論のスケーリング
- Spotify:バッチ推論向け ML プラットフォーム
参考資料
リソース
- ドキュメント: https://docs.ray.io/en/latest/data/data.html
- GitHub: https://github.com/ray-project/ray ⭐ 36,000+
- バージョン: Ray 2.40.0+
- 例: https://docs.ray.io/en/latest/data/examples/overview.html
エージェントの運用手順
- 環境を確認します。 GPU メモリ、モデルのチェックポイントとライセンス、フレームワークのバージョン、入力形式を確認します。
- 入力を明確にします。 データまたはユーザーから、形式、識別子、パラメーターを確認します。結果が変わる値は推測せず、質問してください。
- まず小規模に実行します。 最初に、低解像度または短い長さで単一サンプルの推論を実行します。
- 上記の手順と参考情報を使用して、タスク全体を実行します。
- 結果を検証します。 タスクの指標と定性的な観点から出力を確認し、生成コンテンツに関するライセンス上の制限も確認します。
- 報告します。 実行した内容(バージョン、コマンド、パラメーター)、確認した内容、まだ不確かな点を伝えます。
| このような場合 | 対応 |
|---|---|
| 大きな入力でメモリ不足が発生する | 解像度またはシーケンス長を下げる、半精度を使用する、または入力をタイルに分割します。 |
| この手順に記載された関数、フラグ、エンドポイントがインストール済みのバージョンにない | インストール済みバージョンのドキュメント(help()、--help、公式ドキュメント)を確認して対応し、ユーザーに伝えます。API を捏造してはいけません。 |
| 必須の入力、識別子、パラメーターが曖昧である | ユーザーに質問するか、実行前に前提を明示します。 |
インテグリティに関するルール
- 結果、パラメーター、識別子、引用、統計を決して捏造しないでください。実行または検証できない場合は、その旨を明確に伝えてください。
- 商用利用または公開利用の前に、モデルとデータセットのライセンスを確認してください。
- ここに記載されたバージョン固有の情報は古くなっている可能性があるため、インストール済みバージョンの公式ドキュメントで確認してください。
- 費用が発生する操作、共有 GPU やクラウドのクォータを消費する操作、個人データまたは患者データを扱う操作、取り消せない操作を行う前に、許可を求めてください。
関連スキル
ray-train:クラスター全体での分散トレーニングのオーケストレーション。polars:Python ETL、分析、pandas からの移行に対応する高性能な DataFrame ライブラリ。dask:メモリ容量を超える規模の pandas/NumPy ワークフロー向け分散コンピューティング。
コメント
Markdown 対応