2016-08-16 15 views
0

Iは(テスラK-80 GPU上で)上に2つのFC層と6層CNNを実行するための次のコードを使用しています。 どういうわけか、それはメモリ全体の10ギガバイトを消費し、私はBATCH_SIZEを削減して、実行できることを知っているmemory.Iのうち、死亡したが、私はまた、次のコードで間違っ15または20 CNNのlayers.Whatsを実行すると、それはすべての時間がかかる理由想い出?どのように私は15層CNNのコードを実行する必要があります。Tensorflow:6層CNN:OOM(10GbのGPUメモリを使用)

コード:

import model 


with tf.Graph().as_default() as g_train: 
    filenames = tf.train.match_filenames_once(FLAGS.train_dir+'*.tfrecords') 
    filename_queue = tf.train.string_input_producer(filenames, shuffle=True, num_epochs=FLAGS.num_epochs) 
    feats,labels = get_batch_input(filename_queue, batch_size=FLAGS.batch_size) 
    ### feats size=(batch_size, 100, 50) 
    logits = model.inference(feats, FLAGS.batch_size) 
    loss = model.loss(logits, labels, feats) 
    tvars = tf.trainable_variables() 
    global_step = tf.Variable(0, name='global_step', trainable=False) 
    # Add to the Graph operations that train the model. 
    train_op = model.training(loss, tvars, global_step, FLAGS.learning_rate, FLAGS.clip_gradients) 
    # Add the Op to compare the logits to the labels during evaluation. 
    eval_correct = model.evaluation(logits, labels, feats) 
    summary_op = tf.merge_all_summaries() 
    saver = tf.train.Saver(tf.all_variables(), max_to_keep=15) 

    # The op for initializing the variables. 
    init_op = tf.initialize_all_variables() 

    sess = tf.Session() 
    sess.run(init_op) 

    summary_writer = tf.train.SummaryWriter(FLAGS.model_dir, 
             graph=sess.graph) 

    # Start input enqueue threads. 
    coord = tf.train.Coordinator() 
    threads = tf.train.start_queue_runners(sess=sess, coord=coord) 
    try: 
     step = 0 
     while not coord.should_stop(): 
      _, loss_value = sess.run([train_op, loss]) 

      if step % 100 == 0: 
       print('Step %d: loss = %.2f (%.3f sec)' % (step, loss_value)) 
       # Update the events file. 
       summary_str = sess.run(summary_op) 
       summary_writer.add_summary(summary_str, step) 

      if (step == 0) or (step + 1) % 1000 == 0 or (step + 1) == FLAGS.max_steps: 
       ckpt_model = os.path.join(FLAGS.model_dir, 'model.ckpt') 
       saver.save(sess, ckpt_model, global_step=step) 
       #saver.save(sess, FLAGS.model_dir, global_step=step) 

     step += 1 
    except tf.errors.OutOfRangeError: 
     print('Done training for %d epochs, %d steps.' % (FLAGS.num_epochs, step)) 
    finally: 
     coord.join(threads) 
     sess.close() 

###################### File model.py #################### 
def conv2d(x, W, b, strides=1): 
    # Conv2D wrapper, with bias and relu activation 
    x = tf.nn.conv2d(x, W, strides=[1, strides, strides, 1],  
      padding='SAME') 
    x = tf.nn.bias_add(x, b) 
    return tf.nn.relu(x) 

def maxpool2d(x, k=2,s=2): 
    # MaxPool2D wrapper 
    return tf.nn.max_pool(x, ksize=[1, k, k, 1], strides=[1, s, 
    s,1],padding='SAME') 


def inference(feats,batch_size): 
    #feats size (batch_size,100,50,1) #batch_size=256 
    conv1_w=tf.get_variable("conv1_w",   [filter_size,filter_size,1,256],initializer=tf.uniform_unit_scaling_initializer()) 
    conv1_b=tf.get_variable("conv1_b",[256]) 
    conv1 = conv2d(feats, conv1_w, conv1_b,2) 
    conv1 = maxpool2d(conv1, k=2,s=2) 

    ### This was replicated for 6 layers and the 2 FC connected layers are added 

    return logits 

def training(loss, train_vars, global_step, learning_rate, clip_gradients): 
    # Add a scalar summary for the snapshot loss. 
    tf.scalar_summary(loss.op.name, loss) 
    grads, _ = tf.clip_by_global_norm(tf.gradients(loss, train_vars,aggregation_method=1), clip_gradients) 
    optimizer = tf.train.AdamOptimizer(learning_rate) 
    train_op = optimizer.apply_gradients(zip(grads, train_vars), global_step=global_step) 
    return train_op 

答えて

0

私はモデルのpythonライブラリが何であるか、あまりにもわかりません。それはあなたが書いた何かがあるとオプティマイザの設定を変更することができる場合、私はaggeragetion_methodがADD_Nあるデフォルトでは、私自身のコード

train_step = tf.train.AdamOptimizer(learning_rate).minimize(cost, aggregation_method = tf.AggregationMethod.EXPERIMENTAL_ACCUMULATE_N) 

に使用しますが、あなたはそれを変更した場合EXPERIMENTAL_ACCUMULATE_Nまたはこの意志をEXPERIMENTAL_TREEするには、次のように示唆しています大幅にメモリを節約します。これらのプログラムのメインメモリは、勾配を計算できるようにすべてのニューロンで出力値を保存する必要があります。 aggregation_methodを変更すると、私の経験から多くの助けになります。

はまた、ところで、私はあなたのコードに何か問題があるとは思いません。私は小さなコビーネットでも記憶を使い切ることができます。

+0

pointer.Itためのおかげで、私は私の6層CNN.Butを実行するのに役立ちます私はまた、2層LSTMCellとどの私はこのトリックを適用dynamic_rnn.If使用して別のモデルを持って、私は次のエラーhttpsを持っている:// githubのを。 com/tensorflow/tensorflow/issues/3220を参照してください。あなたはdynamic_rnnでこのトリックを使う方法を知っていますか?助けてくれてありがとう。 – Pulkit

+1

これは既知のバグです。手動でRNNを展開するか、EXPIRMENTAL_TREEを使用するか – chasep255

関連する問題