7-10 MNIST Deep Learning GPU vs CPU 머신러닝 컴퓨팅 시간 비교

codingart(66)
Published in
#kr
Words
339
Reading
2 min
Listen
Play
7y

MNIST 딥러닝 예제에서 epoch를 늘리면 윈도우즈 10 PC에서 가슴이 답답할 정도로 대기해야 한다. 무료인 구글 Colabo의 GPU를 사용하면 85% 의 시간을 가속하여 불과 15% 시간으로 컴퓨팅이 완료된다. 6배 이상 빨라진다.

noname11.png

GPU 테스트했던 예제코드는 유튜브에서 우리말 머신러닝 강의를 올렸던 최고의 인기강사 Sung Kim의 Github에서 가져왔다. 한번 시험해 보기를 권한다.

첨부된 예제 코드는 복사하여 indentation이 무너졌는지 체크하여 실행해 보기 바란다. 코드 중에 하이퍼 파라메터인 trainning_epoch=30 으로 바꾸었음에 유의하자.

#lab-10-4-mnist-nn-deep.py
#Lab 10 MNIST and Deep learning
import tensorflow as tf
import random
import time
start_time = time.time()
#import matplotlib.pyplot as plt

from tensorflow.examples.tutorials.mnist import input_data

tf.set_random_seed(777) # reproducibility

mnist = input_data.read_data_sets("MNIST_data/", one_hot=True)
#Check out https://www.tensorflow.org/get_started/mnist/beginners for
#more information about the mnist dataset

#parameters
learning_rate = 0.001
training_epochs = 30
batch_size = 100

#input place holders
X = tf.placeholder(tf.float32, [None, 784])
Y = tf.placeholder(tf.float32, [None, 10])

#weights & bias for nn layers
#http://stackoverflow.com/questions/33640581/how-to-do-xavier-initialization-on-tensorflow
W1 = tf.get_variable("W1", shape=[784, 512],
initializer=tf.contrib.layers.xavier_initializer())
b1 = tf.Variable(tf.random_normal([512]))
L1 = tf.nn.relu(tf.matmul(X, W1) + b1)

W2 = tf.get_variable("W2", shape=[512, 512],
initializer=tf.contrib.layers.xavier_initializer())
b2 = tf.Variable(tf.random_normal([512]))
L2 = tf.nn.relu(tf.matmul(L1, W2) + b2)

W3 = tf.get_variable("W3", shape=[512, 512],
initializer=tf.contrib.layers.xavier_initializer())
b3 = tf.Variable(tf.random_normal([512]))
L3 = tf.nn.relu(tf.matmul(L2, W3) + b3)

W4 = tf.get_variable("W4", shape=[512, 512],
initializer=tf.contrib.layers.xavier_initializer())
b4 = tf.Variable(tf.random_normal([512]))
L4 = tf.nn.relu(tf.matmul(L3, W4) + b4)

W5 = tf.get_variable("W5", shape=[512, 10],
initializer=tf.contrib.layers.xavier_initializer())
b5 = tf.Variable(tf.random_normal([10]))
hypothesis = tf.matmul(L4, W5) + b5

#define cost/loss & optimizer
cost = tf.reduce_mean(tf.nn.softmax_cross_entropy_with_logits(
logits=hypothesis, labels=Y))
optimizer = tf.train.AdamOptimizer(learning_rate=learning_rate).minimize(cost)

#initialize
sess = tf.Session()
sess.run(tf.global_variables_initializer())

#train my model
for epoch in range(training_epochs):
avg_cost = 0
total_batch = int(mnist.train.num_examples / batch_size)

for i in range(total_batch):
    batch_xs, batch_ys = mnist.train.next_batch(batch_size)
    feed_dict = {X: batch_xs, Y: batch_ys}
    c, _ = sess.run([cost, optimizer], feed_dict=feed_dict)
    avg_cost += c / total_batch

print('Epoch:', '%04d' % (epoch + 1), 'cost =', '{:.9f}'.format(avg_cost))

print('Learning Finished!')

#Test model and check accuracy
correct_prediction = tf.equal(tf.argmax(hypothesis, 1), tf.argmax(Y, 1))
accuracy = tf.reduce_mean(tf.cast(correct_prediction, tf.float32))
print('Accuracy:', sess.run(accuracy, feed_dict={
X: mnist.test.images, Y: mnist.test.labels}))

#Get one and predict
r = random.randint(0, mnist.test.num_examples - 1)
print("Label: ", sess.run(tf.argmax(mnist.test.labels[r:r + 1], 1)))
print("Prediction: ", sess.run(
tf.argmax(hypothesis, 1), feed_dict={X: mnist.test.images[r:r + 1]}))

end_time = time.time()

print( "Completed in ", end_time - start_time , " seconds")