【发布时间】:2021-08-30 09:35:08
【问题描述】:
什么是机器学习上下文中的分片(在 [这里][1] 提出了一个更通用的滑稽问题)以及它是如何在 Tensorflow 中实现的?
什么是分片,在谈到机器学习中的数据管道时,为什么我们完全需要分片?
【问题讨论】:
标签: python tensorflow machine-learning input sharding
什么是机器学习上下文中的分片(在 [这里][1] 提出了一个更通用的滑稽问题)以及它是如何在 Tensorflow 中实现的?
什么是分片,在谈到机器学习中的数据管道时,为什么我们完全需要分片?
【问题讨论】:
标签: python tensorflow machine-learning input sharding
在张量流中 -
在Dataset 中,函数shard() 创建了一个仅包含该数据集的1/num_shards 的数据集。分片是确定性的。 A.shard(n, i) 生成的 Dataset 将包含 A 中所有索引 mod n = i 的元素。
A = tf.data.Dataset.range(10)
B = A.shard(num_shards=3, index=0)
list(B.as_numpy_iterator())
[0,3,6,9]
C = A.shard(num_shards=3, index=1)
list(C.as_numpy_iterator())
[1,4,7]
D = A.shard(num_shards=3, index=2)
list(D.as_numpy_iterator())
[2,5,8]
重要提示:在使用任何随机化之前,请务必先进行分片 运算符(如随机播放)。
通常最好在数据集管道的早期使用分片运算符。例如,从一组 TFRecord 文件中读取时,在将数据集转换为输入样本之前进行分片。这避免了读取每个工作人员的每个文件。以下是完整管道中高效分片策略的示例:
在一组工作人员上自动分片数据集意味着为每个工作人员分配整个数据集的一个子集(如果设置了正确的 tf.data.experimental.AutoShardPolicy)。
这是为了确保在每个步骤中,每个工作人员都会处理非重叠数据集元素的全局批量大小。
设置自动分片选项,示例
dataset = tf.data.Dataset.from_tensors(([1.],[1.])).repeat(64).batch(16)
options = tf.data.Options()
options.experimental_distribute.auto_shard_policy = tf.data.experimental.AutoShardPolicy.DATA
dataset = dataset.with_options(options)
在使用 ParameterServerStrategy 的多工人训练中没有自动分片。
自动分片选项是
AUTO:这是默认选项,这意味着将尝试通过 FILE 进行分片。如果未检测到基于文件的数据集,则尝试通过 FILE 分片失败。
FILE:如果您想将输入文件分片到所有工作人员,则可以选择此选项。如果输入文件的数量远大于工作人员的数量并且文件中的数据分布均匀,则应使用此选项。例如,让我们将 2 个文件分发给 2 个工作人员,每个工作人员有 1 个副本。文件 1 包含 [0, 1, 2, 3, 4, 5],文件 2 包含 [6, 7, 8, 9, 10, 11]。让同步的副本总数为 2,全局批量大小为 4。
工人 0: 批次 1 = 副本 1:[0, 1] 批次 2 = 副本 1:[2, 3] 第 3 批 = 副本 1:[4] 第 4 批 = 副本 1:[5] 工人 1: 批次 1 = 副本 2:[6, 7] 批次 2 = 副本 2:[8, 9] 批次 3 = 副本 2:[10] 第 4 批 = 副本 2:[11]
DATA:这将在所有工作人员之间自动分片元素。每个工作人员将读取整个数据集并仅处理分配给它的分片。所有其他分片将被丢弃。如果输入文件的数量少于工作人员的数量,并且您希望在所有工作人员之间更好地分片数据,这通常使用。缺点是每个工作人员都会读取整个数据集。例如,让我们将 1 个文件分发给 2 个工作人员。文件 1 包含 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]。设同步的副本总数为 2。
工人 0: 批次 1 = 副本 1:[0, 1] 批次 2 = 副本 1:[4, 5] 批次 3 = 副本 1:[8, 9] 工人 1: 批次 1 = 副本 2:[2, 3] 批次 2 = 副本 2:[6, 7] 第 3 批 = 副本 2:[10, 11]
关闭:如果关闭自动分片,每个工作人员将处理所有数据。例如,让我们将 1 个文件分发给 2 个工作人员。文件 1 包含 [0, 1, 2, 3, 4, 5, 6, 7, 8, 9, 10, 11]。让同步的副本总数为 2。那么每个工作人员将看到以下分布:
工人 0: 批次 1 = 副本 1:[0, 1] 批次 2 = 副本 1:[2, 3] 批次 3 = 副本 1:[4, 5] 第 4 批 = 副本 1:[6, 7] 第 5 批 = 副本 1:[8, 9] 第 6 批 = 副本 1:[10, 11]
工人 1: 批次 1 = 副本 2:[0, 1] 批次 2 = 副本 2:[2, 3] 批次 3 = 副本 2:[4, 5] 第 4 批 = 副本 2:[6, 7] 第 5 批 = 副本 2:[8, 9] 第 6 批 = 副本 2:[10, 11]
【讨论】:
分片是一个非常重要的概念,它可以帮助系统根据分片过程将数据保存到不同的资源中。 考虑一个尚未完成分片的非常大的数据库。例如,让我们以一所大学的数据库为例,其中整个大学的所有学生记录(现在和过去)都保存在一个数据库中。因此,它将包含非常大量的数据,例如 100、000 条记录。 分片也可用于机器学习……将您的文件和模型保存在不同的位置,以便您可以随时使用它们。 在 tensorflow 中使用 Sharding 参考以下链接 https://www.tensorflow.org/jvm/api_docs/java/org/tensorflow/op/xla/Sharding
【讨论】: