我们如何从分片数据中获益,加快培训时间?

时间:2017-12-06 01:16:42

标签: tensorflow

我的主要问题是:我有200万张200万张图像的培训记录,28GB用于验证tf.records文件,302900张图像。培训一个时代需要8个小时,培训需要33天。我想通过使用多个线程和分片来提高速度,但我对一些事情感到有些困惑。

tf.data.Dataset API中有shard函数,所以在文档中他们提到了关于分片函数的以下内容:

  

创建一个仅包含此数据集的1 / num_shards的数据集。

     

此数据集运算符在运行分布式培训时非常有用,因为它允许每个工作人员读取唯一的子集。

     

读取单个输入文件时,可以按如下方式跳过元素:

d = tf.data.TFRecordDataset(FLAGS.input_file)
d = d.shard(FLAGS.num_workers, FLAGS.worker_index)
d = d.repeat(FLAGS.num_epochs)
d = d.shuffle(FLAGS.shuffle_buffer_size)
d = d.map(parser_fn, num_parallel_calls=FLAGS.num_map_threads)
  

重要提示:

     

在使用任何随机化运算符(例如shuffle)之前,请务必进行分片。   通常,最好在数据集管道的早期使用分片运算符。 >例如,当从一组TFRecord文件中读取时,在转换之前将分片>数据集输入样本。这样可以避免读取每个工作人员的每个文件。 >以下是完整>管道内的有效分片策略的示例:

d = Dataset.list_files(FLAGS.pattern)
d = d.shard(FLAGS.num_workers, FLAGS.worker_index)
d = d.repeat(FLAGS.num_epochs)
d = d.shuffle(FLAGS.shuffle_buffer_size)
d = d.repeat()
d = d.interleave(tf.data.TFRecordDataset,
             cycle_length=FLAGS.num_readers, block_length=1)

d = d.map(parser_fn, num_parallel_calls=FLAGS.num_map_threads)

所以关于上面代码的问题是当我尝试使用分片函数生成数据的d.shards时,如果我将分片数(num_workers)设置为10,我将有10个数据分割,那么应该我将d.interleave函数中的num_reader设置为10,以保证每个阅读器从10个分割中分出一个?

以及如何控制函数交错将采用哪种拆分?因为如果我将shard函数中的shard_index(worker_index)设置为1,它将给我第一次拆分。任何人都可以告诉我如何使用上述功能执行此分布式培训?

那么num_parallel_call怎么样?我应该把它设置为10吗?

知道我有单个tf.records文件用于培训而另一个用于验证,我不会将tf.records文件拆分成多个文件。

1 个答案:

答案 0 :(得分:1)

首先,为什么数据集只有200万只,只有200万张图像?我认为你的形象太大了。尝试调整图像大小。毕竟,你最终可能需要将其调整为224 x 224。

其次,尝试减小模型的大小。你的模型可能太深或不够有效。

第三,尝试并行化您的输入阅读过程。它可能是瓶颈。