1. 程式人生 > >TensorFlow GPU版本的安裝與調試

TensorFlow GPU版本的安裝與調試

enc develop lis 加載 eve ret 求助 還需要 padding

筆者采用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版本的安裝與調試