Чтение 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)
Чтобы сократить время загрузки данных, вам помогут следующие пункты:
- Установка параметра
MIN_AFTER_DEQUEUE
это важно. Установка большого числа приведет к более медленному запуску и большему объему памяти, но будет лучше при запуске. - Сделать
input data preprocessing
в CPU, в то время как остальные вычислительные матричные операции выполняются на GPU. Ваше использование GPU не близко к 100%, это означает, что узкое место связано с тем, что процессор загружает недостаточно данных. - Старайтесь держать больше
tfrecords
вместоmany
tdrecords
, так что данные могут быть прочитаны последовательно быстрее без переключения нескольких файлов. - Если вы имеете дело с изображениями, не сохраняйте
raw
изображение кtfrecords
но вместо этого используйтеjpeg
или аналогичные форматы, чтобы они занимали меньший размер файла и могли читаться быстрее.jpeg decode
вычисление является очень маленькой стоимостью дляGPU
,