2017-03-13 12 views
1

私は画像分類のためのおもちゃモデルを作りました。プログラムは、cifar10 tutorialのように緩やかに構成されています。トレーニングはうまく始まりますが、結局プログラムがクラッシュします。私は、どこかのオペレーションが追加されたときのためにグラフを完成させました。そして、テンソルボードでそれは素晴らしいように見えますが、最終的には凍結し、強制的に再起動します(または最終的な再起動を待つ)。出口はGPUメモリ問題のように見えるが、モデルは小さく、フィットしなければならない。もし私がGPUメモリ(別の4GBを与える)を割り当てると、クラッシュします。このテンソルフローコードがクラッシュするのはなぜですか?

データは256x256x3の画像で、ラベルはtfrecordsファイルに保存されています。トレーニング機能コードは次のようになります。

def loss(logits, labels): 
    xentropy = tf.nn.sparse_softmax_cross_entropy_with_logits(labels=labels, logits=logits, name='cross_entropy_per_example') 
    xentropy_mean = tf.reduce_mean(xentropy, name='cross_entropy') 
    tf.add_to_collection('losses', xentropy_mean) 
    return xentropy_mean 

def training(loss, global_step, learning_rate): 
    optimizer = tf.train.AdamOptimizer(learning_rate) 
    train_op = optimizer.minimize(loss, global_step=global_step) 
    return train_op 

バッチは

def distorted_inputs(batch_size): 
    filename_queue = tf.train.string_input_producer(
     ['data/train.tfrecords'], num_epochs=None) 
    reader = tf.TFRecordReader() 
    _, serialized_example = reader.read(filename_queue) 
    features = tf.parse_single_example(serialized_example, 
     features={'label': tf.FixedLenFeature([], tf.int64), 
        'image': tf.FixedLenFeature([], tf.string)}) 
    label = features['label'] 
    label = tf.cast(label, tf.int32) 
    image = tf.decode_raw(features['image'], tf.uint8) 
    image = (tf.cast(image, tf.float32)/255) - 0.5 
    image = tf.reshape(image, shape=[256, 256, 3]) 
    # data augmentation 
    image = tf.image.random_flip_up_down(image) 
    image = tf.image.random_flip_left_right(image) 
    print('filling the queue with {} images ' \ 
      'before starting to train'.format(MIN_QUEUE_EXAMPLES)) 
    return _generate_batch(image, label, MIN_QUEUE_EXAMPLES, BATCH_SIZE) 

で生成されます。

def train(): 
    with tf.Graph().as_default(): 
     global_step = tf.contrib.framework.get_or_create_global_step() 
     train_images_batch, train_labels_batch = distorted_inputs(batch_size=BATCH_SIZE) 
     train_logits = inference(train_images_batch) 
     train_batch_loss = loss(train_logits, train_labels_batch) 
     train_op = training(train_batch_loss, global_step, 0.1) 

     merged = tf.summary.merge_all() 
     saver = tf.train.Saver(tf.global_variables()) 
     gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.75) 
     sess_config=tf.ConfigProto(gpu_options=gpu_options) 
     sess = tf.Session(config=sess_config) 
     train_summary_writer = tf.summary.FileWriter(
     os.path.join(ROOT, 'logs', 'train'), sess.graph) 
     init = tf.global_variables_initializer() 

     sess.run(init) 
     coord = tf.train.Coordinator() 
     threads = tf.train.start_queue_runners(sess=sess, coord=coord) 

     tf.Graph().finalize() 
     for i in range(5540): 
      start_time = time.time() 
      summary, _, batch_loss = sess.run([merged, train_op, train_batch_loss]) 
      duration = time.time() - start_time 
      train_summary_writer.add_summary(summary, i) 
      if i % 10 == 0: 
       msg = 'batch: {} loss: {:.6f} time: {:.8} sec/batch'.format(
       i, batch_loss, str(time.time() - start_time)) 
       print(msg) 
     coord.request_stop() 
     coord.join(threads) 
     sess.close() 

損失とトレーニングopはそれぞれcross_entropyとアダム・オプティマイザです

def _generate_batch(image, label, 
        min_queue_examples=MIN_QUEUE_EXAMPLES, 
        batch_size=BATCH_SIZE): 
    images_batch, labels_batch = tf.train.shuffle_batch(
     [image, label], batch_size=batch_size, 
     num_threads=12, capacity=min_queue_examples + 3 * BATCH_SIZE, 
     min_after_dequeue=min_queue_examples) 
    tf.summary.image('images', images_batch) 
    return images_batch, labels_batch 

私は何が欠けていますか?

+0

あなたは何を求めているのですか...うまくいかないのですか? – rmeertens

+0

Windowsを実行している場合、windbgにクラッシュダンプをロードして、どのモジュールが故障しているかを確認できます。 –

+0

プログラムは私のマシンをフリーズするまで、通常は800回以上繰り返した後に実行されます(バッチサイズ64または128は問題ありません)。だから、私は(GPU)のメモリリーク(RAMの使用率は全体的に安定している)と思われますが、どこに問題があるのか​​分かりません。 AFAIK以来、テンソルフロープログラムの実行中/実行中に詳細なGPUメモリ使用情報を取得する方法はありません。テンソルフローの経験がある人が自分のコードで犯人であると思っていますか?私はまだグラフモデルに少し慣れていません。役に立ったら、私はTesla k40でUbuntu 16.04、tf 1.0.0、python 3.5を実行しています。 –

答えて

1

私はこれを解決しました。それが他の人にとって有益な場合のためのソリューションです。 TL、DR:ハードウェアの問題です。

具体的には、PCIeバスエラーです。これは、最も多くの投票番号hereと同じエラーです。これは、メッセージで通知された割り込みがPLXスイッチと互換性がないために発生する可能性があります(hereなど)。また、そのスレッドでは、問題を解決し、カーネルパラメータpci=nommconfを設定してmsiを無効にします。

Tensorflow、Torch、Theanoの間では、tfはこの問題を引き起こす唯一の深い学習フレームワークです。なぜ、わからないのですか?

関連する問題