我有一个相当简单的培训和验证脚本。我正在使用tensorflow-gpu
,我可以看到使用GPU:0
。但是,python
进程本身似乎只使用了一个核心,利用率只有90%左右。我的GPU在培训期间也没有达到最大化。但是,它在验证期间得到了充分利用。
我想知道使用单核是否会阻止GPU被更多地利用。有没有办法使用更多的CPU核心?我已经尝试过设置config.intra_op_parallelism_threads = 4
,但仍然只使用一个核心。
这是我的脚本:
import model
from keras.optimizers import SGD
from keras.callbacks import EarlyStopping, ModelCheckpoint
from keras.preprocessing.image import ImageDataGenerator
from visual_callbacks import AccLossPlotter
import numpy as np
def main():
np.random.seed(45)
nb_class = 2
width, height = 224, 224
sn = model.SqueezeNet(nb_classes=nb_class, inputs=(3, height, width))
print('Build model')
sgd = SGD(lr=0.001, decay=0.0002, momentum=0.9, nesterov=True)
sn.compile(
optimizer=sgd, loss='categorical_crossentropy', metrics=['accuracy'])
print(sn.summary())
# Training
train_data_dir = 'data/train'
validation_data_dir = 'data/validation'
nb_train_samples = 2000
nb_validation_samples = 800
nb_epoch = 500
# Generator
train_datagen = ImageDataGenerator(
rescale=1./255,
shear_range=0.2,
zoom_range=0.2,
horizontal_flip=True)
#train_datagen = ImageDataGenerator(rescale=1./255)
test_datagen = ImageDataGenerator(rescale=1./255)
train_generator = train_datagen.flow_from_directory(
train_data_dir,
target_size=(width, height),
batch_size=32,
class_mode='categorical')
validation_generator = test_datagen.flow_from_directory(
validation_data_dir,
target_size=(width, height),
batch_size=32,
class_mode='categorical')
# Instantiate AccLossPlotter to visualise training
plotter = AccLossPlotter(graphs=['acc', 'loss'], save_graph=True)
early_stopping = EarlyStopping(monitor='val_loss', patience=3, verbose=0)
checkpoint = ModelCheckpoint(
'weights.{epoch:02d}-{val_loss:.2f}.h5',
monitor='val_loss',
verbose=0,
save_best_only=True,
save_weights_only=True,
mode='min',
period=1)
sn.fit_generator(
train_generator,
samples_per_epoch=nb_train_samples,
nb_epoch=nb_epoch,
validation_data=validation_generator,
nb_val_samples=nb_validation_samples,
callbacks=[plotter, checkpoint])
sn.save_weights('weights.h5')
if __name__ == '__main__':
main()
input('Press ENTER to exit...')
您不能同时使用CPU和GPU。当您使用GPU进行计算时,您的CPU没有进行实际计算,它只是为GPU内核执行簿记工作。而对于簿记,CPU不必使用所有核心(单核就足够了)。
我的GPU在培训期间也没有达到最大化。但是,它在验证期间得到了充分利用。
这是因为在训练期间,您正在计算渐变并进行反向支撑,而不是大规模并行过程与简单的正向传递相比(您必须在每次批次前向传递后更新权重)。因此,那些无法充分利用GPU。但在验证过程中,您只计算正向传递,这就是为什么在验证期间GPU被充分利用的原因。
虽然增加batch_size可能会获得更多的GPU利用率。