ShareGPT数据集的分片和并行加载:处理超大数据集时的性能优化方法

陌强大大_9095

陌强大大_9095

2026-05-29

613人浏览

原创

针对sharegpt超大规模数据集,应采用分片与并行加载优化:一、jsonl按行切分+多进程读取;二、pytorch dataloader动态分片;三、mmap+换行符索引随机解析;四、hdfs/s3异步io流水线;五、arrow列式投影加速。

☞☞☞AI 智能聊天, 问答助手, AI 智能搜索, 多模态理解力帮你轻松跨越从0到1的创作门槛☜☜☜

sharegpt数据集的分片和并行加载:处理超大数据集时的性能优化方法

如果您需要处理ShareGPT数据集中的数百万条对话样本,但面临内存溢出、加载缓慢或单线程吞吐瓶颈,则可能是由于原始JSON/JSONL文件未被合理切分与并发读取。以下是针对超大规模ShareGPT数据集实施分片与并行加载的多种性能优化方法:

一、JSONL文件按行分片 + 多进程并行读取

JSONL格式天然适合分片——每行是一个独立JSON对象,可按字节偏移或行号切分为多个子文件,避免解析完整文件带来的内存压力,并利用CPU多核能力提升I/O吞吐。该方法适用于本地磁盘存储且无分布式环境的场景。

1、使用Python计算原始sharegpt.jsonl总行数:
运行命令:wc -l sharegpt.jsonl | awk '{print $1}',记录总行数N。

2、将文件按每50,000行切分为多个子文件:
执行命令:split -l 50000 --numeric-suffixes=1 sharegpt.jsonl sharegpt_part_

3、为每个子文件启动独立进程加载并预处理:
编写multiprocessing.Pool调用函数,对每个sharegpt_part_*文件执行:逐行json.loads()、过滤非法value字段、提取conversations长度≥2的样本。

4、各进程处理完毕后,将结果以pickle或arrow IPC格式暂存,主进程统一合并为Arrow Dataset以支持零拷贝迭代。

二、基于DataLoader的动态分片与分布式采样

当训练流程集成PyTorch时,可绕过静态文件切分,直接在DataLoader中实现逻辑分片与跨GPU节点负载均衡。该方式避免磁盘冗余存储,适配DDP(DistributedDataParallel)训练架构。

1、继承torch.utils.data.IterableDataset类,重写__iter__方法:
在__iter__中打开原始JSONL文件,根据torch.distributed.get_rank()与world_size计算当前进程应读取的起始行偏移与步长。

2、使用linecache.getline()跳转至指定行,避免全量加载:
确保每行JSON结构合法,对value字段含\u0000或嵌套过深的样本执行try-except跳过。

3、在__iter__内部构建生成器,每次yield一个标准化的ShareGPT样本字典:
包含id、conversations(已校验from/value键)、meta(若存在),并强制转换human/gpt角色为Unsloth兼容的user/assistant。

4、初始化DataLoader时设置num_workers=4、persistent_workers=True、prefetch_factor=2,使子进程预取缓冲区维持3–4个batch。

三、内存映射(mmap)+ 随机偏移解析

对于单机超大JSONL文件(如>100GB),传统readline()会因频繁系统调用引发I/O抖动。采用内存映射技术可将文件虚拟地址空间直接映射至用户态,配合预计算的换行符位置索引,实现毫秒级随机行定位。

1、首次扫描原始文件,记录所有换行符\n的字节偏移位置,保存为offsets.bin二进制索引文件:
使用mmap.ACCESS_READ打开文件,遍历字节流查找0x0A,写入64位整型数组。

宝塔Linux面板11.3.0
宝塔Linux面板11.3.0

宝塔面板11.3.0是一款针对Linux服务器设计的可视化管理工具,通过重构核心模块实现资源占用显著降低,尤其适合低配置服务器环境。它将复杂的命令行操作转化为直观的图形界面,帮助开发者快速完成网站部署、环境配置及日常运维工作,无需专业技术背景即可高效管理服务器。

下载

2、加载offsets.bin后,通过numpy.random.choice随机选取偏移,再用mmap[偏移:下一个偏移]截取单行字符串:
该操作不触发物理内存分配,仅建立页表映射。

3、对截取行调用json.loads(),捕获JSONDecodeError并丢弃该行;对conversations字段缺失或长度为0的样本执行continue跳过。

