【Ubuntu-Tensorflow】GPU設置及顯存資源分配

最近筆者在做GPU顯存資源分配的研究,發現在tf中gpu一些實用的方法和接口,共享出來,供大家參考學習,如有問題,歡迎留言討論。

1.運行程序時,控制檯設置GPU運行參數,佔用顯存全部資源

$ CUDA_VISIBLE_DEVICES=0 python predict.py # 只使用gpu:0設備運行predict.py程序。
這裏寫圖片描述

$ CUDA_VISIBLE_DEVICES=1 python predict.py # 只使用gpu:1設備運行predict.py程序。
這裏寫圖片描述

$ CUDA_VISIBLE_DEVICES=0,1 python predict.py # 只使用gpu:0,1設備運行predict.py程序。
這裏寫圖片描述

【PS】2017/8/23
注意: CUDA_VISIBLE_DEVICES=0,1 是存在設備的優先級的,[0,1]和[1,0]排列的設備是不同的,排在前面的設備優先級高,運行程序的時候會優先使用。如[0,1]則先使用0號設備的gpu資源,[1,0]則先試用1號設備的gpu資源

以上三個指令運行predict.py程序,都會佔用GPU顯存的全部資源。

2.在tensorflow代碼中with tf.device(‘/gpu:x’)

在tensorflow代碼中with tf.device(‘/gpu:0’)
在tensorflow代碼中with tf.device(‘/gpu:1’)
在tensorflow代碼中with tf.device(‘/gpu:0,1’)

上面三種設定效果與1中控制檯輸入CUDA_VISIABLE_DEVICES=x 的效果相同,運行程序,都會佔用全部資源

3.在程序中,設置GPU設備的環境變量

os.environ[“CUDA_DEVICE_ORDER”] = “PCI_BUS_ID” # 按照PCI_BUS_ID順序從0開始排列GPU設備
os.environ[“CUDA_VISIBLE_DEVICES”] = “0” #設置當前使用的GPU設備僅爲0號設備
os.environ[“CUDA_VISIBLE_DEVICES”] = “1” #設置當前使用的GPU設備僅爲1號設備
os.environ[“CUDA_VISIBLE_DEVICES”] = “0,1” #設置當前使用的GPU設備爲0,1號兩個設備

設定的效果與1和2相同。

4.session初始化時設定GPU_Config

gpuConfig = tf.ConfigProto()
gpuConfig.allow_soft_placement = config.getboolean(‘gpu’, ‘allow_soft_placement’)#設置爲True,當GPU不存在或者程序中出現GPU不能運行的代碼時,自動切換到CPU運行
【PS】2017/8/24
GPU切換CPU的條件
1.運算無法在GPU上執行
2.沒有GPU資源(指定GPU device num 錯誤)
3.運算輸入包含對CPU計算結果的引用
gpuConfig.gpu_options.allow_growth = config.getboolean(‘gpu’, ‘allow_growth’)#設置爲True,程序運行時,會根據程序所需GPU顯存情況,分配最小的資源
gpuConfig.gpu_options.per_process_gpu_memory_fraction = config.getfloat(‘gpu’, ‘rate’)#程序運行的時,所需的GPU顯存資源最大不允許超過rate的設定值

【PS】當allow_growth和per_process_gpu_memory_fraction 同時設定的時候,兩者爲或的關係

GPU_config = utils.GPU_config()

sess = tf.Session(config=GPU_config) #設定一個自定義GPU配置的session

【PS】上面的自定義GPU_config只會指定GPU內存分配情況,而不會選定GPU具體的device_id,而如何指定GPU device_id還是要使用1,2,3指出的方法

下面給出一個採用CUDA_VISIBLE_DEVICES=0,1兩個gpu設備運行一段程序的顯存佔用情況,從下面這個運行結果來看,按照per_process_gpu_memory_fraction 自動佔用最小分配顯存的情況運行程序,兩個GPU的資源並不是均勻分配,0號設備佔用資源較多.
這裏寫圖片描述
圖1 CUDA_VISIBLE_DEVICES=0,1 python predict.py

下面給出一個採用CUDA_VISIBLE_DEVICES=1,0兩個gpu設備運行一段程序的顯存佔用情況,從下面這個運行結果來看,按照per_process_gpu_memory_fraction 自動佔用最小分配顯存的情況運行程序,兩個GPU的資源並不是均勻分配,1號設備佔用資源較多.

這裏寫圖片描述
圖2 CUDA_VISIBLE_DEVICES=1,0 python predict.py

以上兩幅圖反映了,根據gpu設備號的排列,存在使用的優先級問題,排在前面的優先級較高。

如果認真觀察在運行程序的時候的兩個gpu顯存的變化,就會發現,程序運行其實只佔用了優先級較高的設備了,這是因爲1個gpu設備已經滿足程序運行的需要了,而對於第二個設備也佔用了顯存資源,仔細發現,你能夠看到,兩個gpu在程序進行初始化的,並未進行session run的時候,出現顯存佔用情況,切優先級較低的設備在後續的程序運行過程中,顯存佔有並未增加。

參考博客:tensorflow gpu使用說明

發佈了61 篇原創文章 · 獲贊 88 · 訪問量 25萬+
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章