对数据集进行分片是不是有任何指导方针?

Posted

技术标签:

【中文标题】对数据集进行分片是不是有任何指导方针?【英文标题】:Are there any guidelines on sharding a data set?对数据集进行分片是否有任何指导方针? 【发布时间】:2017-05-05 22:39:10 【问题描述】:

对于选择数据集的分片文件数量或每个分片中的记录数是否有任何指导?

在使用tensorflow.contrib.slim的例子中,

ImageNet 数据集的每个分片中大约有 1024 记录。(tensorflow/models/inception)

flowers 数据集的每个分片中大约有 600 条记录。 (tensorflow/models/slim)

分片文件的数量和每个分片中的记录数对训练和训练模型的性能有影响吗?

据我所知,如果我们不将数据集拆分为多个分片,则混洗数据不会很随机,因为RandomShuffleQueuecapacity 可能小于数据集的大小。

使用多个分片还有其他好处吗?


更新

The documentation 说

如果您的读取线程多于输入文件,为了避免两个线程从彼此靠近的同一个文件中读取同一个示例的风险。

为什么我们不能使用 50 个线程来读取 5 个文件?

【问题讨论】:

对于大型数据集,每个文件 100MB 是一个不错的数字。小到可以复制到本地机器来检查它,但又不会小到压倒文件描述符表。文档中的评论谈到 N 读取操作/N 线程与 1 读取操作/N 线程。在后一种情况下,由于读取操作是有状态的,N 个线程将导致顺序文件读取,这有利于缓冲。使用 N 次读取操作可以触发 N 次磁盘查找以进行 N 次读取 谢谢@YaroslavBulatov。 “压倒文件描述符表”是什么意思?据我所知,当一个进程使用 10 个线程打开 10 个文件时,操作系统将为表创建 10 个描述符。表中文件描述符条目的数量是否与分片文件的数量有关?我不知道“风险”(在文档中>...,以避免...的风险)是什么意思。 我的意思是磁盘上的表。通常在文件系统和目录上可以拥有多少文件是有限制的,所以如果你的文件太小,对于庞大的数据集来说,你可能拥有太多的文件。 risk 是,如果您的线程最终读取相同的文件和相同的条目,您的学习将不会像那些不同的文件那样快 【参考方案1】:

较新的 (2.5) 版本的 Tensorflow 具有数据集的分片功能。 从tensorflow documentation找到下面的示例代码

A = tf.data.Dataset.range(10)
B = A.shard(num_shards=3, index=0)
list(B.as_numpy_iterator())  

读取单个输入文件时,可以按如下方式对元素进行分片

d = tf.data.TFRecordDataset(input_file)
d = d.shard(num_workers, worker_index)

【讨论】:

以上是关于对数据集进行分片是不是有任何指导方针?的主要内容,如果未能解决你的问题,请参考以下文章

复杂数据流作业的架构

mongodb基础学习11-复制集和分片结合使用

政策和程序应遵循哪些指导方针?

在 Prisma 中命名关系的正确方法是啥?是不是有我应该遵循的指导方针或约定?

数据集是不是存在任何已知问题

mongodb 3.4 集群搭建:分片+副本集