4、将解析后的样本送入torch.tensor缓存池,复用固定大小tensor buffer减少内存碎片,buffer容量设为batch_size × max_seq_len × sizeof(int64)。

四、分布式文件系统分片(HDFS/S3)+ 异步IO流水线

当ShareGPT数据集部署于HDFS或S3等对象存储时,需规避单点NameNode瓶颈与HTTP延迟。通过将数据集预划分为固定前缀的分片路径(如s3://bucket/sharegpt/shard_00001.jsonl),结合异步IO与重叠调度,可实现近线性吞吐扩展。

1、使用fsspec.open_files()批量获取shard_*路径列表,传入aiobotocore或hdfs3异步客户端:
设置max_concurrency=32以控制并发连接数,防止S3限流。

2、为每个shard启动asyncio.create_task(),任务内使用aiofiles.open()以非阻塞模式读取内容:
读取后立即提交至asyncio.Queue,由独立消费者协程执行json.loads()与字段校验。

3、消费者协程将合格样本序列化为msgpack二进制,推入Redis Stream作为中间缓冲区:
设置XADD maxlen=1000000确保内存可控,下游训练进程通过XREADGROUP消费。

4、训练进程启用torch.cuda.Stream()绑定专用CUDA流,对从Redis解包的msgpack数据直接调用torch.frombuffer()转为GPU张量,消除主机内存拷贝。

五、Arrow Dataset分片 + 列式投影加速

将ShareGPT JSONL一次性转换为Apache Arrow IPC格式后,可利用其列式存储与零拷贝特性,在不反序列化整个JSON的前提下,仅投影所需字段(如conversations、id),大幅降低CPU与内存开销。

1、使用pyarrow.json.read_json()加载原始JSONL,自动推断schema:
指定use_threads=True、block_size=64*1024*1024以启用多块并行解析。

2、调用dataset.filter()剔除conversations为空或长度使用pyarrow.compute.list_length(ds.column('conversations')) > 1作为表达式,全程在C++层执行无需Python循环。

3、执行dataset.to_parquet()导出为分片Parquet文件,设置row_group_size=100000、compression='zstd':
zstd压缩比优于snappy且解压速度接近,适合SSD随机读取。

4、加载时使用pyarrow.dataset.dataset(),通过fragments筛选特定row group:
例如只读取conversations字段的第3–5个row group,调用ds.scanner(columns=['conversations'], use_threads=True)。

相关专题

更多
大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

5356

5

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

2025.12.08

1249

12

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

243

5

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

486

22

大数据分析工具有哪四个
大数据分析工具有哪四个

大数据分析的四个工具分别是rapidminer、Hpcc、Hadoop和Pentaho bi。大数据分析用于从各种来源生成的原始数据中提取有价值的数据。这些数据帮助我们获得有意义的见解、隐藏的模式、未知的相关性、市场趋势等等,具体取决于行业。大数据分析的主要动机是提供有价值的见解,以便为未来做出更好的决策。php中文网为大家带来了大数据分析的相关教程、以及相关文章等内容,供大家免费下载使用。

2023.06.21

5356

5

Java 大数据处理基础(Hadoop 方向)
Java 大数据处理基础(Hadoop 方向)

本专题聚焦 Java 在大数据离线处理场景中的核心应用,系统讲解 Hadoop 生态的基本原理、HDFS 文件系统操作、MapReduce 编程模型、作业优化策略以及常见数据处理流程。通过实际示例(如日志分析、批处理任务),帮助学习者掌握使用 Java 构建高效大数据处理程序的完整方法。

2025.12.08

1249

12

大数据专业学习教程
大数据专业学习教程

本专题整合了大数据专业学习相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

243

5

python处理大数据合集
python处理大数据合集

本专题整合了python处理大数据相关教程,阅读专题下面的文章了解更多详细内容。

2026.01.05

486

22

热门下载

更多
网站特效
/
网站源码
/
网站素材
/
前端模板

精品课程

更多
相关推荐
/
热门推荐
/
最新课程
Gradle 构建性能优化指南
Gradle 构建性能优化指南

共0课时 | 0人学习

Gradle 官方用户手册
Gradle 官方用户手册

共0课时 | 0人学习

Pandas 官方文档与用户指南
Pandas 官方文档与用户指南

共0课时 | 0人学习