【问题标题】:TFRecord reading becomes slowTFR记录读取变慢
【发布时间】:2017-07-08 14:58:53
【问题描述】:

我已将数据集划分为 10 个 tfrecords 文件,我想从每个文件中读取 100 个数据点,以创建一批 10 个 100 个数据点的序列。我使用以下函数来做到这一点。来自 tfrecords 的数据加载时间开始缓慢,然后达到大约 0.65 秒,在 100-200 sess.run 调用后增加到大约 10 秒。您能否指出任何可能有助于减少阅读时间的错误或建议?此外,我提到的行为有时会变得更加不稳定。

def get_data(mini_batch_size):
  data = []
  for i in range(mini_batch_size):
    filename_queue = tf.train.string_input_producer([data_path + 'Features' + str(i) + '.tfrecords'])
    reader = tf.TFRecordReader()
    _, serialized_example = reader.read_up_to(filename_queue,step_size)
    features = tf.parse_example(serialized_example,features={'feature_raw': tf.VarLenFeature(dtype=tf.float32)})
    feature = features['feature_raw'].values
    feature = tf.reshape(feature,[step_size, ConvLSTM.H, ConvLSTM.W, ConvLSTM.Di])
    data.append(feature)
  return tf.stack(data)

即使我按如下方式从单个文件中提取,我也观察到相同的行为。此外,增加 num_threads 也无济于事。

 with tf.device('/cpu:0'):
   filename_queue = tf.train.string_input_producer(['./Data/TFRecords/Features' + str(i) + '.tfrecords'])
   reader = tf.TFRecordReader()
   _, serialized_example = reader.read(filename_queue)
   batch_serialized_example = tf.train.batch([serialized_example], batch_size=100, num_threads=1, capacity=100)
   features = tf.parse_example(batch_serialized_example,features={'feature_raw': tf.VarLenFeature(dtype=tf.float32)})
   feature = features['feature_raw'].values
   data.append(feature)
data = tf.stack(data)

init_op = tf.group(tf.global_variables_initializer(),tf.local_variables_initializer())
sess = tf.Session(config=tf.ConfigProto(intra_op_parallelism_threads=1,inter_op_parallelism_threads=1,allow_soft_placement=True))
sess.run(init_op)

coord = tf.train.Coordinator()
threads = tf.train.start_queue_runners(sess=sess, coord=coord)

for i in range(1000):
   t = time.time()
   D = sess.run(data)
   print(time.time()-t)

【问题讨论】:

    标签: tensorflow tensorflow-gpu tensorflow-xla


    【解决方案1】:

    我认为您正在尝试自己创建小批量,但您应该使用 tensorflow 队列,例如 tf.train.shuffle_batchtf.train.batch 来为您创建。

    你的输入流程应该是这样的:

    # Create a filename queue: Read tfrecord filenames 
    filename_queue = tf.train.string_input_producer
    
    #Create reader to populate the queue of examples
    reader = tf.TFRecordReader()
    _, serialized_example = reader.read_up_to(filename_queue,step_size)
    
    #Parses the example proto 
    features = tf.parse_example(serialized_example,features={'feature_raw': tf.VarLenFeature(dtype=tf.float32)})
    feature = features['feature_raw'].values
    feature = tf.reshape(feature,[step_size, ConvLSTM.H, ConvLSTM.W, ConvLSTM.Di])
    
    ## Shuffling queue that creates batches of data
    features = tf.train.shuffle_batch([feature], batch_size=batch_size, num_threads=2, capacity=MIN_AFTER_DEQUEUE + 3*batch_size, min_after_dequeue=MIN_AFTER_DEQUEUE)
    

    为了改善您的数据加载时间,以下几点将对您有所帮助:

    1. 设置参数MIN_AFTER_DEQUEUE 很重要。将其设置为较大的数字将具有较慢的启动速度和更多的内存,但运行时间数字会更好。
    2. 在 CPU 中执行input data preprocessing,而其余的计算密集型矩阵运算在 GPU 上运行。您的 GPU 利用率未接近 100%,这意味着瓶颈在于 CPU 没有加载足够的数据。
    3. 尽量保持更大的tfrecords而不是manytdrecords,这样可以更快地顺序读取数据而无需切换多个文件。
    4. 如果您处理图像,请不要将raw 图像保存到tfrecords 而是使用jpeg 或类似格式,这样它们将占用更少的文件大小并且可以更快地读取。 jpeg decode 计算对于 GPU 来说是非常小的开销。

    【讨论】:

    • 我想从每个 tfrecords 文件中获取 100 个连续的示例来创建一个序列。然后我想从 10 个不同的 tfrecord 文件中提取 10 个这样的序列来创建一个批处理。如果我使用 tf.train.shuffle_batch,它将在我不想要的 100 个序列内随机播放,因为它会丢失时间信息。另外,我有 10 个 tfrecord 文件,每个 50GB。此外,我不是要加载 jpeg 文件,而是要加载张量作为特征。我希望你能了解我的情况。
    • 那么不要使用随机批处理。如果您不想随机播放,可以使用 tf.train.batch。如果您正在使用时间信息,为什么不能将它们作为单个记录存储在一起。检查:stackoverflow.com/questions/44464828/…
    • 您能帮我看看如何使用 tf,train.batch 以我提到的格式创建批次,即从多个文件中读取以创建批次吗?我无法将 100 个特征作为单个序列保存在 tfrecords 中,因为这会限制我想要重叠的序列数量,如果我以重叠的方式保存它们,则会占用大量空间。
    • 项目是什么。这似乎是非常低效的做事方式。你为什么要这样做?从不同的文件中提取以创建批处理?
    • 这是我想要的理想场景。我有很长的数组索引描述时间的特征。假设我为每个批次 B 定义随机索引,并将它们设为 [N1 N2 ... NB]。然后我想从 i 在 1 到 B 之间的数组中加载索引为 Ni 到 Ni + 99 的特征。所以基本上我想要一个大小为 B x 100 x feature_dimension 的数组。但我想用 tfrecords 来做。 B 是批量大小。
    猜你喜欢
    • 2011-02-19
    • 1970-01-01
    • 2013-01-08
    • 1970-01-01
    • 2016-07-21
    • 1970-01-01
    • 1970-01-01
    • 2012-05-11
    • 1970-01-01
    相关资源
    最近更新 更多