TFRecord IO медленнее, чем python hdf5 reader, как мне улучшить его скорость? - PullRequest
0 голосов
/ 11 ноября 2018

Я следовал официальному руководству 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? Я что-то упустил в своем коде?

Благодарим за любую помощь.

...