python - 在 TensorFlow 中分配 GPU 和 CPU 资源的最佳实践
问题描述
我想知道设置设备以创建/训练模型以优化资源使用以使用 Keras API 在 TensorFlow 中进行快速训练的正确方法是什么?我有 1 个 CPU 和 2 个 GPU 可供使用。我最初使用tf.device
上下文来创建我的模型并仅在 GPU 上进行训练,但后来我在 TensorFlow 文档中看到tf.keras.utils.multi_gpu_model
,他们建议在 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
。
Example 3
您还可以使用from multi_gpu_model将当前结果(所用时间和利用率)与模型进行比较。
此外,如果您进入链接,它会指出 -
警告:此功能已弃用。它将在 2020-04-01 之后删除。更新说明:改用 tf.distribute.MirroredStrategy。
应该有性能改进和使用tf.distribute.MirroredStrategy
. 此策略通常用于在具有多个 GPU 的一台机器上进行训练。API 提供了一种抽象,用于将tf.distribute.Strategy
您的训练分布在多个处理单元中。目标是允许用户使用现有模型和训练代码启用分布式训练,而只需进行最少的更改。
例如,在 a 下创建的变量MirroredStrategy
是 a MirroredVariable
。如果在策略的构造函数参数中没有指定设备,那么它将使用所有可用的GPUs
. 如果没有GPUs
找到,它将使用可用的CPUs
. 请注意,TensorFlow 将CPUs
机器上的所有内容都视为单个设备,并在内部使用线程进行并行处理。
建议通过tf.distribute.Strategy 教程进行自定义训练,该教程演示了如何将 tf.distribute.Strategy 与自定义训练循环一起使用。他们将在时尚 MNIST 数据集上训练一个简单的 CNN 模型。
希望这能回答你的问题。快乐学习。
推荐阅读
- networking - 如何让传感器/海龟运行功能优先考虑当前最高能量的传感器/海龟?网标
- nestjs - 如何使用 { scope: Scope.REQUEST } 对服务上的每个请求调用方法?
- python - 熊猫:无法根据其他列的条件设置单元格值
- php - 在循环中渲染树枝组件
- c++ - Code Chef DSA 学习系列 : Multiple of 3 Multhree
- postgresql - 将 hasura 连接到现有的 postgresql
- python - 安装 scikit-image 时如何解决此错误?
- postgresql - On any of my Heroku apps, several `heroku pg:` commands fail immediately with "Cannot read property 'includes' of undefined."
- php - change the final number of the permalink by +1 php
- python - Low accuracy for triplet loss in image recognition