Google 开发者大会 (Google Developer Days,简称 GDD) 是展示 Google 最新开发者产品和平台的全球盛会,旨在帮助你快速开发优质应用,发展和留住活跃用户群,充分利用各种工具获得更多收益。2018 Google 开发者大会于 9 月 20 日和 21 日于上海举办。?Google 开发者大会 2018 掘金专题
GDD 2018 第二天的 9 月 21 日 ,陈爽(Google Brain 软件工程师)为我们带来了《以 tf.data 优化训练数据》,讲解如何使用 tf.data 为各类模型打造高性能的 TensorFlow 输入渠道,本文将摘录演讲技术干货。
图中代码分别对应 ETL 系统的三个步骤,使用 tf.data 即可轻松实现。
files = tf.data.Dataset.list_files("training-*-of-1024.tfrecord")
dataset = tf.data.TFRecordDataset(files, num_parallel_reads=32)
复制代码
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))
复制代码
dataset = dataset.apply(tf.contrib.data.prefetch_to_device("/gpu:0"))
复制代码
最终代码如下图所示,更多优化手段可以参考 tf.data 性能指南:
如上图,可以用自定义的 map_fn 处理 TensorFlow 或兼容的函数,同时支持 AutoGraph 处理过的函数。
如下图,使用 Python 自带的 urllib 获取服务器数据,存入 dataset:
如普通文件系统丶GCP 云储存丶其他云储存丶SQL 数据库等。
读取 Google 云储存的 TFRecord 文件示例:
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.enable_eager_execution()
for batch in dataset:
train_model(batch)
复制代码
上图可以简单替换为一个函数:
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 找到 prefetching 的最佳参数:
dataset = dataset.prefetch(tf.contrib.data.AUTOTUNE)
复制代码
对於 Keras,可以将 dataset 直接传递使用;对於 Estimators 训练函数,将 dataset 包装至输入函数并返回即可,如下示例:
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 这个兼具高效丶灵活与易用的 API,同时了解如何运用管道化及其他优化手段来增进运算效能,以及许多可能未曾发现的实用函数。