在TensorFlow中分配GPU和CPU资源的最佳做法

我想知道设置用于创建/训练模型的设备的正确方法是什么,以便通过Keras API在TensorFlow中优化资源使用以进行快速训练?我可以使用1个CPU和2个GPU。我最初使用tf.device上下文创建模型并仅在GPU上进行训练,但是后来在tf.keras.utils.multi_gpu_model的TensorFlow文档中看到,他们建议在CPU上显式实例化模型:

# Instantiate the base model (or "template" model).
# We recommend doing this with under a CPU device scope,# so that the model's weights are hosted on CPU memory.
# Otherwise they may end up hosted on a GPU,which would
# complicate weight sharing.
with tf.device('/cpu:0'):
    model = Xception(weights=None,input_shape=(height,width,3),classes=num_classes)

# Replicates the model on 8 GPUs.
# This assumes that your machine has 8 available GPUs.
parallel_model = multi_gpu_model(model,gpus=8)
parallel_model.compile(loss='categorical_crossentropy',optimizer='rmsprop')

我这样做了,现在当我训练时,我看到我的CPU使用率在所有8个内核中都以大约70%的使用率上升,并且我的GPU内存已满。如果模型是在其中一个GPU上创建的,事情会变得更快吗?即使我只有1个GPU,在CPU上创建模型并使用tf.device上下文在GPU上训练模型仍然更好吗?

zyy63744753 回答:在TensorFlow中分配GPU和CPU资源的最佳做法

使用GPU进行计算可加速许多TensorFlow操作。没有任何注释,TensorFlow会自动决定是使用GPU还是CPU进行操作-如有必要,在CPU和GPU内存之间复制张量。由操作产生的张量通常由执行操作的设备的内存支持。

Tensorflow将仅在可见的物理设备上分配内存并进行操作,否则将不会在其上创建LogicalDevice。默认情况下,所有发现的设备都标记为可见。

GPU使用率也取决于batch_size。利用率可能会随着batch_size的变化而变化。

您还可以使用multi_gpu_model中的Example 3与模型比较当前结果(时间和利用率)。

此外,如果您进入链接,它会指出-

警告:不建议使用此功能。 2020-04-01之后将其删除。更新说明:改用tf.distribute.MirroredStrategy。

使用tf.distribute.MirroredStrategy可以提高性能并提高GPU利用率。该策略通常用于在一台具有多个GPU的机器上的训练。 tf.distribute.Strategy API提供了一种抽象,用于将您的训练分布在多个处理单元中。目的是允许用户以最少的更改使用现有模型和培训代码来进行分布式培训。

例如,在MirroredStrategy下创建的变量是MirroredVariable。如果在策略的构造函数参数中未指定任何设备,则它将使用所有可用的GPUs。如果未找到GPUs,它将使用可用的CPUs。请注意,TensorFlow将一台计算机上的所有CPUs视为一个设备,并在内部使用线程进行并行处理。

建议您阅读Custom training with tf.distribute.Strategy教程,该教程演示如何将tf.distribute.Strategy与自定义训练循环一起使用。他们将在MNIST时尚数据集上训练一个简单的CNN模型。

希望这能回答您的问题。学习愉快。

本文链接:https://www.f2er.com/3019956.html

大家都在问