1. 程式人生 > >【Ubuntu-Tensorflow】GPU設定及視訊記憶體資源分配

【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的時候,出現視訊記憶體佔用情況,切優先順序較低的裝置在後續的程式執行過程中,視訊記憶體佔有並未增加。