在 TensorFlow 中分配 GPU 和 CPU 资源的最佳实践
Best practice for allocating GPU and CPU resources in TensorFlow
我想知道为 creating/training 模型设置设备的正确方法是什么,以便优化资源使用以使用 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 上训练模型是否更好?
许多 TensorFlow 操作都使用 GPU 进行加速计算。在没有任何注释的情况下,TensorFlow 会自动决定是使用 GPU 还是 CPU 进行操作——如有必要,在 CPU 和 GPU 内存之间复制张量。操作产生的张量通常由执行操作的设备的内存支持。
Tensorflow 只会在可见的物理设备上分配内存和放置操作,否则不会在它们上创建 LogicalDevice。默认情况下,所有发现的设备都标记为可见。
GPU 利用率也取决于 batch_size
。利用率可能随着 batch_size
的变化而变化。
您还可以使用来自 multi_gpu_model 的 Example 3
模型将您当前的结果(所用时间和利用率)进行比较。
此外,如果您进入 link,它会显示 -
Warning: THIS FUNCTION IS DEPRECATED. It will be removed after 2020-04-01. Instructions for updating: Use tf.distribute.MirroredStrategy instead.
使用 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 模型。
希望这能回答您的问题。快乐学习。
我想知道为 creating/training 模型设置设备的正确方法是什么,以便优化资源使用以使用 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 上训练模型是否更好?
许多 TensorFlow 操作都使用 GPU 进行加速计算。在没有任何注释的情况下,TensorFlow 会自动决定是使用 GPU 还是 CPU 进行操作——如有必要,在 CPU 和 GPU 内存之间复制张量。操作产生的张量通常由执行操作的设备的内存支持。
Tensorflow 只会在可见的物理设备上分配内存和放置操作,否则不会在它们上创建 LogicalDevice。默认情况下,所有发现的设备都标记为可见。
GPU 利用率也取决于 batch_size
。利用率可能随着 batch_size
的变化而变化。
您还可以使用来自 multi_gpu_model 的 Example 3
模型将您当前的结果(所用时间和利用率)进行比较。
此外,如果您进入 link,它会显示 -
Warning: THIS FUNCTION IS DEPRECATED. It will be removed after 2020-04-01. Instructions for updating: Use tf.distribute.MirroredStrategy instead.
使用 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 模型。
希望这能回答您的问题。快乐学习。