TensorFlow GPU版本的安裝與調試
筆者采用python3.6.7+TensorFlow1.12.0+CUDA10.0+CUDNN7.3.1構建環境
PC端配置為GTX 1050+Intel i7 7700HQ 4核心8線程@2.8GHZ
TensorFlow-gpu的安裝經歷實在是坎坷的很
首先顯卡一定要支持
沒想到的是GTX 1050TI,GTX 1070TI等主流顯卡竟然都不支持
(還好我買的是GTX 1050)
(並沒有暗示需要一塊TESLA)
點這裏查看CUDA支持列表
其次需要對好版本號,不同的TensorFlow版本對應的CUDA驅動程序版本號也有所不同
然而這還不夠,還需要安裝CUDNN才能完美運行,CUDNN的版本號和CUDA的版本號也要對好
CUDA離線版下載網址
CUDNN下載網址
但是下載CUDNN需要註冊NVIDIA賬號,那就點擊join註冊嘍
註冊的時候剛開始我使用了QQ郵箱,按道理這沒毛病
但是到了驗證郵箱一步又嗝屁了
你的驗證郵件呢,驗證郵件呢,郵件呢?????
經過百度多方查閱,原來不能用QQ郵箱
坑爹的是過了三個小時它又發過來了,沒錯,就是QQ郵箱,它發過來了。。。
不過我的163郵箱都註冊好了。。。。。
所以就使用163郵箱註冊了一個賬號
終於順利下載
下載完了也很懵逼
壓縮包裏面是長這樣的:
使用這樣的東西已經完全超出了我的能力範圍了呀,怎麽辦
於是乎又百度,原來是放在CUDA的安裝目錄下呀。。。。
好的安裝好了,聽度娘說可以用安裝目錄\extras\demo_suite下的bandwidthTest.exe和deviceQuery.exe來檢測
檢測出來好像沒什麽問題
(圖片中用了pause暫停來查看的)
然後環境搭載完成,到了萬眾矚目的安裝環節
pip install tensorflow-gpu
當然是需要卸載之前的版本的tensorflow 的
20KB/s的高速下了不知道多久
反正最後是裝好了
大概是這樣的
看起來還不錯有沒有
但是運行一下吧
。。。。。。。
下面的錯誤我都不忍心看,紅了一片。。。。。
(畫面太過血腥,已被屏蔽)
然後繼續求助萬能的度娘
最後找到了這個帖子
Win10 +VS2017+ python3.66 + CUDA10 + cuDNNv7.3.1 + tensorflow-gpu 1.12.0
你早說不支持CUDA10.0嘛,害的我費那麽大力
於是就看了下這個貼子裏面所附帶的大佬創作的安裝包
tensorflow_gpu-1.12.0-cp36-cp36m-win_amd64.whl
CUDA10.0+CUDNN7.3.1
然後又跑去重新安裝CUDNN7.3.1
再cd到安裝包目錄下
pip install tensorflow_gpu-1.12.0-cp36-cp36m-win_amd64.whl
效果拔群,最終安裝完成
如圖
(當時看到可把我激動慘了)
至此安裝完成
既然安裝了就來測試一下嘍,不測試的話顯得自己很撈
求助度娘找到了大佬寫的五層卷積神經網絡的代碼
Tensorflow對比AlexNet的CPU和GPU運算效率
為了簡便起見,就直接放經過我魔改的大佬的代碼
1 from datetime import datetime 2 import math 3 import time 4 import tensorflow as tf 5 import os 6 #os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID" 7 #os.environ["CUDA_VISIBLE_DEVICES"] = "-1" 8 batch_size = 32 9 num_batches = 100 10 # 該函數用來顯示網絡每一層的結構,展示tensor的尺寸 11 12 def print_activations(t): 13 print(t.op.name, ‘ ‘, t.get_shape().as_list()) 14 15 # with tf.name_scope(‘conv1‘) as scope # 可以將scope之內的variable自動命名為conv1/xxx,便於區分不同組件 16 17 def inference(images): 18 parameters = [] 19 # 第一個卷積層 20 with tf.name_scope(‘conv1‘) as scope: 21 # 卷積核、截斷正態分布 22 kernel = tf.Variable(tf.truncated_normal([11, 11, 3, 64], 23 dtype=tf.float32, stddev=1e-1), name=‘weights‘) 24 conv = tf.nn.conv2d(images, kernel, [1, 4, 4, 1], padding=‘SAME‘) 25 # 可訓練 26 biases = tf.Variable(tf.constant(0.0, shape=[64], dtype=tf.float32), trainable=True, name=‘biases‘) 27 bias = tf.nn.bias_add(conv, biases) 28 conv1 = tf.nn.relu(bias, name=scope) 29 print_activations(conv1) 30 parameters += [kernel, biases] 31 # 再加LRN和最大池化層,除了AlexNet,基本放棄了LRN,說是效果不明顯,還會減速? 32 lrn1 = tf.nn.lrn(conv1, 4, bias=1.0, alpha=0.001 / 9, beta=0.75, name=‘lrn1‘) 33 pool1 = tf.nn.max_pool(lrn1, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding=‘VALID‘, name=‘pool1‘) 34 print_activations(pool1) 35 # 第二個卷積層,只有部分參數不同 36 with tf.name_scope(‘conv2‘) as scope: 37 kernel = tf.Variable(tf.truncated_normal([5, 5, 64, 192], dtype=tf.float32, stddev=1e-1), name=‘weights‘) 38 conv = tf.nn.conv2d(pool1, kernel, [1, 1, 1, 1], padding=‘SAME‘) 39 biases = tf.Variable(tf.constant(0.0, shape=[192], dtype=tf.float32), trainable=True, name=‘biases‘) 40 bias = tf.nn.bias_add(conv, biases) 41 conv2 = tf.nn.relu(bias, name=scope) 42 parameters += [kernel, biases] 43 print_activations(conv2) 44 # 稍微處理一下 45 lrn2 = tf.nn.lrn(conv2, 4, bias=1.0, alpha=0.001 / 9, beta=0.75, name=‘lrn2‘) 46 pool2 = tf.nn.max_pool(lrn2, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding=‘VALID‘, name=‘pool2‘) 47 print_activations(pool2) 48 # 第三個 49 with tf.name_scope(‘conv3‘) as scope: 50 kernel = tf.Variable(tf.truncated_normal([3, 3, 192, 384], dtype=tf.float32, stddev=1e-1), name=‘weights‘) 51 conv = tf.nn.conv2d(pool2, kernel, [1, 1, 1, 1], padding=‘SAME‘) 52 biases = tf.Variable(tf.constant(0.0, shape=[384], dtype=tf.float32), trainable=True, name=‘biases‘) 53 bias = tf.nn.bias_add(conv, biases) 54 conv3 = tf.nn.relu(bias, name=scope) 55 parameters += [kernel, biases] 56 print_activations(conv3) 57 # 第四層 58 with tf.name_scope(‘conv4‘) as scope: 59 kernel = tf.Variable(tf.truncated_normal([3, 3, 384, 256], dtype=tf.float32, stddev=1e-1), name=‘weights‘) 60 conv = tf.nn.conv2d(conv3, kernel, [1, 1, 1, 1], padding=‘SAME‘) 61 biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32), trainable=True, name=‘biases‘) 62 bias = tf.nn.bias_add(conv, biases) 63 conv4 = tf.nn.relu(bias, name=scope) 64 parameters += [kernel, biases] 65 print_activations(conv4) 66 # 第五個 67 with tf.name_scope(‘conv5‘) as scope: 68 kernel = tf.Variable(tf.truncated_normal([3, 3, 256, 256], dtype=tf.float32, stddev=1e-1), name=‘weights‘) 69 conv = tf.nn.conv2d(conv4, kernel, [1, 1, 1, 1], padding=‘SAME‘) 70 biases = tf.Variable(tf.constant(0.0, shape=[256], dtype=tf.float32), trainable=True, name=‘biases‘) 71 bias = tf.nn.bias_add(conv, biases) 72 conv5 = tf.nn.relu(bias, name=scope) 73 parameters += [kernel, biases] 74 print_activations(conv5) 75 # 之後還有最大化池層 76 pool5 = tf.nn.max_pool(conv5, ksize=[1, 3, 3, 1], strides=[1, 2, 2, 1], padding=‘VALID‘, name=‘pool5‘) 77 print_activations(pool5) 78 return pool5, parameters 79 # 全連接層 80 # 評估每輪計算時間,第一個輸入是tf得Session,第二個是運算算子,第三個是測試名稱 81 # 頭幾輪有顯存加載,cache命中等問題,可以考慮只計算第10次以後的 82 def time_tensorflow_run(session, target, info_string): 83 num_steps_burn_in = 10 84 total_duration = 0.0 85 total_duration_squared = 0.0 86 # 進行num_batches+num_steps_burn_in次叠代 87 # 用time.time()記錄時間,熱身過後,開始顯示時間 88 for i in range(num_batches + num_steps_burn_in): 89 start_time = time.time() 90 _ = session.run(target) 91 duration = time.time() - start_time 92 if i >= num_steps_burn_in: 93 if not i % 10: 94 print(‘%s:step %d, duration = %.3f‘ % (datetime.now(), i - num_steps_burn_in, duration)) 95 total_duration += duration 96 total_duration_squared += duration * duration 97 # 計算每輪叠代品均耗時和標準差sd 98 mn = total_duration / num_batches 99 vr = total_duration_squared / num_batches - mn * mn 100 sd = math.sqrt(vr) 101 print(‘%s: %s across %d steps, %.3f +/- %.3f sec / batch‘ % (datetime.now(), info_string, num_batches, mn, sd)) 102 def run_benchmark(): 103 # 首先定義默認的Graph 104 with tf.Graph().as_default(): 105 # 並不實用ImageNet訓練,知識隨機計算耗時 106 image_size = 224 107 images = tf.Variable(tf.random_normal([batch_size, image_size, image_size, 3], dtype=tf.float32, stddev=1e-1)) 108 pool5, parameters = inference(images) 109 init = tf.global_variables_initializer() 110 sess = tf.Session(config=tf.ConfigProto(allow_soft_placement=True, log_device_placement=False)) 111 sess.run(init) 112 # 下面直接用pool5傳入訓練(沒有全連接層) 113 # 只是做做樣子,並不是真的計算 114 time_tensorflow_run(sess, pool5, "Forward") 115 # 瞎弄的,偽裝 116 objective = tf.nn.l2_loss(pool5) 117 grad = tf.gradients(objective, parameters) 118 time_tensorflow_run(sess, grad, "Forward-backward") 119 run_benchmark()
如果使用TensorFlow-GPU的話這個默認是用GPU運行的
GPU運行結果:
GPU使用率:
CPU使用率:
可以看出較為占用顯存
將上面代碼的6到7行註釋解除即為CPU運行
CPU運行結果:
CPU利用率:
我2.8GHZ的CPU都跑到3.4GHZ了
這麽對我的CPU真的好麽
測試結果:
正向GPU運行時間效率是CPU運行效率的8.42倍
反向GPU運行時間效率是CPU運行效率的12.50倍
並且GPU運行模式下GPU占用率僅僅只有大約65%,CPU占用率僅僅只有45%左右
而CPU運行模式下CPU占用率長時間到達100%,且效率低下
看出GPU能夠直接完爆CPU運行的
註意事項:
1.本次測試僅僅采用了卷積神經網絡進行運行,不代表所有情況下GPU一定有優勢;
2.鑒於CPU的瓶頸,可能CPU運行效率並不是非常理想,若采用更加高端的CPU運行效果可能會有大幅度提升;
3.僅代表作者個人觀點,希望各位大佬能夠評論或打賞哦。
2019-01-15 02:41:24 Author:Lance Yu
TensorFlow GPU版本的安裝與調試