当前位置: 首页 > 知识库问答 >
问题:

理解在GPU上训练分类器时的硬件使用

夹谷俊远
2023-03-14

我正在使用TF2.0在GPU上帮助转移学习来训练一个猫狗分类器。我使用Keras ImageDataGenerator执行数据扩充。在培训模型时,我监控了GPU、磁盘(HDD)和CPU的使用情况,并注意到以下几点:-

  1. 对于第一个历元,磁盘使用率保持在恒定的20-25%。然而,在新纪元结束时,在验证阶段,其峰值达到40-50%。对于随后的时代,磁盘使用率奇怪地为零
  2. CPU利用率在一个时期内约为60%,但在最后达到100%时除外
  3. 当我加载任何Keras模型(如VGG16、Exception、InceptionResNetV2等)时,它们都占用了大约6.5 Gig的VRAM
  4. GPU的使用率几乎在整个时代都保持在29-30%的恒定水平,预计到最后会达到70%

根据这些观察,我作出以下推论:-

  1. 在第一个历元期间,图像以8个批次从HDD加载到RAM(batch_size=8),一旦加载了一个批次,CPU就会对该批次执行数据扩充,并将扩充的批次发送到GPU进行训练。现在,当验证阶段到来时,由于不需要对验证数据执行数据扩充,CPU可以直接将该批图像从RAM传递到GPU,而无需任何预处理。这样,开销就减少了,磁盘、CPU和GPU三者都以更高的速度工作,因此在一个时代结束时,它们的使用率都会更高

然而,有几件事我无法理解:-

  1. 在Keras AppApplications页面中,VGG19的内存占用量(549MB)是最大的,我不明白它怎么会继续消耗大约6.5GB的VRAM
  2. 为什么所有模型在加载时都使用相同数量的VRAM,尽管它们在大小(总层数和内存占用)上有很大差异

以下是一些代码片段:-

train_datagen = ImageDataGenerator(rotation_range = 30,
                                   width_shift_range = 0.4,
                                   height_shift_range = 0.4,
                                   shear_range = 0.4,
                                   zoom_range = 0.25,
                                   horizontal_flip = True,
                                   brightness_range = [0.5, 1.5],
                                   preprocessing_function = preprocess_input) 

valid_datagen = ImageDataGenerator(preprocessing_function = preprocess_input)

train_generator = train_datagen.flow_from_dataframe(train_data,
                                                    directory = 'train/',
                                                    x_col = 'Photo',
                                                    y_col = 'Class',
                                                    target_size = (299,299),
                                                    class_mode = 'binary',
                                                    seed = 42,
                                                    batch_size = 8)

validation_generator = valid_datagen.flow_from_dataframe(valid_data,
                                                    directory = 'train/',
                                                    x_col = 'Photo',
                                                    y_col = 'Class',
                                                    target_size = (299,299),
                                                    class_mode = 'binary',
                                                    seed = 42,
                                                    batch_size = 8)

inception_resnet_v2 = InceptionResNetV2(include_top = False,
                                    weights = 'imagenet',
                                    input_shape = (299, 299, 3),
                                    pooling = 'avg',
                                    classes = 2)
inception_resnet_v2.trainable = False

out = Dense(1, activation = 'sigmoid')(inception_resnet_v2.output)

model = Model(inputs = inception_resnet_v2.inputs, outputs = out)

checkpoint = ModelCheckpoint('model.h5',
                             monitor = 'val_accuracy',
                             verbose = 0,
                             save_best_only = True,
                             save_weights_only = False, 
                             mode = 'max',
                             period = 1)

optim = tf.keras.optimizers.Adam(lr = 0.0001)
model.compile(optimizer = optim, loss = 'binary_crossentropy', metrics = ['accuracy'])

hist = model.fit_generator(train_generator,
                           steps_per_epoch = len(train_generator),
                           epochs = 10,
                           callbacks = [checkpoint],
                           validation_data = validation_generator,
                           verbose = 1,
                           validation_steps = len(validation_generator),
                           validation_freq = 1)

如果有人能回答我的问题,并指出我的推论是正确的还是错误的,我将不胜感激。

谢谢

共有1个答案

赫连正初
2023-03-14

默认情况下,TensorFlow映射进程可见的所有GPU(受CUDA_VISIBLE_设备限制)的几乎所有GPU内存。

您可以使用,

import tensorflow as tf
from keras import backend as k

config = tf.ConfigProto() # TensorFlow wizardry
config.gpu_options.allow_growth = True # Don't pre-allocate memory; allocate as-needed
config.gpu_options.per_process_gpu_memory_fraction = 0.95 # Only allow a total fraction the GPU memory to be allocated
k.tensorflow_backend.set_session(tf.Session(config=config)) # Create a session with the above options specified.

您还可以查看此以获取更多信息:https://www.tensorflow.org/guide/gpu

 类似资料:
  • 译者:bat67 最新版会在译者仓库首先同步。 目前为止,我们以及看到了如何定义网络,计算损失,并更新网络的权重。 现在可能会想, 数据呢? 通常来说,当必须处理图像、文本、音频或视频数据时,可以使用python标准库将数据加载到numpy数组里。然后将这个数组转化成torch.*Tensor。 对于图片,有Pillow,OpenCV等包可以使用 对于音频,有scipy和librosa等包可以使用

  • 当我在容器tensorflow/tensorflow:LastGPU中运行tensorflow映像训练作业时,它不工作。 错误消息: GPU info: nvidia-smi周一11月26 07:48:59 2018 ----------------------------------------------------------------------------- | NVIDIA-SMI

  • 我试图用下面的代码训练模型,但我一直在方法上收到错误,它告诉我将更改为。为什么?

  • 简介 使用弱分类器的增强级联包括两个主要阶段:训练阶段和检测阶段。对象检测教程中介绍了使用基于HAAR或LBP模型的检测阶段。本文档概述了训练自己的弱分类器的级联所需的功能。当前指南将逐步完成所有不同阶段:收集训练数据,准备训练数据并执行实际模型训练。 为了支持本教程,将使用几个官方的OpenCV应用程序:opencv_createsamples,opencv_annotation,opencv_

  • 本文向大家介绍scikit-learn 使用交叉验证训练分类器,包括了scikit-learn 使用交叉验证训练分类器的使用技巧和注意事项,需要的朋友参考一下 示例 使用虹膜数据集: 数据分为训练集和测试集。要做到这一点,我们使用train_test_split效用函数来分割双方X和y(数据和目标矢量)用随机选择train_size=0.75(训练集包含数据的75%)。 训练数据集被输入到k最近邻

  • 我正在开发一个朴素的贝叶斯分类器使用简单的词袋概念。我的问题是,在朴素贝叶斯或任何其他机器学习中,senario'训练‘分类器是一个重要的问题。但是当我已经有了一个不同类别的词包时,如何训练朴素贝叶斯分类器呢?