Tensorflow使用GPU加速


測試faster-rcnn時,cpu計算速度較慢,調整代碼改為gpu加速運算

  • 將 with tf.Session() as sess: 替換為
1 gpu_options = tf.GPUOptions(per_process_gpu_memory_fraction=0.9)
2 with tf.Session(config=tf.ConfigProto(gpu_options=gpu_options,log_device_placement=True),graph=detection_graph) as sess:
3     with tf.device("/gpu:0"):

之后出現顯存占滿、而GPU利用率為0的情況,經查閱官方文檔得知“在GPU上,tf.Variable操作只支持實數型(float16 float32 double)的參數。不支持整數型參數

CPU計算幾乎占滿,可見tensorflow的運行空間在顯存上,而計算實際是在cpu上執行的

用如下代碼可檢測tensorflow的能使用設備情況:

1 from tensorflow.python.client import device_lib
2 print(device_lib.list_local_devices()) 

Tensorflow程序可以通過tf.device函數來指定運行每一個操作的設備,這個設備可以是本地CPU或GPU,也可以是某一台遠程服務器。

tf.device函數可以通過設備的名稱來指定執行運算的設備。

如CPU在tensorflow中的名稱為/cpu:0。在默認情況下,即使機器有很多個CPU,tensorflow也不會區分它們,所有的CPU都使用/cpu:0作為名稱。
而一台機器上不同GPU的名稱是不同的,第n個GPU在tensorflow中的名稱為/gpu:n。
tensorflow提供了一個會計的方式來查看運行每一個運算的設備。在生成會話時,可以通過設置log_device_placement參數來打印運行每一個運算的設備。

1 import tensorflow as tf 
2 a=tf.constant([1.0,2.0,3.0],shape=[3],name='a')
3 b=tf.constant([1.0,2.0,3.0],shape=[3],name='b')
4 c=a+b
5 #通過log_device_placement參數來輸出運行每一個運算的設備
6 sess=tf.Session(config=tf.ConfigProto(log_device_placement=True))
7 print (sess.run(c))

在以上代碼中,tensorflow程序生成會話時加入了參數log_device_placement=True,所以程序會將運行每一個操作的設備輸出到屏幕。

在配置好GPU的環境中,如果操作沒有明確指定運行設備,那么tensorflow會優先選擇GPU。但是,盡管有4個GPU,在默認情況下,tensorflow只會將運算優先放到/gpu:0上。如果需要將某些運算放到不同的GPU或CPU上,就需要通過tf.device來手工指定。

1 import tensorflow as tf
2 
3 a=tf.Variable(0,name='a')
4 with tf.device('/gpu:0'):
5     b=tf.Variable(0,name='b')
6 #通過allow_soft_placement參數自動將無法放在GPU上的操作放回CPU上
7 sess=tf.Session(config=tf.ConfigProto(allow_soft_placement=True,log_device_placement=True))
8 sess.run(tf.initialize_all_variables()

在以上代碼中可以看到生成常量a和b的操作被加載到CPU上,而加法操作被放到第二個GPU上。在tensorflow中,不是所有的操作都可以被放在GPU上,如果強行將無法放在GPU上的操作指定到GPU上,程序就會報錯。
在GPU上,tf.Variable操作只支持實數型(float16 float32 double)的參數。不支持整數型參數。tensorflow在生成會話時可以指定allow_soft_placement參數。當這個參數設置為True時,如果運算無法由GPU執行,那么tensorflow會自動將它放到CPU上執行。

改進方式未完待續......

ref:https://blog.csdn.net/VioletHan7/article/details/82769531


免責聲明!

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



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