Чтение нескольких общих файлов с помощью tf.data

#python #python-3.x #tensorflow #tensorflow-datasets #tensorflow2.0

#python #python-3.x #тензорный поток #tensorflow-наборы данных #tensorflow2.0

Вопрос:

Я пытаюсь реализовать конвейер ввода с помощью tf.data. Объекты находятся в матрице, экспортированной из matlab, в то время как метки находятся в других файлах, для чтения которых требуются определенные функции.

Имена файлов, которые должны быть загружены, могут быть вычислены с учетом числа.

Вот как я это реализовал

 def load_files(k):
    mesh_file = file_path(k, "off", flags.dataset_mesh)
    mat_file = file_path(k, "mat", flags.dataset_mat)

    mesh = pymesh.load_mesh(mesh_file)
    mat = scipy.io.loadmat(mat_file)

    return mesh.vertices, mat


def generator_fn():
    return (load_files(x) for x in range(1000000   1))


def input_fn() -> Dataset:
    dataset = tf.data.Dataset.from_generator(generator_fn,
           output_types=(tf.as_dtype(tf.float32), tf.as_dtype(tf.float32)), )
    dataset = dataset.batch(batch_size=flags.batch_size).repeat()
    dataset = dataset.cache()
    dataset = dataset.prefetch(buffer_size=flags.prefetch_buffer_size)
    return dataset
  

Проблема в том, что использование графического процессора очень низкое, около 5% (2080 ti). Я не уверен, где находится узкое место.
Я тестирую с помощью простого MLP, но использование графического процессора, похоже, не меняется, несмотря на слои или нейроны на слой, которые я добавляю.

Я выполняю обучение таким образом:

 model = keras.Sequential([
    keras.layers.Flatten(input_shape=(n_input,)),
    keras.layers.Dense(1024, activation=tf.nn.relu),
    .
    .
    .
    keras.layers.Dense(1024, activation=tf.nn.relu),
    keras.layers.Dense(n_output, activation=None)
])

model.compile(optimizer='adam', loss='mean_squared_error')

model.fit(input_fn().make_one_shot_iterator(), steps_per_epoch=1000000, epochs=1)
  

Итак, я думаю, что проблема может заключаться в том, как я передаю данные (проблема не должна заключаться только в чтении файла, поскольку я использую SSD NVMe), в том, как я провожу обучение, или в том, что это всего лишь простая сеть, несмотря на слои, которые я добавляю.

Однако я хотел бы знать, существует ли более эффективный способ передачи данных.

Я использую tensorflow-gpu 2.0.0a0 , я запустил тест от lambda-labs, и он смог использовать графический процессор на 100%

Комментарии:

1. Попробуйте передать свои данные, используя какой-нибудь стандартный формат одного файла, такой как TFRecord или HDF5, который определенно поможет.

2. Какой тип данных load_files возвращает? Вы пробовали его профилирование? В каком формате файла хранятся данные в обоих file_path ? Вам это не нужно input_fn().make_one_shot_iterator() Я думаю, проблема в этой строке load_files(x) for x in range

3. Я немного занят на этой неделе, я определенно попытаюсь преобразовать весь набор данных (он довольно тяжелый, около 30 ГБ) в TFRecord. Мне не особенно нравится эта идея, поскольку я хотел бы сохранить совместимость данных с matlab, и я хотел бы максимально упростить создание набора данных. load_files возвращает две матрицы с плавающими значениями: одну с формой (n, 3), то есть вершины сетки, другую с формой (n,), то есть функцию, определенную в вершинах такой сетки. Я не знаю, как его профилировать, мне придется это проверить. Почему проблема должна быть в генераторе?

4. Не меняется ли загрузка графического процессора при запуске batch_size ?