7ha*_*ker 12 tensorflow tensorflow-gpu tensorflow-datasets
我们在Tensorflow上运行多GPU作业,并评估从基于队列的模型(使用string_input_producer接口)到新的Tensorflow Dataset API的迁移.后者似乎提供了一种更容易的方式来同时切换列车和验证.
下面的代码片段显示了我们如何做到这一点.
train_dataset, train_iterator = get_dataset(train_files, batch_size, epochs)
val_dataset, val_iterator = get_dataset(val_files, batch_size, epochs)
is_validating = tf.placeholder(dtype=bool, shape=())
next_batch = tf.cond(is_validating,
lambda: val_iterator.get_next(),
lambda: train_iterator.get_next())
validation_tower = self.num_gpus - 1
tower_grads = []
for i in range(self.num_gpus):
with tf.variable_scope(tf.get_variable_scope(),reuse=(i > 0)):
with tf.device('/gpu:%d' % i), tf.name_scope('%s_%d' % ('gpu_', i)) as scope:
if i == validation_tower:
images, labels = next_batch
# Loss funcs snipped out
else:
images, labels = next_batch
# Loss funcs snipped out
Run Code Online (Sandbox Code Playgroud)
get_dataset函数构建数据集,设置映射函数和批处理大小.它还构建了一个迭代器,但没有初始化它.迭代器的初始化发生在会话开始之前.
会话运行时提供is_validating布尔值,我们通过feed_dict传递的每个步骤is_validating为True,以使用验证数据集
我的问题是:
假设我有8个gpus,所以我们对7个GPU进行了培训.对于这7个GPU中的每一个,Iterator是否从同一点前进,从而为所有7个GPU提供相同的数据?
mrr*_*rry 19
目前有三种主要选择,它们具有不同的可用性和性能权衡:
在Dataset.batch()转换中,创建一个包含所有GPU示例的大批量.然后tf.split(..., self.num_gpus)在输出上使用Iterator.get_next()为每个GPU创建子批次.这可能是最简单的方法,但它确实将分裂放在关键路径上.
在Dataset.batch()转换中,创建一个适合单个GPU的小批量.然后Iterator.get_next()每GPU 调用一次以获得多个不同的批次.(相比之下,在您当前的代码中,相同的值next_batch被发送到每个GPU,这可能不是您想要发生的.)
创建多个迭代器,每个GPU一个.使用Dataset.shard()管道中的早期对数据进行分片(例如,如果数据集是分片的,则在文件列表中).请注意,此方法将在主机上消耗更多资源,因此您可能需要调低任何缓冲区大小和/或并行度
请注意,当前tf.data管道仅在CPU上运行,高效管道的一个重要方面是在上一步仍在运行时将训练输入暂存到GPU.请参阅TensorFlow CNN基准测试,了解如何有效地将数据分级到GPU的示例代码.我们目前正在努力tf.data直接向API 添加此支持.
| 归档时间: |
|
| 查看次数: |
4461 次 |
| 最近记录: |