ShareGPT数据集在DeepSpeed分布式训练中的加载与处理方法
在大规模分布式训练场景中,使用ShareGPT这类对话数据集配合DeepSpeed进行多卡训练时,最常见的问题是数据分片未对齐——明明每个GPU都加载了数据,但执行后却出现样本重复、进程间数据错乱,甚至某些GPU直接闲置。究其根源,往往是数据集未能适配DistributedSampler的索引逻辑,或者未妥善处理变长文本带来的动态性。以下直接提供三种经过验证的封装方案,分别应对不同规模与数据组织形式。

首先给出一个判断依据:如果你的ShareGPT数据总规模仍在几十GB级别,且可以一次性加载到内存中,那么最稳妥的做法是采用HuggingFace Datasets的原生路径,配合PyTorch的DistributedSampler实现均匀切分。无需额外复杂操作。
一、使用HuggingFace Datasets + DistributedSampler封装
该方案的核心思路是将ShareGPT JSONL文件转换为Dataset对象,然后通过torch.utils.data.DistributedSampler实现跨进程的互斥切分,同时保留原始顺序语义。整体流程可概括为六个步骤:
1. 安装必要依赖:pip install datasets torch transformers,这步无需赘述。
2. 加载原始数据并构建Dataset对象:dataset = load_dataset("json", data_files={"train": "sharegpt_clean.jsonl"}, split="train")。注意data_files路径需指向你的实际文件。
3. 定义预处理函数,将对话结构统一为纯文本格式:def format_sharegpt(example): return {"text": "".join([f"### {msg['from']}: {msg['value']}" for msg in example["conversations"]])}。这里可根据业务需求调整分隔符,例如使用\n换行。
4. 应用映射并执行分词:tokenized_ds = dataset.map(format_sharegpt).map(lambda x: tokenizer(x["text"], truncation=True, max_length=2048), batched=True)。truncation参数和max_length需根据模型的上下文长度设定,切勿超过实际支持范围。
5. 初始化DistributedSampler:sampler = DistributedSampler(tokenized_ds, shuffle=True, drop_last=True)。shuffle是否开启取决于训练需求,但建议启用drop_last,以避免最后一个batch样本数不一致导致的梯度同步问题。
6. 构建DataLoader:dataloader = DataLoader(tokenized_ds, batch_size=4, sampler=sampler, num_workers=4)。num_workers可根据CPU核心数适当调大,但不宜超过16。
这套方案运行后,每个GPU获得的样本是确定互斥的,且顺序与原始数据保持一致,非常适合调试和复现性要求高的场景。
二、自定义IterableDataset配合DeepSpeed的data_parallel配置
当你手中的ShareGPT数据量巨大(例如几百GB甚至TB级别),且按日期或ID拆分为多个JSONL文件时,上述一次性加载全部数据到内存的方案并不现实。此时需要采用流式读取,结合rank感知的路径选择,实现无状态、可恢复的数据供给。
具体做法是继承torch.utils.data.IterableDataset,重写__iter__方法。关键步骤如下:
1. 定义类时传入rank和world_size,仅保留当前进程负责的文件:class ShareGPTIterableDataset(IterableDataset): def __init__(self, file_list, rank, world_size): self.file_list = [f for i, f in enumerate(file_list) if i % world_size == rank]。这里通过取模方式均分文件列表,确保每个进程只读取属于自己的那一份。
2. 在__iter__中按行解析JSONL并yield单条样本:for file_path in self.file_list: with open(file_path) as f: for line in f: yield json.loads(line)。注意此处应保持轻量,避免过多预处理。
3. 实例化数据集时传入当前进程的rank和world_size:ds = ShareGPTIterableDataset(glob.glob("sharegpt_*.jsonl"), dist.get_rank(), dist.get_world_size())。使用glob匹配所有分片文件。
4. 由于IterableDataset无法使用DistributedSampler,因此直接构建DataLoader并禁用自动采样:dataloader = DataLoader(ds, batch_size=2, num_workers=2)。注意num_worker不宜过大,以免引发文件句柄冲突。
5. 最后在DeepSpeed配置中显式关闭自动采样,否则DeepSpeed会尝试为DataLoader附加一个Sampler,与IterableDataset冲突:"data_efficiency": {"enabled": false}。该配置项位于ZeRO优化对应的json文件中。
此方案的优点是内存占用极低,且天然支持断点续训——只需在保存checkpoint时记录各个进程当前读取到的行号或文件偏移量即可。
三、基于DeepSpeed的DataLoader Hook注入分片逻辑
第三种方法更为底层,直接绕过PyTorch的原生采样器,在DeepSpeed初始化阶段注入rank专属的数据路径和偏移量。它适用于已经预分片完成、且需要严格管控每张卡token吞吐量的场景,例如配合梯度累积进行精细调参。
操作步骤如下:
1. 先手动或通过脚本将ShareGPT原始文件按world_size切分为独立文件:split -l 50000 sharegpt_full.jsonl sharegpt_part_。这里50000是每个分片包含的行数,可根据实际显存调整。
2. 在init_process_group完成后,根据当前rank找到对应的分片文件:part_file = f"sharegpt_part_{dist.get_rank():02d}"。注意补零以保证排序正确。
3. 使用HuggingFace的load_dataset加载单个分片:local_ds = load_dataset("json", data_files=part_file, split="train")。这样每个进程只会读取一个文件,彻底避免数据交叉。
4. 调用deepspeed.initialize时通过training_data参数传入这个本地数据集:model_engine, optimizer, _, _ = deepspeed.initialize(model=model, training_data=local_ds, ...)。注意DeepSpeed最新版本中该参数可能名为train_dataset,具体请查阅官方文档。
5. 最后确保DeepSpeed配置中不要启用会干扰数据流的选项,例如partition_activations和stage3_gather_16bit_weights_on_model_save。典型的安全配置是:{"zero_optimization": {"stage": 2}}。若要使用stage3,需格外注意数据分片与激活检查点的交互。
此方法虽然灵活,但需要手动管理分片文件,适合数据预处理已高度标准化的团队。如果你的数据源是动态生成的,每轮训练分片可能不同,那么采用前两种方案更为省心。
相关攻略
针对ShareGPT数据集在DeepSpeed分布式训练中的加载问题,提出三种封装方案:使用HuggingFaceDatasets与DistributedSampler均匀切分小规模数据;自定义IterableDataset配合rank感知流式读取处理大规模数据;通过DeepSpeedDataLoader注入分片逻辑,实现进程独占文件。三种方案分别适应不同数
使用LLaMA-Factory微调模型时,加载ShareGPT数据集常因数据结构或配置不当导致失败。需确保数据包含必需的`system`字段和`conversations`数组,并在`dataset_info json`中正确设置格式为`sharegpt`及字段映射。本地数据需配置准确路径。若数据将系统提示嵌套在对话中,需预处理将其提取为独立字段。此外,需注
想搞清楚大模型在真实对话和人工构造任务上的泛化能力到底有什么不同?一个很关键的切入点,就是对比它们背后训练数据的“基因”。这里,我们聚焦于两个极具代表性的数据集:ShareGPT和WizardLM。前者是真实用户与AI的多轮对话记录,后者则是通过算法“演化”出来的高复杂度单轮指令。它们代表了两种截然
ShareGPT平台用户自发分享的对话成为天然标注数据源,用户反馈转化为弱监督训练信号,跨平台引用触发加速处理,身份标签驱动领域自适应分发,多轮修正轨迹暴露模型缺陷,形成模型持续改进的正向数据飞轮。
ShareGPT与RedPajama是两类定位不同的开源数据集。ShareGPT源自真实人机对话,用于指令微调,能提升模型对话能力,但采用CCBY-NC协议禁止商用。RedPajama则严格遵循LLaMA预训练范式,基于网络文本构建,服务于模型预训练阶段,采用Apache2 0许可证允许商业应用。两者在数据来源、用途及许可上存在根本差异。
热门专题
热门推荐
史蒂文·斯皮尔伯格执导的科幻新片《揭秘日》定档6月12日。影片讲述气象主播玛格丽特获超能力后,与黑客丹尼尔联手揭露政府长期掩盖外星人存在的真相,随即遭到影子政府追杀。电影探讨人类是否为宇宙唯一文明,引发对“真相”的哲学拷问。
通过构建包含背景价值观、行为规范及偏好设置的万字提示词框架,使AI在私有代码库中实现理解架构哲学并主动协作,从被动执行转变为具备架构直觉的专业伙伴,恢复许愿式开发体验。
全链网报道,5月28日,美联芝加哥联储银&行行长古尔斯比抛出了一个值得深思的判断:如果市场对未来生产率大幅提升的预期过于乐观,进而带动投资和消费支出猛增,那反而可能推高通胀,最终倒逼美联储加息。这话是在东京出席日本央&行会议时说的,他准备了讲稿,逻辑相当清晰。 古尔斯比的原话是这么讲的——“预期收入
360漏洞挖掘智能体采用“智能体中心”路径,将专家经验与知识库转化为协同工作的垂直智能体,在OpenClaw生态中发现23个安全漏洞,覆盖远程控制、权限绕过等风险。其工程化、实战化的AI安全能力引发海外关注,为AIAgent时代安全建设提供了新思路。
生成特定城市曲风的Citypop音乐常因未将城市意象转化为声学参数而失败。通过MiniMaxM1Chat提取城市声景语义标签,在海螺AI中构建城市-节奏-音色三维绑定,启用Citypop专用微调权重,最后用剪映实现音画耦合,可精准还原城市霓虹质感。





