SuperAPI AI 工具集

ray-data

数据与分析

查看项目

更新于 10-15 10:54

技能介绍

用途

Ray Data 是一个面向 ML 与 AI 工作负载的分布式数据处理库,用于为机器学习训练和推理准备、转换和处理数据。根据资料,适用场景包括:为 ML 训练处理大型数据集(>100GB);需要在集群上做分布式数据预处理;构建批量推理流水线;加载图片、音频、视频等多模态数据;以及从单机扩展到集群的数据处理。

资料同时给出了替代选择:小于 1GB 的单机小数据可使用 Pandas;表格数据与类似 SQL 的操作可使用 Dask;企业级 ETL 与 SQL 查询可使用 Spark。

主要能力

  • 流式执行:可处理比内存更大的数据,通过 iter_batches 分批消费而非一次性加载。
  • GPU 支持:通过 num_gpus 参数在 map_batches 中请求 GPU 加速转换,例如图片预处理。
  • 多格式支持:资料中的表格列出 Parquet(读/写,推荐用于 ML)、CSV(读/写)、JSON(读/写)、图片(读,不支持写)、NumPy(读/写)、Pandas(读,不支持写)。
  • 数据类型来源:可从云存储(如 s3://、gs://)读取 Parquet、CSV、JSON、图片;也可从 Python 对象构造,包括 from_items 列表、range 合成数据、from_pandas。
  • 转换操作:map_batches(向量化批处理,较快)、map(逐行,较慢)、filter、groupby 及 count 聚合、map_groups 自定义聚合。
  • 框架集成:可与 Ray Train 配合,在训练函数中通过 ray.train.get_dataset_shard 获取数据分片;可转换为 PyTorch(to_torch)与 TensorFlow(to_tf)数据集。
  • 性能优化手段:repartition 控制并行度(如 100 个块对应 100 核集群)、调整 batch_size、流式执行。

使用方式

安装:

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()

写入数据:

# Write to Parquet
ds.write_parquet("s3://bucket/output/")

# Write to CSV
ds.write_csv("output/")

# Write to JSON
ds.write_json("output/")

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
)

适用场景与常见模式

资料列出两类常见模式:

  1. 批量推理:先用 BatchInference 类在 worker 内加载模型,再通过 ds.map_batches(BatchInference, batch_size=32, num_gpus=1) 做分布式推理,最后 write_parquet 输出。

  2. 数据预处理流水线:对读取的数据依次 map_batches 执行 clean_data、tokenize、augment,再写入输出路径。

资料提到的生产用例包括:Pinterest 用于模型训练的最后一步数据处理;ByteDance 用于扩展多模态大模型的离线推理;Spotify 用于批量推理的 ML 平台。

性能参考

资料给出的基准数据(处理 100GB 数据):单节点 16 核约 30 分钟;4 节点 64 核约 8 分钟;16 节点 256 核约 2 分钟。图片预处理:纯 CPU 约 1,000 张/秒;1 块 GPU 约 5,000 张/秒;4 块 GPU 约 18,000 张/秒。以上为资料中提供的参考数值。

限制与说明

  • 图片格式仅支持读取,不支持写入;Pandas 仅支持读取,不支持写入。
  • 转换采用惰性执行(lazy execution)。
  • map 为逐行处理,资料标注其比 map_batches 慢。
  • 使用时需注意按数据规模与任务类型选择工具,小数据、表格类与 SQL 类任务可使用资料建议的替代方案。
  • 版本信息:资料标注为 Ray 2.40.0+。

参考资源

Docs: https://docs.ray.io/en/latest/data/data.html GitHub: https://github.com/ray-project/ray Examples: https://docs.ray.io/en/latest/data/examples/overview.html