在对相同模型的集合进行并行训练时,我遇到了以下错误:
如果我在不同的终端中运行两个(或更多)训练过程,最终除了一个(没有特定的顺序或时间)之外的所有训练过程将开始输出像......这样的行...
Epoch 46/10000
0s - loss: 3.8659 - sig_eq: 0.5004
Epoch 47/10000
0s - loss: 3.1350 - sig_eq: 0.4060
Epoch 48/10000
0s - loss: 0.0000e+00 - sig_eq: 0.0000e+00
Epoch 49/10000
0s - loss: 0.0000e+00 - sig_eq: 0.0000e+00
Epoch 50/10000
0s - loss: 0.0000e+00 - sig_eq: 0.0000e+00
Epoch 51/10000
0s - loss: 0.0000e+00 - sig_eq: 0.0000e+00
Epoch 52/10000
0s - loss: 0.0000e+00 - sig_eq: 0.0000e+00
......其中一人将继续正常工作。我应该强调,只启动1个进程时永远不会。
感谢nvidia-smi
我知道,当它发生时, CUDA UNKNOWN_ERROR 上升,但培训似乎仍在继续。
最初,当我在多个gpus上使用自定义多处理队列/池组合进行集合训练时,我遇到了这种行为,但事实证明即使在单个gpu多处理上也可以重现,后来甚至使用多个终端也是操作系统。
我在2台不同的Linux PC上遇到过这个问题:
1: Arch, Nvidia GTX 970, CUDA 8.0, CUDNN 5.1/6.0 2: Ubuntu 16.04 LTS, Nvidia GTX 1080, CUDA 8.0, CUDNN 6.0
使用带有Tensorflow-GPU 1.2.1 / 1.3后端的Keras 2.0.3 / 2.0.6测试了两者。
重现此问题的代码段位于
之下import tensorflow as tf
import numpy as np
from keras.models import Model
from keras.layers import (Input, Dense, Conv2D, Flatten)
from keras.initializers import RandomNormal
def expg_loss(y_true, y_pred):
abval = tf.abs(y_pred - y_true)
num_values = np.prod(y_pred.get_shape().as_list()[1:])
return tf.where(
abval > 0.0, tf.exp(-1.0 / abval), tf.zeros_like(abval)
) * num_values
def sig_eq(y_true, y_pred):
values = tf.cast(tf.equal(
tf.cast(tf.sign(y_true), tf.float32),
tf.cast(tf.sign(y_pred), tf.float32)
), tf.float32)
return tf.reduce_mean(values)
if __name__ == '__main__':
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
with tf.Session(config=config).as_default():
inputs = Input(shape = [1, 86, 1])
conv1 = Conv2D(
filters = 2,
kernel_size = (1, 1),
activation = 'tanh',
use_bias = False,
kernel_initializer = RandomNormal(stddev = 1.0),
name = 'pre'
)(inputs)
flatten = Flatten()(conv1)
fc1 = Dense(
units = 11,
activation = 'tanh',
use_bias = False,
kernel_initializer = RandomNormal(stddev = 0.5),
name = 'final'
)(flatten)
model = Model(inputs = inputs, outputs = fc1)
model.compile(
loss = expg_loss,
optimizer = 'sgd',
metrics = [sig_eq]
)
X_train = np.random.uniform(size=[30000, 1, 86, 1], high=100)
y_train = np.random.uniform(size=[30000, 11], low=-1.98, high=1.98)
model.fit(
x = X_train,
y = y_train,
batch_size = 256,
epochs = 10000,
verbose = 2
)
可能值得注意以下几点:
我会很高兴得到任何意见,因为我有点想法。