Я следовал официальному руководству TF, чтобы использовать tf.data.Dataset
API для построения конвейера данных, но я обнаружил, что он примерно в 2 раза медленнее, чем мой конвейер данных Python, использующий hdf5.
Вот мой результат эксперимента:
TFRecordDataset: 660 thousand samples/second
hdf5 reader + feed_dict to placeholder: 1.1 million samples/second
Мои настройки эксперимента:
- размер партии = 1000,
- печатать журнал каждые 10 миллионов образцов, чтобы показать время,
- запустить поддельную модель , которая принимает только данные в качестве входных данных и ничего не вычисляет.
Что еще хуже, когда я устанавливаю размер пакета = 10000, он становится:
TFRecordDataset: 760 thousand samples/second
hdf5 reader + feed_dict to placeholder: 2.1 million samples/second
Вот мой код для чтения tfrecord
def parse_tfrecord_batch(record_batch):
FEATURE_LEN = 29
dics = {
'label': tf.FixedLenFeature(shape=(), dtype=tf.int64),
'feature_id': tf.FixedLenFeature(shape=(FEATURE_LEN,), dtype=tf.int64),
'feature_val': tf.FixedLenFeature(shape=(FEATURE_LEN,), dtype=tf.float32)
}
parsed_example = tf.parse_example(record_batch, dics)
return parsed_example['feature_id'], parsed_example['feature_val'], parsed_example['label']
class fakeModel:
def __init__(self, train_filenames):
self.graph = tf.Graph()
with self.graph.as_default():
dataset = tf.data.TFRecordDataset(train_filenames)
dataset = dataset.repeat()
dataset = dataset.batch(1000)
dataset = dataset.map(parse_tfrecord_batch, num_parallel_calls=1)
dataset = dataset.prefetch(1000)
self.iterator = dataset.make_initializable_iterator()
self.id, self.wt, self.label = self.iterator.get_next()
self.train_preds = tf.identity(self.lbl_hldr)
Я настроил num_parallel_calls
на 2, 10. Не работает.
Я также настроил prefetch(n)
с 1 на 1000, что мало улучшило.
Мой вопрос:
Есть ли способ улучшить мой конвейер данных tfrecord? Я что-то упустил в своем коде?
Благодарим за любую помощь.