我正在阅读performance guide关于优化GPU TensorFlow代码的最佳实践。他们的一个建议是将预处理操作放在CPU上,以便GPU专门用于培训。试图理解如何在实验中实际实现这一点(即learn_runner.run())。为了进一步讨论,我想考虑将此策略应用于here提供的自定义估算人口普查样本的最佳方法。
文章建议在预处理操作周围放置with tf.device('/cpu:0')
。但是,当我查看自定义估算器时,“预处理”似乎分多步完成:
inputs = tf.feature_column.input_layer(features, transformed_columns) & label_values = tf.constant(LABELS)
- 如果我将with tf.device('/cpu:0')
包裹在这两行附近就足以涵盖此示例中的“预处理”了吗?generate_input_fn
和parse_csv
函数,用于设置输入数据队列。是否有必要将with tf.device('/cpu:0')
放在这些功能中,或者基本上是通过输入& label_values已经包裹好了吗?主要问题:上述哪些实施建议足以将所有预处理正确地放在CPU上?
帖子中未涉及的其他一些问题:
分布式ML引擎实验 作为后续工作,我想了解如何在分布式ML引擎实验中进一步调整 - 如果有2个工作GPU,1个主CPU和参数服务器,上述任何建议是否需要更改?我的理解是,分布式训练将是数据并行异步训练,以便每个工作人员将独立地迭代数据(并将梯度异步传递回PS),这表明我不会对上面的单个GPU进行进一步修改。如果你以这种方式训练就需要。但是,这似乎有点容易成为现实。
答案 0 :(得分:2)
主要问题:
您放置的2个代码实际上是培训的2个不同部分,我的选项中的282/294行是所谓的"预处理"部分,因为它将原始输入数据解析为Tensors,这种操作不适合GPU加速,所以如果在CPU上分配就足够了。
第152/152行是培训模型的一部分,用于将原始特征处理成不同类型的特征。
' CPU:0'表示此部分的操作将在CPU上分配,但不绑定到指定的核心。在CPU上分配的操作将在多线程中运行并使用多核。
如果您的正在运行的计算机具有GPU,则如果未指定设备,TensorFlow将更愿意在GPU上分配操作。
答案 1 :(得分:1)
上一个答案准确描述了设备放置。请允许我提供有关分布式TF的问题的答案。
首先要注意的是,只要有可能,您就会选择具有大量GPU的单台计算机和具有单个GPU的多台计算机。同一台机器上RAM中参数的带宽(甚至更好,在GPU本身上)比通过网络快几个数量级。
也就是说,有时您需要分布式培训,包括远程参数服务器。在这种情况下,您不一定需要在单个机器设置中更改代码中的任何内容。