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


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM