摘要:html
1.以動態圖形式計算一個簡單的加法後端
2.cpu和gpu計算力比較(包括如何指定cpu和gpu)app
3.關於gpu版本的tensorflow安裝問題,能夠參考另外一篇博文:https://www.cnblogs.com/liuhuacai/p/11684666.htmldom
正文:函數
1.在tensorflow中計算3.+4.測試
##1.建立輸入張量 a = tf.constant(2.) b = tf.constant(4.) ##2.計算結果 print('a+b=',a+b)
輸出:a+b= tf.Tensor(7.0, shape=(), dtype=float32)spa
總結:20版本在加法實現過程當中簡單了很多,所見即所得。(1.x的實現過程相對複雜)聽說動態的實現也是後端轉化成靜態圖實現的。code
2.cpu和gpu計算力比較orm
說明:經過計算不一樣大小的矩陣乘法,得到計算時間。htm
1.指定cpu或gpu經過 with tf.device('/cpu:0'):或 with tf.device('/gpu:0'):指定,在須要加速的操做前添加便可(此處生成隨機 數和矩陣乘法都加速)
2.統計計算時間的函數timeit.timeit須要導入import timeit【timeit.timeit(需計時的函數或語句,計算次數)】
3.計算量的大小與cpu和gpu計算時間的關係,計算量經過改變矩陣大小實現
import tensorflow as tf import timeit 以矩陣A[10,n]和矩陣B[n,10]的乘法運算(分別在cpu和gpu上運行)來測試, ''' with tf.device('/cpu:0'): ##指定操做用cpu計算 cpu_a = tf.random.normal([10,n]) ##生成符合高斯分佈的隨機數矩陣,經過改變n大小,增減計算量 cpu_b = tf.random.normal([n,10]) print(cpu_a.device,cpu_b.device) with tf.device('/gpu:0'): gpu_a = tf.random.normal([100n]) gpu_b = tf.random.normal([n,10]) print(gpu_a.device,gpu_b.device) def cpu_run(): with tf.device('/cpu:0'): ##矩陣乘法,此操做採用cpu計算 c = tf.matmul(cpu_a,cpu_b) return c def gpu_run(): with tf.device('/gpu:0'): ##矩陣乘法,此操做採用gpu計算 c = tf.matmul(gpu_a,gpu_b) return c ##第一次計算須要熱身,避免將初始化時間計算在內 cpu_time = timeit.timeit(cpu_run,number=10) gpu_time = timeit.timeit(gpu_run,number=10) print('warmup:',cpu_time,gpu_time) ##正式計算10次,取平均值 cpu_time = timeit.timeit(cpu_run,number=10) gpu_time = timeit.timeit(gpu_run,number=10) print('run_time:',cpu_time,gpu_time)
經過改變矩陣大小,增長矩陣乘法的計算量:計算結果以下
結論:1.在計算量較小的狀況下,cpu的計算速度比gpu計算速度快,可是都是微量級別的差別
2.隨着計算量的增長,cpu的計算時間逐步增長,而gpu的計算時間相對平緩,在計算量達到必定程度以後,gpu的優點就出來了。
實現過程的完整代碼:
import tensorflow as tf import timeit import matplotlib.pyplot as plt ''' 以矩陣A[10,n]和矩陣B[n,10]的乘法運算(分別在cpu和gpu上運行)來測試, ''' def cpu_gpu_compare(n): with tf.device('/cpu:0'): ##指定操做用cpu計算 cpu_a = tf.random.normal([10,n]) ##生成符合高斯分佈的隨機數矩陣,經過改變n大小,增減計算量 cpu_b = tf.random.normal([n,10]) print(cpu_a.device,cpu_b.device) with tf.device('/gpu:0'): gpu_a = tf.random.normal([10,n]) gpu_b = tf.random.normal([n,10]) print(gpu_a.device,gpu_b.device) def cpu_run(): with tf.device('/cpu:0'): ##矩陣乘法,此操做採用cpu計算 c = tf.matmul(cpu_a,cpu_b) return c def gpu_run(): with tf.device('/gpu:0'): ##矩陣乘法,此操做採用gpu計算 c = tf.matmul(gpu_a,gpu_b) return c ##第一次計算須要熱身,避免將初始化時間計算在內 cpu_time = timeit.timeit(cpu_run,number=10) gpu_time = timeit.timeit(gpu_run,number=10) print('warmup:',cpu_time,gpu_time) ##正式計算10次,取平均值 cpu_time = timeit.timeit(cpu_run,number=10) gpu_time = timeit.timeit(gpu_run,number=10) print('run_time:',cpu_time,gpu_time) return cpu_time,gpu_time n_list1 = range(1,2000,5) n_list2 = range(2001,10000,100) n_list = list(n_list1)+list(n_list2) time_cpu =[] time_gpu =[] for n in n_list: t=cpu_gpu_compare(n) time_cpu.append(t[0]) time_gpu.append(t[1]) plt.plot(n_list,time_cpu,color = 'red',label='cpu') plt.plot(n_list,time_gpu,color='green',linewidth=1.0,linestyle='--',label='gpu') plt.ylabel('耗時',fontproperties = 'SimHei',fontsize = 20) plt.xlabel('計算量',fontproperties = 'SimHei',fontsize = 20) plt.title('cpu和gpu計算力比較',fontproperties = 'SimHei',fontsize = 30) plt.legend(loc='upper right') plt.show()