同时运行多个流程时,Keras培训死亡

时间:2017-09-27 11:24:04

标签: python tensorflow keras

在对相同模型的集合进行并行训练时,我遇到了以下错误:
如果我在不同的终端中运行两个(或更多)训练过程,最终除了一个(没有特定的顺序或时间)之外的所有训练过程将开始输出像......这样的行...

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
        )

可能值得注意以下几点:

  • 在中止旧训练后开始新的训练过程时,错误可能会更快地再现;
  • 如果没有使用卷积层,我就无法遇到错误(cudnn,难道你是小恶魔吗?);
  • 我尝试延迟启动第二个进程(谁知道,也许是同步张量流初始化导致它) - 错误仍然存​​在;
  • 我尝试了python 2.7和3.6。

我会很高兴得到任何意见,因为我有点想法。

0 个答案:

没有答案