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

Tensorflow GPU在使用tf.keras模型训练时随机冻结,tensorflow,keras,nvidia,freeze,tensorflow2.0,Tensorflow,Keras,Nvidia,Freeze,Tensorflow2.0,正在使用的版本: 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对任何模型进行训练时,GPU将在一个纪元内随机冻结,GPU的功耗将降至70W左右,内核使用率为0,内存使用率也固定在某个随机值。当这种情况发生时,我也不会得到任何错误或异常。恢复的唯一方法是重新启动jupyte

正在使用的版本: 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对任何模型进行训练时,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)

从densenet导入densenet
从tensorflow.keras.dataset导入cifar100
导入tensorflow作为tf
从TQM导入TQM_笔记本作为TQM
#数据在训练集和测试集之间混合和分割
(X_列,y_列),(X_测试,y_测试)=cifar100.加载数据(标签模式为“精细”)
num_classes=100
y_测试\原始=y_测试
#将类向量转换为二进制类矩阵。[一个热编码]
y_train=tf.keras.utils.to_categorical(y_train,num_classes)
y_测试=tf.keras.utils.to_分类(y_测试,num_类)
X_-train=X_-train.astype('float32')
X_test=X_test.astype('float32')
对于范围(3)中的i:
平均值=np.平均值(X_列[:,:,:,i])
std=np.std(X_列[:,:,:,i])
X_序列[:,:,:,i]=(X_序列[:,:,:,i]-平均值)/std
X_检验[:,:,:,i]=(X_检验[:,:,:,i]-平均值)/std
使用tf.device('/gpu:0'):
模型=DenseNet(输入\u形状=(32,32,3),密集\u块=3,密集\u层=-1,增长率=12,nb\u类=100,辍学率=0.2,
瓶颈=True,压缩=0.5,重量衰减=1e-4,深度=100)
优化器=tf.keras.optimizers.SGD(学习率=0.01,
动量=0.9,
内斯特罗夫=真,
姓名(新加坡元)
compile(损失='categorical_crossentropy',优化器=优化器,度量=['accurity'])
def调度程序(历元):
如果历元<151:
返回0.01
elif epoch<251:
返回0.001
elif epoch<301:
返回0.0001
callback=tf.keras.callbacks.LearningRateScheduler(调度器)
模型拟合(X_序列,y_序列,验证数据=(X_检验,y_检验),历代=300,详细=2)
PS:我甚至在我的笔记本电脑上试用了这个代码,它有一个i7-8750h和一个带有32GB和970 EVO NVME的RTX 2060。不幸的是,我有同样的问题,GPU冻结


有人知道问题是什么吗?

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

也可能是您正在使用gpu重新定位。尝试在cpu上执行以下操作:

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

parallel_model = multi_gpu_model(model, gpus=4)

然后,您可以使用
parallel\u model
进行训练等等。

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

也可能是您正在使用gpu重新定位。尝试在cpu上执行以下操作:

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

parallel_model = multi_gpu_model(model, gpus=4)

然后你可以使用并行模式来训练等等。

所以我想发布一个更新。GPU同步和GPU冻结问题终于解决了。下面是我做的事情。我不知道是哪一个修复了它,或者他们是否都参与了修复:

  • DDU GPU驱动程序并重新安装库存CUDA v10驱动程序
  • 更新主板BIOS
  • 使用下面的代码

  • 所以我想发布一个更新。GPU同步和GPU冻结问题终于解决了。下面是我做的事情。我不知道是哪一个修复了它,或者他们是否都参与了修复:

  • DDU GPU驱动程序并重新安装库存CUDA v10驱动程序
  • 更新主板BIOS
  • 使用下面的代码

  • 没有什么特别的问题会让我大惊小怪,但这些系统可能相当微妙。您是否尝试过使用TensorFlow 1.14而不是2等更旧、可能更稳定的组件版本?或者你需要使用所有东西的最新版本吗?我实际上在这个领域进行研究,因为我不得不在不同的层次上处理很多权重。我可以用TF1.14,我已经试过1.15了。TF1.15的问题是,我的重量修改代码在旧版本中运行的时间非常长。但是,如果我找不到修复程序,我将不得不回滚到较旧的版本。什么是densenet?它只是一个架构。没有什么特别的问题需要我解决,但这些系统可能非常微妙。您是否尝试过使用TensorFlow 1.14而不是2等更旧、可能更稳定的组件版本?或者你需要使用所有东西的最新版本吗?我实际上在这个领域进行研究,因为我不得不在不同的层次上处理很多权重。我可以用TF1.14,我已经试过1.15了。TF1.15的问题是,我的重量修改代码在旧版本中运行的时间非常长。但是如果我找不到修复程序,我将不得不回滚到旧版本。什么是densenet?它只是一个体系结构。我不确定你所说的GPU重新定位是什么意思,但我已经尝试了使用和不使用“tf.device('/GPU:0'):”这两种方法。另外,我正在运行SGD optimizer,所以我应该在多gpu模型中使用gpu=1吗?PS:我现在已经降到了1.15,正在进行训练。等着看问题是否再次出现,如果出现,我将降级到1.14。这就是我的意思。另外,我的意思是CPU而不是GPU,请尝试使用(/CPU:0)进行
    ,因此我将报告更改。看起来这个问题在1.15中仍然存在,只是比2.0更为罕见。我现在将降级到1.14以测试它。我建议安装,以便您可以测试easi