【问题标题】:Understanding the Hardware usage when training a Classifier on a GPU在 GPU 上训练分类器时了解硬件使用情况
【发布时间】:2020-01-16 04:40:51
【问题描述】:

我正在使用 TF 2.0GPU 上借助迁移学习训练猫狗分类器。我使用 Keras ImageDataGenerator 来执行数据增强。在训练模型时,我监控了 GPU、磁盘(HDD)和 CPU 的使用情况,并注意到以下几点:-

  1. 对于第一个 epoch,磁盘使用率是恒定的 20-25%。 然而,在 epoch 快结束时,在验证阶段,它会飙升至 40-50%。对于随后的 epochs,磁盘使用量为 奇怪的是
  2. CPU 利用率在整个 epoch 中为 ~60%,除了 达到 100% 时结束。
  3. 当我加载 任何 Keras 模型(如 VGG16、Xception、InceptionResNetV2 等)时,它们都占用了大约 6.5 gigs 的 VRAM。
  4. GPU 使用率几乎始终保持在恒定 29-30% 一个时期,预计在结束时达到 70%

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

  1. 在第一个 epoch 期间,图像从 HDD 加载到 RAM 中 批次 8(batch_size=8),并且一旦加载批次, CPU 对批次执行数据增强并将增强后的批次发送到 GPU 为了训练。现在,当验证阶段到来时,因为有 无需对验证数据执行数据扩充,CPU 可以直接将这批图像从 RAM 传递到 GPU,而无需任何 预处理。因此,减少了开销,所有 3 即, 磁盘、CPU 和 GPU 以更高的速度工作,因此在 所有这些都在一个纪元结束时发生。
  2. 对于随后的 epoch,由于所有图像(训练+验证) 已加载到 RAM 中,无需从 磁盘,因此磁盘使用率保持为零。

但是,有几件事我无法理解:-

  1. Keras Appplications Page 中,VGG19 的尺寸最大 内存占用量(549 MB),我不明白怎么能 这继续消耗大约 6.5 GB 的 VRAM?
  2. 为什么所有模型都占用相同数量的 VRAM 时 加载,即使它们在大小方面有很大不同(两者 总层数和内存占用)?

这里有几个sn-ps的代码:-

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)

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

谢谢。

【问题讨论】:

    标签: python tensorflow keras gpu cpu-usage


    【解决方案1】:

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

    你可以限制相同的使用,

    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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2021-01-21
      • 2018-08-28
      • 1970-01-01
      • 2022-06-23
      • 1970-01-01
      • 2018-01-16
      • 2020-07-08
      • 2020-06-18
      相关资源
      最近更新 更多