修改Tensorflow代码以在CPU上进行预处理并在GPU上进行培训

时间:2017-09-01 14:04:39

标签: python tensorflow google-cloud-platform tensorflow-gpu google-cloud-ml-engine

我正在阅读performance guide关于优化GPU TensorFlow代码的最佳实践。他们的一个建议是将预处理操作放在CPU上,以便GPU专门用于培训。试图理解如何在实验中实际实现这一点(即learn_runner.run())。为了进一步讨论,我想考虑将此策略应用于here提供的自定义估算人口普查样本的最佳方法。

文章建议在预处理操作周围放置with tf.device('/cpu:0')。但是,当我查看自定义估算器时,“预处理”似乎分多步完成:

  1. Line 152/153 inputs = tf.feature_column.input_layer(features, transformed_columns) & label_values = tf.constant(LABELS) - 如果我将with tf.device('/cpu:0')包裹在这两行附近就足以涵盖此示例中的“预处理”了吗?
  2. Line 282/294 - 还有一个generate_input_fnparse_csv函数,用于设置输入数据队列。是否有必要将with tf.device('/cpu:0')放在这些功能中,或者基本上是通过输入& label_values已经包裹好了吗?
  3. 主要问题:上述哪些实施建议足以将所有预处理正确地放在CPU上?

    帖子中未涉及的其他一些问题:

    1. 如果机器有多个内核怎么办? 'cpu:0'会限制吗?
    2. 这篇文章告诉我,通过将预处理包装在cpu上,GPU将自动用于其余部分。实际情况如此吗?
    3. 分布式ML引擎实验 作为后续工作,我想了解如何在分布式ML引擎实验中进一步调整 - 如果有2个工作GPU,1个主CPU和参数服务器,上述任何建议是否需要更改?我的理解是,分布式训练将是数据并行异步训练,以便每个工作人员将独立地迭代数据(并将梯度异步传递回PS),这表明我不会对上面的单个GPU进行进一步修改。如果你以这种方式训练就需要。但是,这似乎有点容易成为现实。

2 个答案:

答案 0 :(得分:2)

主要问题:

您放置的2个代码实际上是培训的2个不同部分,我的选项中的282/294行是所谓的"预处理"部分,因为它将原始输入数据解析为Tensors,这种操作不适合GPU加速,所以如果在CPU上分配就足够了。

第152/152行是培训模型的一部分,用于将原始特征处理成不同类型的特征。

  1. ' CPU:0'表示此部分的操作将在CPU上分配,但不绑定到指定的核心。在CPU上分配的操作将在多线程中运行并使用多核。

  2. 如果您的正在运行的计算机具有GPU,则如果未指定设备,TensorFlow将更愿意在GPU上分配操作。

答案 1 :(得分:1)

上一个答案准确描述了设备放置。请允许我提供有关分布式TF的问题的答案。

首先要注意的是,只要有可能,您就会选择具有大量GPU的单台计算机和具有单个GPU的多台计算机。同一台机器上RAM中参数的带宽(甚至更好,在GPU本身上)比通过网络快几个数量级。

也就是说,有时您需要分布式培训,包括远程参数服务器。在这种情况下,您不一定需要在单个机器设置中更改代码中的任何内容。