Распараллелить подготовку данных с помощью тензорного потока и кера - PullRequest
0 голосов
/ 05 марта 2020

Я тренирую модель LSTM на GPU, используя Tensorflow Keras. Перед началом тренировки при вызове model.fit() требуется около 30 минут, чтобы начать тренировочный процесс. Я думаю, что в этот период его подготовка данных с использованием одного ядра процессора. Я прав? и если да, как я могу распараллелить этот процесс подготовки данных, используя несколько ядер?

1 Ответ

3 голосов
/ 05 марта 2020

Если вы используете tf.data.Dataset() для подготовки данных, вы можете использовать некоторые параметры при подготовке набора данных.

  1. Например, в вашей функции .map() установите для параметра num_parallel_calls значение num_parallel_calls=tf.data.experimental.AUTOTUNE; таким образом, это позволит вашей программе автоматически выбирать количество ядер ЦП для подготовки набора данных.
  2. Скорость также можно улучшить, если использовать .batch().shuffle() в этом порядке, а не shuffle().batch() в этот заказ. В первой ситуации вы берете пакет своего набора данных и перемешиваете элементы внутри него; во втором случае вы batch() в своем наборе данных после перетасовки всего набора данных. Легко видеть, что перетасовка огромного набора данных приведет к гораздо большему количеству затраченного времени, чем к группированию и перемешиванию в этом порядке.
  3. Давайте рассмотрим другой случай (связанный с фактическим процессом обучения) (не ваш случай, так как подготовка набора данных в вашей ситуации занимает много времени): операция prefetch(). В этом случае графический процессор не работает в режиме ожидания, ожидая, пока процессор загрузит другой пакет данных. Практически, когда обратное распространение завершило обновление весов после пакета, графический процессор сразу же потребляет другой пакет данных. Для простоты также установите его значение на tf.data.experimental.AUTOTUNE.
...