GPU зависает случайным образом во время тренировок с использованием моделей tf.keras - PullRequest
1 голос
/ 01 декабря 2019

Используемые версии :ensorflow-GPU: 2.0, CUDA v10, CuDNN v7.6.5, Python 3.7.4

Системные характеристики: i9-7920X, 4 x RTX 2080Ti, 128 ГБ 2400 МГц RAM, 2 ТБ SATA SSD

Проблема:

Во время обучения любой модели, использующей tenorflow 2.0, случайным образом в течение эпохи графический процессор будет зависать, а энергопотребление графического процессора упадет примерно до 70 Вт, а использование ядра - 0 ииспользование памяти также зафиксировано на некотором случайном значении. Я также не получаю никакой ошибки или исключения, когда это происходит. Единственный способ восстановить это перезапустить ядро ​​jupyter и запустить его с самого начала. Сначала я подумал, что, возможно, что-то не так с моим кодом. Поэтому я решил, что попытаюсь повторить проблему во время обучения Densenet на Cifar100, и проблема не исчезнет.

Если я запустил обучение на нескольких графических процессорах, то и графические процессоры зависнут, но это происходит очень редко. Но с одним GPU гарантированно застрянет в тот или иной момент.

Ниже приведен код, используемый для обучения Cifar100

from densenet import DenseNet
from tensorflow.keras.datasets import cifar100
import tensorflow as tf
from tqdm import tqdm_notebook as tqdm

# the data, shuffled and split between train and test sets
(X_train, y_train), (X_test, y_test) = cifar100.load_data(label_mode='fine')
num_classes = 100
y_test_original = y_test

# Convert class vectors to binary class matrices. [one hot encoding]
y_train = tf.keras.utils.to_categorical(y_train, num_classes)
y_test = tf.keras.utils.to_categorical(y_test, num_classes)

X_train = X_train.astype('float32')
X_test = X_test.astype('float32')

for i in range(3):
    mean = np.mean(X_train[:,:,:,i])
    std = np.std(X_train[:,:,:,i])
    X_train[:,:,:,i] = (X_train[:,:,:,i] - mean)/std
    X_test[:,:,:,i] = (X_test[:,:,:,i] - mean)/std


with tf.device('/gpu:0'):  
    model = DenseNet(input_shape=(32,32,3), dense_blocks=3, dense_layers=-1, growth_rate=12, nb_classes=100, dropout_rate=0.2,
             bottleneck=True, compression=0.5, weight_decay=1e-4, depth=100)


optimizer = tf.keras.optimizers.SGD(learning_rate=0.01, 
                                    momentum=0.9, 
                                    nesterov=True,
                                    name='SGD')
model.compile(loss = 'categorical_crossentropy', optimizer = optimizer, metrics = ['accuracy'])

def scheduler(epoch):
    if epoch < 151:
        return 0.01
    elif epoch < 251:
        return 0.001
    elif epoch < 301:
        return 0.0001

callback = tf.keras.callbacks.LearningRateScheduler(scheduler)

model.fit(X_train, y_train, validation_data=(X_test, y_test), epochs=300, verbose = 2)

PS: я даже пробовал код на своемноутбук с i7-8750h и RTX 2060 с 32 ГБ и 970 EVO NVME. К сожалению, у меня была такая же проблема с зависанием графического процессора.

Кто-нибудь знает, в чем проблема?

Ответы [ 2 ]

0 голосов
/ 12 декабря 2019

Так что я хотел опубликовать обновление по этому вопросу. Проблемы с синхронизацией и зависанием графического процессора наконец-то исчезли. Ниже приведены вещи, которые я сделал. Я не знаю, какой из них исправил или все они внесли свой вклад в исправление:

  1. Драйверы графического процессора DDU и переустановите стандартные драйверы CUDA v10.
  2. Обновление BIOS материнской платы
  3. используйте следующий фрагмент кода.
configproto = tf.compat.v1.ConfigProto() 
configproto.gpu_options.allow_growth = True
sess = tf.compat.v1.Session(config=configproto) 
tf.compat.v1.keras.backend.set_session(sess)
0 голосов
/ 01 декабря 2019

Это может быть связано с версиями пакетов, попробуйте перейти на тензор потока 1.14.

Возможно также, что вы используете перемещение gpu. Попробуйте сделать это на процессоре, например:

 with tf.device('/cpu:0'):
    model = DenseNet(....)

parallel_model = multi_gpu_model(model, gpus=4)

, затем вы можете использовать parallel_model для обучения и т. Д.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...