2017-07-02 20 views
0

私はコピー&ペーストいくつかの変更をhereから使用していたプログラム。tensorflow深いmnist例では、CPU VS GPUを使用して

Extracting MNIST_data/train-images-idx3-ubyte.gz 
Extracting MNIST_data/train-labels-idx1-ubyte.gz 
Extracting MNIST_data/t10k-images-idx3-ubyte.gz 
Extracting MNIST_data/t10k-labels-idx1-ubyte.gz 
step 0, training accuracy 0.22 
step 100, training accuracy 0.76 
step 200, training accuracy 0.88 
... 

問題は、チュートリアルに元のコードにかかる時間(すなわち:次の出力を生成し

from tensorflow.examples.tutorials.mnist import input_data 
mnist = input_data.read_data_sets('MNIST_data', one_hot=True) 

import tensorflow as tf 

x = tf.placeholder(tf.float32, shape=[None, 784]) 
y_ = tf.placeholder(tf.float32, shape=[None, 10]) 
W = tf.Variable(tf.zeros([784,10])) 
b = tf.Variable(tf.zeros([10])) 

def weight_variable(shape): 
    initial = tf.truncated_normal(shape, stddev=0.1) 
    return tf.Variable(initial) 

def bias_variable(shape): 
    initial = tf.constant(0.1, shape=shape) 
    return tf.Variable(initial) 

def conv2d(x, W): 
    return tf.nn.conv2d(x, W, strides=[1, 1, 1, 1], padding='SAME') 

def max_pool_2x2(x): 
    return tf.nn.max_pool(x, ksize=[1, 2, 2, 1], 
         strides=[1, 2, 2, 1], padding='SAME') 

with tf.device('/gpu:0'): 
    W_conv1 = weight_variable([5, 5, 1, 32]) 
    b_conv1 = bias_variable([32]) 
    x_image = tf.reshape(x, [-1, 28, 28, 1]) 
    h_conv1 = tf.nn.relu(conv2d(x_image, W_conv1) + b_conv1) 
    h_pool1 = max_pool_2x2(h_conv1) 

    W_conv2 = weight_variable([5, 5, 32, 64]) 
    b_conv2 = bias_variable([64]) 

    h_conv2 = tf.nn.relu(conv2d(h_pool1, W_conv2) + b_conv2) 
    h_pool2 = max_pool_2x2(h_conv2) 

    W_fc1 = weight_variable([7 * 7 * 64, 1024]) 
    b_fc1 = bias_variable([1024]) 

    h_pool2_flat = tf.reshape(h_pool2, [-1, 7*7*64]) 
    h_fc1 = tf.nn.relu(tf.matmul(h_pool2_flat, W_fc1) + b_fc1) 

    keep_prob = tf.placeholder(tf.float32) 
    h_fc1_drop = tf.nn.dropout(h_fc1, keep_prob) 

    W_fc2 = weight_variable([1024, 10]) 
    b_fc2 = bias_variable([10]) 

    y_conv = tf.matmul(h_fc1_drop, W_fc2) + b_fc2 

    cross_entropy = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(labels=y_, logits=y_conv)) 
    train_step = tf.train.AdamOptimizer(1e-4).minimize(cross_entropy) 
    correct_prediction = tf.equal(tf.argmax(y_conv, 1), tf.argmax(y_, 1)) 
    accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32)) 

    with tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=True)) as sess: 
    sess.run(tf.global_variables_initializer()) 
    for i in range(20000): 
     batch = mnist.train.next_batch(50) 
     if i % 100 == 0: 
     train_accuracy = accuracy.eval(feed_dict={ 
      x: batch[0], y_: batch[1], keep_prob: 1.0}) 
     print('step %d, training accuracy %g' % (i, train_accuracy)) 
     train_step.run(feed_dict={x: batch[0], y_: batch[1], keep_prob: 0.5}) 

    print('test accuracy %g' % accuracy.eval(feed_dict={ 
     x: mnist.test.images, y_: mnist.test.labels, keep_prob: 1.0})) 

:これは訓練の速度を高めるための試みと私のコードですtf.deviceと(「:0/GPU」):なしライン26)と、このコードに測定可能な差ステップ毎(約10秒)を有していません。私はcuda-8.0とcuDNNを正常にインストールしました(何時間も失敗した後)。 「$のNVIDIA-SMI」は、以下の出力を返します:

Sun Jul 2 13:57:10 2017  
+-----------------------------------------------------------------------------+ 
| NVIDIA-SMI 375.26     Driver Version: 375.26     | 
|-------------------------------+----------------------+----------------------+ 
| GPU Name  Persistence-M| Bus-Id  Disp.A | Volatile Uncorr. ECC | 
| Fan Temp Perf Pwr:Usage/Cap|   Memory-Usage | GPU-Util Compute M. | 
|===============================+======================+======================| 
| 0 GeForce GT 710  Off | 0000:01:00.0  N/A |     N/A | 
| N/A 49C P0 N/A/N/A | 406MiB/2000MiB |  N/A  Default | 
+-------------------------------+----------------------+----------------------+ 


+-----------------------------------------------------------------------------+ 
| Processes:              GPU Memory | 
| GPU  PID Type Process name        Usage  | 
|=============================================================================| 
| 0     Not Supported           | 
+-----------------------------------------------------------------------------+ 

そこで質問です:

1)CPUやGPUを選ぶ際には差を生成しないためには小さすぎる作品ですか? 2)私の実装にいくつかばかげたミスがありますか?全体の質問を読んため

感謝。

+1

それは単に利用可能な場合、GPUがデフォルトで使用されることを意味します。違いを測定するためにCPUを明示的に使用する必要があります。 – user1735003

+0

ありがとう@ user1735003。私はあなたが提案したものを試しました(CPUをgpuに置き換えました)。その結果、各ステップは5秒長くなりました。それは速くなければなりません、そうですか?また、元のコードをウェブサイトからコピーして上記のコードと比較すると、目に見える違いはありませんでした。なぜか教えてくれますか? – Roofi

答えて

0

あなたがエラーなしでこのコードを実行することができるという事実は、TensorFlowは間違いなくGPUで実行できることを示唆しています。ここでの問題は、TensorFlowをそのまま実行すると、デフォルトでGPUで実行しようとすることです。 CPU上で実行するにはいくつかの方法があります。

  1. この方法で実行します。CUDA_VISIBLE_DEVICES= python code.py。あなたがこれを行うと、まだwith tf.device('/gpu:0')を持っている場合、それが壊れるので、それを削除することに注意してください。質問から
  2. 変更with tf.device('/gpu:0')

with tf.device('/cpu:0')へEDITコメント

でConfigProtoに何を意味するかallow_soft_placementlog_device_placementの詳細については、hereを参照してください。

+0

わかりません@jkschinに申し訳ありませんが、「config = tf.ConfigProto(allow_soft_placement = True、log_device_placement = True)」とは言わない場合でも、「デフォルトではTensorFlowはGPU上で実行しようとしています。セッションのかっこ内にある。 – Roofi

+0

これらのパラメータは、GPUで実行するかどうかには影響しません。 forの[here](https://stackoverflow.com/questions/44873273/what-do-the-options-in-configproto-like-allow-soft-placement-and-log-device-plac/44873274#44873274)を参照してください。詳しくは。 – jkschin

+0

最後のコメントを回答に追加してください(将来のgooglersのために)@jkschin – Roofi

関連する問題