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

Modify Tensorflow Code to place preprocessing on CPU and training on GPU

我正在读这个 performance guide on the best practices for optimizing TensorFlow code for GPU. One suggestion they have is to place the preprocessing operations on the CPU so that the GPU is dedicated for training. To try to understand how one would actually implement this within an experiment (ie. learn_runner.run()). To further the discussion, I'd like to consider the best way to apply this strategy to the Custom Estimator Census Sample provided here

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

  1. Line 152/153 inputs = tf.feature_column.input_layer(features, transformed_columns) & label_values = tf.constant(LABELS) - 如果我将 with tf.device('/cpu:0') 包裹在这两行周围是否足以覆盖此示例中的 'preprocessing'?
  2. Line 282/294 - 还有一个 generate_input_fnparse_csv 函数用于设置输入数据队列。是否有必要将 with tf.device('/cpu:0') 也放置在这些函数中,或者基本上是通过输入 & label_values 已经包装来强制的?

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

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

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

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

主要问题:

你放置的2个代码实际上是训练的2个不同部分,我的选项中的第282/294行是所谓的"pre-processing"部分,因为它将原始输入数据解析为张量,这个操作不适合GPU 加速,所以如果分配在 CPU.

上就足够了

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

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

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

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

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

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