【问题标题】:Modify Tensorflow Code to place preprocessing on CPU and training on GPU修改 TensorFlow 代码,将预处理放在 CPU 上,训练放在 GPU 上
【发布时间】:2017-09-01 14:04:39
【问题描述】:

我正在阅读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') 也放在这些函数中,或者这基本上是通过包装输入和标签值来强制执行的?

主要问题:以上哪些实现建议足以将所有预处理正确地放在 CPU 上?

帖子中未解决的一些其他问题:

  1. 如果机器有多个内核怎么办? 'cpu:0' 会受到限制吗?
  2. 该帖子向我暗示,通过将预处理封装在 cpu 上,GPU 将自动用于其余部分。真的是这样吗?

分布式机器学习引擎实验 作为后续,我想了解如何在分布式 ML 引擎实验中进一步调整它——如果有 2 个工作 GPU、1 个主 CPU 和一个参数服务器,上述任何建议是否需要更改?我的理解是分布式训练将是数据并行的异步训练,因此每个工作人员将独立地迭代数据(并将梯度异步传递回 PS),这向我表明,上面的单个 GPU 没有进一步的修改是如果您以这种方式训练,则需要。然而,这似乎有点容易成为现实。

【问题讨论】:

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


    【解决方案1】:

    主要问题:

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

    第 152/152 行是训练模型的一部分,因为它将原始特征处理成不同类型的特征。

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

    2. 如果您的运行机器有 GPU,如果未指定设备,TensorFlow 将优先在 GPU 上分配操作。

    【讨论】:

    • 澄清 #2:如果存在 GPU 内核,它将被放置在 GPU 上。另请注意,如果您使用的机器具有超过 1 个 GPU,则需要使用显式设备语句,否则它们将全部放在 /gpu:0
    • 谢谢!这些 cmets 有助于解决我的一些澄清问题,但我很想确认主要问题是“`with tf.device('cpu:0') 需要在哪里包装?只包装就足够了吗?这个在model_fn中的输入层周围(建议在1行152/153)还是也需要放在其他地方(比如第282/294行的input_fn的一部分)?
    • 我已经更新了我的问题,让这个“主要问题”更加清晰
    • 为了“安全”,您应该将您提到的所有操作都固定到 cpu。
    • 对于第 282/294 行,这两个函数的哪些部分需要包含在 with tf.device('cpu:0') 中? @rhaertel80 建议固定所有操作,但这些行指向函数。将with tf.device('cpu:0') 作为函数的第一行然后缩进函数的其余部分就足够了吗?对我来说,如何固定 model_fn 中包含的任何操作很明显,但我不清楚 input_fn 的 tf.device 管脚是否会通过实验按预期进行
    【解决方案2】:

    前面的答案准确地描述了设备放置。请允许我回答有关分布式 TF 的问题。

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

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

    【讨论】:

    • 这对我来说很有意义。 1) 将所有预处理转移到 CPU 需要两个提议的with tf.device() 语句中的哪一个(如果有的话或两者都有)? 2)您对具有大量 GPU 的单台机器的建议在设置的 ML 引擎层中似乎并不可行。唯一的 GPU 选项是 BASIC_GPU,然后任何其他 GPU 选项都需要自定义配置,可以有一个带有 8 个 GPU 的 complex_model_l_gpu,但它仍然需要使用具有主服务器、工作人员和参数服务器的分布式设置。有没有办法在 ML 引擎中使用具有大量 GPU 的单机?
    • (1) 我将评论下面的帖子 (2) 在自定义设置中您只需要 1 个主机,不需要其他机器类型;使用complex_model_l_gpu
    猜你喜欢
    • 1970-01-01
    • 2017-03-30
    • 2018-05-26
    • 2018-05-18
    • 2021-03-11
    • 1970-01-01
    • 1970-01-01
    • 2019-01-29
    • 2017-07-27
    相关资源
    最近更新 更多