Google Developer Days (GDD) – это глобальное мероприятие, на котором демонстрируются новейшие продукты и платформы Google для разработчиков, призванные помочь вам быстро разрабатывать высококачественные приложения, расширять и сохранять активную пользовательскую базу, а также использовать инструменты для получения большего дохода. Конференция разработчиков Google 2018 прошла в Шанхае 20 и 21 сентября. ?Конференция разработчиков Google, 2018 г., самородки
21 сентября, во второй день GDD 2018, Чен Шуанг (разработчик программного обеспечения Google Brain) представил нам «Оптимизацию обучающих данных с помощью tf.data», объясняя, как использовать tf.data для создания высокопроизводительного ввода TensorFlow для различных моделей каналов, в этой статье будут выдержки из галантереи речевой техники.
конвейер ввода данных
- Большинство людей тратят время и деньги на архитектуру нейронной сети, ввод данных легко игнорируется
- Без хорошего конвейера ввода данных скорость графического процессора не будет значительно улучшена.
- Цели: Эффективный, гибкий, простой в использовании
ETL-система
- Извлечение: извлеките обучающие данные из средства доступа (диск, облако и т. д.).
- Преобразование данных (преобразование): преобразование данных в данные, читаемые моделью, и одновременное выполнение предварительной обработки, такой как очистка данных.
- Загрузить данные (Load): загрузить обработанные данные в ускоритель
tf.data: система ввода данных, предназначенная для машинного обучения.
Коды на рисунке соответствуют трем шагам системы ETL, которую можно легко реализовать с помощью tf.data.
метод оптимизации tf.data: приведенный выше код в качестве примера
- Многопоточность (используяnum_parallel_reads)
files = tf.data.Dataset.list_files("training-*-of-1024.tfrecord")
dataset = tf.data.TFRecordDataset(files, num_parallel_reads=32)
- Объединить этапы преобразования (например,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))
- конвейерная обработка (с использованием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