Keras / Tensorflow不使用所有CPU内核

问题描述 投票:0回答:1

我有一个相当简单的培训和验证脚本。我正在使用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...')
tensorflow keras
1个回答
1
投票

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

我的GPU在培训期间也没有达到最大化。但是,它在验证期间得到了充分利用。

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

虽然增加batch_size可能会获得更多的GPU利用率。

© www.soinside.com 2019 - 2024. All rights reserved.