【发布时间】:2020-01-16 04:40:51
【问题描述】:
我正在使用 TF 2.0 在 GPU 上借助迁移学习训练猫狗分类器。我使用 Keras ImageDataGenerator 来执行数据增强。在训练模型时,我监控了 GPU、磁盘(HDD)和 CPU 的使用情况,并注意到以下几点:-
- 对于第一个 epoch,磁盘使用率是恒定的 20-25%。 然而,在 epoch 快结束时,在验证阶段,它会飙升至 40-50%。对于随后的 epochs,磁盘使用量为 奇怪的是零。
- CPU 利用率在整个 epoch 中为 ~60%,除了 达到 100% 时结束。
- 当我加载 任何 Keras 模型(如 VGG16、Xception、InceptionResNetV2 等)时,它们都占用了大约 6.5 gigs 的 VRAM。
- GPU 使用率几乎始终保持在恒定 29-30% 一个时期,预计在结束时达到 70%。
根据这些观察,我做出以下推论:-
- 在第一个 epoch 期间,图像从 HDD 加载到 RAM 中 批次 8(batch_size=8),并且一旦加载批次, CPU 对批次执行数据增强并将增强后的批次发送到 GPU 为了训练。现在,当验证阶段到来时,因为有 无需对验证数据执行数据扩充,CPU 可以直接将这批图像从 RAM 传递到 GPU,而无需任何 预处理。因此,减少了开销,所有 3 即, 磁盘、CPU 和 GPU 以更高的速度工作,因此在 所有这些都在一个纪元结束时发生。
- 对于随后的 epoch,由于所有图像(训练+验证) 已加载到 RAM 中,无需从 磁盘,因此磁盘使用率保持为零。
但是,有几件事我无法理解:-
- 在Keras Appplications Page 中,VGG19 的尺寸最大 内存占用量(549 MB),我不明白怎么能 这继续消耗大约 6.5 GB 的 VRAM?
- 为什么所有模型都占用相同数量的 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