首页 文章

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

提问于
浏览
0

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

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

  • Line 152/153 inputs = tf.feature_column.input_layer(features, transformed_columns) & label_values = tf.constant(LABELS) - 如果我在这两行中包裹 with tf.device('/cpu:0') 就足以覆盖这个例子中的'preprocessing'了吗?

  • Line 282/294 - 还有一个 generate_input_fnparse_csv 函数用于设置输入数据队列 . 是否有必要将 with tf.device('/cpu:0') 放在这些函数中,或者基本上是通过输入&label_values已被包装来强迫的?

Main Question :上述哪些实施建议足以将所有预处理正确放置在CPU上?

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

  • 如果机器有多个内核怎么办? 'cpu:0'会受到限制吗?

  • 帖子暗示我通过将预处理包装在cpu上,GPU将自动用于其余部分 . 实际情况是这样的吗?

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

2 回答

  • 1

    主要问题:

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

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

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

    • 如果您的正在运行的计算机具有GPU,则TensorFlow将优先在未指定设备的情况下在GPU上分配操作 .

  • 2

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

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

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

相关问题