Чтение TFRecord становится медленным

Я разделил набор данных на 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)

1 ответ

Я думаю, что вы пытаетесь создать мини-пакет самостоятельно, но вместо этого вы должны использовать tensorflow очереди как tf.train.shuffle_batch или же tf.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. Сделать input data preprocessing в CPU, в то время как остальные вычислительные матричные операции выполняются на GPU. Ваше использование GPU не близко к 100%, это означает, что узкое место связано с тем, что процессор загружает недостаточно данных.
  3. Старайтесь держать больше tfrecords вместо manytdrecords, так что данные могут быть прочитаны последовательно быстрее без переключения нескольких файлов.
  4. Если вы имеете дело с изображениями, не сохраняйте raw изображение к tfrecords но вместо этого используйте jpeg или аналогичные форматы, чтобы они занимали меньший размер файла и могли читаться быстрее. jpeg decode вычисление является очень маленькой стоимостью для GPU,
Другие вопросы по тегам