anaconda 使用 及 tensorflow-gpu 安裝


Anaconda簡易使用

創建新環境

conda create -n rcnn python=3.6

刪除環境

conda remove -n rcnn --all

進入環境

conda activate tf

離開環境

source deactivate rcnn

重命名環境

conda 其實沒有重命名指令,實現重命名是通過 clone 完成的,分兩步:

  • 先 clone 一份 new name 的環境
  • 刪除 old name 的環境

比如,想把環境 rcnn 重命名成 tf

第1步

conda create -n tf --clone rcnn
Source:      /anaconda3/envs/rcnn
Destination: /anaconda3/envs/tf
Packages: 37
Files: 8463

第2步

conda remove -n rcnn --all

結果

conda info -e
# conda environments:
#
crawl                    /anaconda3/envs/crawl
flask                    /anaconda3/envs/flask
tf                       /anaconda3/envs/tf
root                  *  /anaconda3

安裝jupyter

conda install notebook
conda insatll jupyter

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郵箱注冊了一個賬號

終於順利下載

下載完了也很懵逼

壓縮包里面是長這樣的:

img

使用這樣的東西已經完全超出了我的能力范圍了呀,怎么辦

於是乎又百度,原來是放在CUDA的安裝目錄下呀。。。。

好的安裝好了,聽度娘說可以用安裝目錄\extras\demo_suite下的bandwidthTest.exe和deviceQuery.exe來檢測

檢測出來好像沒什么問題

img

(圖片中用了pause暫停來查看的)

然后環境搭載完成,到了萬眾矚目的安裝環節

pip install tensorflow-gpu

當然是需要卸載之前的版本的tensorflow 的

20KB/s的高速下了不知道多久

反正最后是裝好了

大概是這樣的

img

看起來還不錯有沒有

但是運行一下吧

。。。。。。。

下面的錯誤我都不忍心看,紅了一片。。。。。

(畫面太過血腥,已被屏蔽)

然后繼續求助萬能的度娘

最后找到了這個帖子

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

效果拔群,最終安裝完成

img

如圖

(當時看到可把我激動慘了)


至此安裝完成


既然安裝了就來測試一下嘍,不測試的話顯得自己很撈

求助度娘找到了大佬寫的五層卷積神經網絡的代碼

Tensorflow對比AlexNet的CPU和GPU運算效率

為了簡便起見,就直接放經過我魔改的大佬的代碼

[復制代碼](javascript:void(0)😉

  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()

[復制代碼](javascript:void(0)😉

如果使用TensorFlow-GPU的話這個默認是用GPU運行的

GPU運行結果:

img

img

GPU使用率:

img

CPU使用率:

img

可以看出較為占用顯存

將上面代碼的6到7行注釋解除即為CPU運行

CPU運行結果:

img

img

CPU利用率:

img

我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運行效果可能會有大幅度提升;


免責聲明!

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



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