TensorFlow数据饥饿GPU

4

我需要帮助优化一个自定义的TensorFlow模型。我有一个40GB的ZLIB压缩的.TFRecords文件,其中包含我的训练数据。每个样本由两个384x512x3的图像和一个384x512x2的向量场组成。我正在按照以下方式加载我的数据:

    num_threads = 16
    reader_kwargs = {'options': tf.python_io.TFRecordOptions(tf.python_io.TFRecordCompressionType.ZLIB)}
    data_provider = slim.dataset_data_provider.DatasetDataProvider(
                        dataset,
                        num_readers=num_threads,
                        reader_kwargs=reader_kwargs)
    image_a, image_b, flow = data_provider.get(['image_a', 'image_b', 'flow'])

    image_as, image_bs, flows = tf.train.batch(
        [image_a, image_b, flow],
        batch_size=dataset_config['BATCH_SIZE'], # 8
        capacity=dataset_config['BATCH_SIZE'] * 10,
        num_threads=num_threads,
        allow_smaller_final_batch=False)

然而,我的全局步速仅为0.25-0.30(非常慢!)

这是我使用的并行读取器的TensorBoard仪表板,它始终保持在99%-100%。 enter image description here

我将GPU使用率绘制成了随时间变化的图形(%每秒)。看起来数据不足,但我不知道该如何解决。我已经尝试过增加/减少线程数量,但似乎没有任何差别。我正在使用NVIDIA K80 GPU进行训练,拥有4个CPU和61GB的RAM。

GPU Usage

如何使训练更快?

1个回答

0

如果您的示例很小,那么使用 DataSetProvider 将不会产生令人满意的结果。它一次只读取一个示例,这可能是一个瓶颈。我已经在 GitHub 上添加了一个功能请求

与此同时,您将需要使用自己的输入队列来使用 read_up_to

  batch_size = 10000
  num_tfrecords_at_once = 1024
  reader = tf.TFRecordReader()
  # Here's where the magic happens:
  _, records = reader.read_up_to(filename_queue, num_tfrecords_at_once)

  # Batch records with 'enqueue_many=True'
  batch_serialized_example = tf.train.shuffle_batch(
      [records],
      num_threads=num_threads,
      batch_size=batch_size,
      capacity=10 * batch_size,
      min_after_dequeue=2 * batch_size,
      enqueue_many=True)

  parsed = tf.parse_example(
      batch_serialized_example,
      features=whatever_features_you_have)
  # Use parsed['feature_name'] etc. below

谢谢您的建议!我已经尝试了,但没有任何改变。每个TFRecord都相当大(两个384x512x3 float32和一个384x512x2 float32),所以我不认为我有您遇到的同样问题。 - Sam P
好的,对于这么大的记录,可能不会有什么影响。在分批之前,您是否进行了任何预处理?最好将所有这些操作都固定在CPU上,以防止自动放置器将某些操作放置在其他设备上,从而导致不必要的复制。 - panmari
我在批处理之后显式地在CPU上进行预处理。 - Sam P
1
那么我猜那一定是你的瓶颈。 - panmari
谢谢!这导致了25%的加速。自最初发布以来,我已经调整了网络,因此速度从0.95步/秒提高到1.20步/秒。仍然相当慢,但这可能只是由于预处理和网络规模造成的。 - Sam P
为了澄清,我将预处理移动到批处理之前而不是之后。 - Sam P

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接