使用 tf.keras 模型训练时 GPU 随机冻结

Posted

技术标签:

【中文标题】使用 tf.keras 模型训练时 GPU 随机冻结【英文标题】:GPU freezes randomly while training using tf.keras models 【发布时间】:2020-03-26 08:37:43 【问题描述】:

正在使用的版本: tensorflow-gpu:2.0,CUDA v10,CuDNN v7.6.5,Python 3.7.4

系统规格: i9-7920X, 4 x RTX 2080Ti, 128GB 2400MHz RAM, 2TB SATA SSD

问题:

在使用 tensorflow 2.0 训练任何模型时,在一个 epoch 期间随机地,GPU 将冻结,GPU 的功耗将下降到 70W 左右,核心使用量为 0,内存利用率也固定为某个随机值。发生这种情况时,我也没有收到任何错误或异常。恢复的唯一方法是重新启动 jupyter 内核并从头开始运行。 我首先认为我的代码可能有问题。所以我想我会在 Cifar100 上训练 Densenet 时尝试复制这个问题,但问题仍然存在。

如果我在多个 GPU 上运行训练,那么 GPU 也会冻结,但这种情况很少发生。但是对于单 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 和配备 32GB 和 970 EVO NVME 的 RTX 2060 的笔记本电脑上尝试了代码。不幸的是,我遇到了同样的 GPU 冻结问题。

有谁知道问题出在哪里?

【问题讨论】:

没有什么特别令我大惊小怪的问题,但这些系统可能非常微妙。您是否尝试过任何组件的旧版本、可能更稳定的版本,例如使用 TensorFlow 1.14 而不是 2?还是您需要使用所有内容的最新版本? 我实际上是在这个领域进行研究,因为我不得不在不同的层中处理很多权重。我可以使用 tf 1.14 并且我已经尝试过 1.15。 tf 1.15 的问题是我的权重修改代码在旧版本中运行需要非常长的时间。但如果我找不到修复程序,我将不得不回滚到旧版本。 什么是densenet 它只是一个model 架构。 【参考方案1】:

可能与包版本有关,请尝试降级到tensorflow 1.14。

也可能是您正在使用 gpu 重定位。尝试在 cpu 上使用它:

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

parallel_model = multi_gpu_model(model, gpus=4)

那么你可以使用parallel_model进行训练等等。

【讨论】:

我不确定你所说的 GPU 重定位是什么意思,但我已经尝试过使用和不使用“with tf.device('/gpu:0'):”。另外,我正在运行 SGD 优化器,所以我应该只在 multi_gpu_model 中使用 gpus = 1 吗? PS:我目前已经降级到 1.15 并运行培训。等着看问题是否再次出现,如果再次出现,我将降级到 1.14。 this 就是我的意思。另外我的意思是 CPU 不是 GPU,试试with(/cpu:0) 所以我报告了这些变化。看起来这个问题在 1.15 中仍然存在,只是它比 2.0 更罕见。我现在将降级到 1.14 来测试它。 我推荐安装docker,这样您就可以轻松测试不同的软件版本和系统。由于您使用的是 nvidia gpus 和 tensorflow,我推荐 nvidia containers 这应该可以满足您的需求 用 CPU 试过了。不工作。到了这个时候还真是一头雾水。我还尝试在 4 个不同的 GPU 上运行 4 个不同的模型。这开始随机抛出 GPU Sync Failure。事件日志查看器说这是一个 nvlddmkm 错误。所以我只是对驱动程序进行了 DDU 并再次新安装了 cuda v10 库存驱动程序。刚刚再次开始训练这些模型。我想我会发现驱动程序安装是否解决了问题(我之前尝试过重新安装驱动程序(虽然没有 DDU)。【参考方案2】:

所以我想发布关于此的更新。 GPU 同步和 GPU 冻结问题终于消失了。以下是我做的事情。我不知道是哪一个修复了它,或者他们是否都为修复做出了贡献:

    DDU GPU 驱动程序并重新安装库存 CUDA v10 驱动程序。 更新主板 Bios 使用以下代码。
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)

【讨论】:

以上是关于使用 tf.keras 模型训练时 GPU 随机冻结的主要内容,如果未能解决你的问题,请参考以下文章

如何在 Tensorflow 2.0 + Keras 中进行并行 GPU 推理?

Model.fit()是否将整个训练数据集上传到GPU?

使用基本的低级 TensorFlow 训练循环训练 tf.keras 模型不起作用

JSONDecodeError:加载 tf.Keras 模型时的期望值

使用 tf.keras.Model.fit 进行训练时如何将自定义摘要添加到 tensorboard

了解tf.keras中模型训练验证的相关方法