Оптимизация конвейера ввода обучающих данных с помощью tf.data 丨 Google Developers Conference 2018

Google искусственный интеллект TensorFlow Python
Оптимизация конвейера ввода обучающих данных с помощью tf.data 丨 Google Developers Conference 2018

Google Developer Days (GDD) – это глобальное мероприятие, на котором демонстрируются новейшие продукты и платформы Google для разработчиков, призванные помочь вам быстро разрабатывать высококачественные приложения, расширять и сохранять активную пользовательскую базу, а также использовать инструменты для получения большего дохода. Конференция разработчиков Google 2018 прошла в Шанхае 20 и 21 сентября. ?Конференция разработчиков Google, 2018 г., самородки

21 сентября, во второй день GDD 2018, Чен Шуанг (разработчик программного обеспечения Google Brain) представил нам «Оптимизацию обучающих данных с помощью tf.data», объясняя, как использовать tf.data для создания высокопроизводительного ввода TensorFlow для различных моделей каналов, в этой статье будут выдержки из галантереи речевой техники.

конвейер ввода данных

  • Большинство людей тратят время и деньги на архитектуру нейронной сети, ввод данных легко игнорируется
  • Без хорошего конвейера ввода данных скорость графического процессора не будет значительно улучшена.
  • Цели: Эффективный, гибкий, простой в использовании

ETL-система

  1. Извлечение: извлеките обучающие данные из средства доступа (диск, облако и т. д.).
  2. Преобразование данных (преобразование): преобразование данных в данные, читаемые моделью, и одновременное выполнение предварительной обработки, такой как очистка данных.
  3. Загрузить данные (Load): загрузить обработанные данные в ускоритель

tf.data: система ввода данных, предназначенная для машинного обучения.

Коды на рисунке соответствуют трем шагам системы ETL, которую можно легко реализовать с помощью tf.data.

метод оптимизации tf.data: приведенный выше код в качестве примера

  1. Многопоточность (используяnum_parallel_reads)
files = tf.data.Dataset.list_files("training-*-of-1024.tfrecord")
dataset = tf.data.TFRecordDataset(files, num_parallel_reads=32)
  1. Объединить этапы преобразования (например,shuffle_and_repaeat, map_and_batch)
dataset = dataset.apply(tf.contrib.data.shuffle_and_repaeat(10000, NUM_EPOCHS))
dataset = dataset.apply(tf.contrib.data.map_and_batch(lambda x: ..., BATCH_SIZE))
  1. конвейерная обработка (с использованиемprefetch_to_device)
dataset = dataset.apply(tf.contrib.data.prefetch_to_device("/gpu:0"))

Окончательный код показан на рисунке ниже, дополнительные методы оптимизации см.Руководство по производительности tf.data:

Гибкость tf.data

Поддержка функционального программирования

Как показано на рисунке выше, вы можете использовать пользовательский map_fn для обработки TensorFlow или совместимых функций, одновременно поддерживая функции, обрабатываемые AutoGraph.

Поддержка разных языков и типов данных

  • Используйте Dataset.form_generator() для поддержки набора данных генерации кода Python.
  • Поддержка пользовательского кода обработки данных C++ с использованием DatasetOpKernel и tf.load_op_library.

Как показано ниже, используйте urllib, поставляемый с Python, для получения данных сервера и сохранения их в наборе данных:

Поддерживает несколько источников данных

Например, обычная файловая система, облачное хранилище GCP, другое облачное хранилище, база данных SQL и т. д.

Пример чтения файла TFRecord, хранящегося в Google Cloud:

files = tf.contrib.data.TFRecordDataset(
  "gs://path/to/file.tfrecord", num_parallel_reads=32)

Пример использования пользовательской базы данных SQL:

files = tf.contrib.data.SqlDataset(
  "sqllite", "/foo/db.sqlite", "SELECT name, age FROM people", 
  (tf.string, tf.int32))

Простота использования tf.data

В режиме выполнения Eager цикл Python for можно использовать напрямую:

tf.enable_eager_execution()
for batch in dataset:
    train_model(batch)

Предоставьте существующие эффективные рецепты для примера TF или CSV.

Приведенную выше диаграмму можно просто заменить функцией:

dataset = tf.contrib.data.make_batched_features_dataset(
  "training-*-of-1024.tfrecord",
  BATCH_SIZE, features, num_epochs=NUM_EPOCHS)

Сценарии с использованием наборов данных CSV:

dataset = tf.contrib.data.make_csv_dataset(
  "*.csv", BATCH_SIZE, num_epochs=NUM_EPOCHS)

AUTOTUNE TUBE С ПОМОЩЬЮ AUTOTUNE

Наилучшие параметры для предварительной выборки можно найти, просто используя AUTOTUNE:

dataset = dataset.prefetch(tf.contrib.data.AUTOTUNE)

Поддержка Keras и Estimators, совместимых друг с другом

Для Keras набор данных можно передать напрямую; для функции обучения Estimators набор данных можно обернуть во входную функцию и вернуть, как показано в следующем примере:

def input_fn():
    dataset = tf.contrib.data.make_csv_dataset(
      "*.csv", BATCH_SIZE, num_epochs=NUM_EPOCHS)
    return dataset
   
tf.estimator.Estimator(model_fn=train_model).train(input_fn=input_fn)

Практический опыт применения

  • Необработанный код ввода данных tf.data: ~150 изображений/сек.
  • Код ввода данных tf.data по конвейеру: ~1750 изображений/сек =>12x производительность!
  • Использование tf.data в Cloud TPU: ~4100 изображений/сек.
  • Использование tf.data в Cloud TPU Pod: ~219 000 изображений/сек.

в заключении

В этом докладе рассказывается о tf.data, эффективном, гибком и простом в использовании API, и рассказывается, как использовать конвейерную обработку и другие оптимизации для повышения производительности вычислений, а также о многих полезных функциях, которые могут быть неизвестны.

ресурс

Узнайте больше о технических материалах Google Developers Conference 2018