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)
其次需要對好版本號,不同的TensorFlow版本對應的CUDA驅動程序版本號也有所不同
然而這還不夠,還需要安裝CUDNN才能完美運行,CUDNN的版本號和CUDA的版本號也要對好
但是下載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運算效率
為了簡便起見,就直接放經過我魔改的大佬的代碼
[](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運行結果:
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運行效果可能會有大幅度提升;