Keras / Tensorflow未使用所有CPU核心

时间:2018-03-02 17:59:53

标签: tensorflow keras

我有一个非常简单的培训和验证脚本。我使用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...')

1 个答案:

答案 0 :(得分:1)

您不能同时使用CPU和GPU。当您使用GPU进行计算时,您的CPU没有进行实际计算,它只是为GPU内核执行簿记工作。而且为了进行簿记,CPU不必使用所有核心(单核就足够了)。

我的GPU在训练期间也没有达到最大化。但是,在验证过程中它会得到充分利用。

这是因为在训练期间,您正在计算渐变并进行反向支撑,而不是大规模并行处理与简单的正向通过相比(您必须在每批前向通过后更新权重)。因此,那些无法充分利用GPU。但是在验证期间,您只计算正向通道,这就是为什么在验证期间GPU被充分利用。

如果增加batch_size,可能会获得更多的GPU利用率。