sharding策略?按文件vs按样本?训练数据的sharding策略?按文件vs按样本?
分布式训练时每个 rank 只应消费数据的一个子集,避免重复与遗漏;Sharding 即把数据集划分成多份,每 rank 一份(或按 rank 取子集)。划分策略影响负载均衡、IO 分布与可恢复性。
按文件 sharding:每个 rank 分配不同文件集合(如 rank 0 读 file_0, file_4, …,rank 1 读 file_1, file_5, …)。优点:实现简单、每个 rank 读不同文件、IO 易并行;缺点:若文件大小或样本数差异大,各 rank 负载不均,有的先跑完要等别的 rank。按样本 sharding:把全体样本视为序列,按 rank 数切分(rank i 取 sample_id % world_size == i)。优点:负载更均衡(每 rank 样本数相同);缺点:若数据按文件存储,可能多个 rank 读同一文件的不同偏移,需要支持按 offset 读或先做「按样本索引」的元数据(如样本→文件+offset),实现稍复杂。大模型训练常用按样本或「按文件但做大小感知的分配」以均衡;小文件多时也可按文件并做动态负载均衡。
PyTorch 的 DistributedSampler 默认按样本(每个 rank 取 dataset 的 1/N);若数据按大文件存,可建索引(样本→文件+offset)再按样本 shard。恢复训练时 sampler 的 epoch/seed 要与 checkpoint 一致,保证恢复后各 rank 读到的顺序与未中断时一致。
| 返回模块 | 返回总览 |