分片#
分片允许 DALI 将数据集划分为不重叠的部分,每个 DALI 管道实例可以在这些部分上工作。此功能解决了拥有全局和共享状态的问题,该状态允许在 ranks 之间分配训练样本。默认情况下,在每个 epoch 之后,DALI 管道会前进到下一个分片,以增加此管道所看到数据的熵。您可以通过设置 stick_to_shard
reader 参数来更改此行为。
然而,当数据集大小不可被使用的管道数量整除,或者当分片大小不可被批次大小整除时,此操作模式会导致问题。为了解决此问题并调整行为,您可以使用 pad_last_batch
reader 参数。
此参数要求 reader 复制分片最后一个批次的最后一个样本,这可以防止 DALI 在批次大小无法整除分片大小时从下一个分片读取数据。当一个批次大小可以整除批次大小,但其他批次大小大一个样本时,此参数还可以确保所有管道返回相同数量的批次。此过程将每个分片填充到相同的大小,该大小是批次大小的倍数。
框架迭代器配置#
DALI 在深度学习框架中通过专用迭代器使用,这些迭代器需要了解此填充和其他 reader 属性。
以下是迭代器选项
reader_name
- 允许您提供驱动迭代器的 reader 名称,并提供必要的参数。注意
我们建议您使用此选项,以便接下来的两个选项(
size
和last_batch_padded
)可以从管道配置中自动获取。如果使用此选项,则不应将size
和last_batch_padded
显式提供给迭代器。此选项更灵活、更准确,并考虑到当分片轮换时,管道的分片大小在 epochs 之间可能有所不同。size
:为迭代器提供分片的大小,或者,如果存在多个分片,则为所有包装管道的所有分片大小的总和。last_batch_padded
:确定数据尾部是由来自下一个分片的数据 (False
) 组成,还是由重复的虚拟数据 (True
) 组成。当分片大小不是批次大小的倍数时,它适用,last_batch_policy
- 当分片大小不可被批次大小整除时,确定最后一个批次的处理方式。它仅影响部分填充数据的批次。有关可能的值,请参阅LastBatchPolicy()
枚举。fill_last_batch
– (已弃用,推荐使用last_batch_policy
)确定最后一个批次是否应为完整批次,无论分片大小是否可被批次大小整除。
枚举#
分片计算#
这是计算分片 ID 的分片大小的公式
floor((id + 1) * dataset_size / num_shards) -
floor(id * dataset_size / num_shards)
当管道在 epochs 中前进并且 reader 移动到下一个分片时,需要扩展公式以反映此更改
floor(((id + epoch_num) % num_shards + 1) * dataset_size / num_shards) -
floor(((id + epoch_num) % num_shards) * dataset_size / num_shards)
当使用第二个公式时,仅当启用 stick_to_shard
reader 选项并阻止 DALI 轮换分片时,在训练开始时提供一次 size 值才有效。发生这种情况时,请使用第一个公式。
为了应对这些挑战,请使用 reader_name
参数,并允许迭代器自动处理配置。