【问题标题】:TensorFlow Data Starved GPUTensorFlow 数据匮乏的 GPU
【发布时间】:2017-11-19 18:17:42
【问题描述】:

我需要帮助优化自定义 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 dash。它始终保持在 99%-100%。

我绘制了一段时间内的 GPU 使用情况(每秒百分比)。它看起来数据匮乏,但我不知道如何解决这个问题。我试过增加/减少线程数,但似乎没有什么区别。我正在使用具有 4 个 CPU 和 61GB 内存的 NVIDIA K80 GPU 进行训练。

我怎样才能让这列火车更快?

【问题讨论】:

    标签: tensorflow tf-slim tensorflow-gpu


    【解决方案1】:

    如果您的示例很小,那么使用 DataSetProvider 将不会产生令人满意的结果。它一次只读取一个示例,这可能是一个瓶颈。我已经添加了一个feature request on 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),所以我认为我没有你有同样的问题。 span>
    • 对,对于这种大小的记录,它可能不会有什么不同。您是否在批处理之前进行任何预处理?修复CPU上的所有这些操作可能有意义,以防止自动放置在其他设备上放置某些操作,这可能导致不必要的复制。 span>
    • 我正在做预处理批处理之后,显式在 CPU 上。
    • 那我想这一定是你的瓶颈。
    • 谢谢!这导致了25%的加速。自从最初发布以来,我一直在摆弄网络,因此它从 0.95 步/秒加速到 1.20 步/秒。仍然很慢,但这可能只是由于预处理 + 网络大小。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2020-05-22
    • 1970-01-01
    • 2021-05-09
    • 2020-01-14
    • 2019-06-22
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多