大家跑深度學習進行科研的時候,單機的算力往往無法支持我們進行例如圖神經網路、強化學習網路等復雜模型的訓練任務,所以常常需要使用服務器的GPU來訓練模型,但是多人共用的服務器該如何避免沖突呢?這里給出一段常用的代碼可以方便大家在查看NVIDIA 顯卡GPU的使用情況之后,合理的切換gpu來預防沖突,同時本文還介紹了如何降低模型顯存消耗的辦法,主要針對Tensorflow框架,
如何在多個GPU間進行選擇
如圖1所示,就是同時有兩塊兒NVIDIA顯卡可用的情況,(如何查看請參考我的另一篇文章):【科研分享】監控服務器GPU、CPU和記憶體使用情況的方法(Windows和Liunix環境)_JinyuZ1996的博客-CSDN博客 最近在實驗程序中發現,其實本來不太消耗資源的任務,由于Tensorflow的反人類默認設計也經常會直接獨占一整塊兒GPU的資源,而且獨占那么多資源也還是一樣的速度,沒什么效率,然后去搜索了一下,找到了一些在用服務器跑代碼的時候的小技巧和解決方案,給在這里用于自查:實時監控資源動態 大家的服務器一般都是Liunix系統較多,所以在這里普及一個常用的命令可以方便大家實時的查看GPU使用情況,防止互相占用的問題發生:watch -n 1 nvidia-smi 其中,-n后面的1是重繪速率https://blog.csdn.net/qq_39381654/article/details/115957538
其中,可以觀察到gpu_num的編號為0和1,那么通常為了避免沖突,我們選擇空閑的那一塊兒來進行使用(如圖所示卡0目前正在被使用,此時正準備跑實驗的我們應該選擇適用卡1),則只需要輸入代碼:
os.environ['CUDA_VISIBLE_DEVICES'] = '0'
該行代碼后面的編號為幾就是用第幾號卡,如果該編號下的GPU資源耗盡或編號越界情況的話,則會回傳找不到device的log.到時候再進行調整就行了,建議跑代碼的時候掛一個watch,隨時觀察GPU的占用情況,
如何節約GPU顯存占用
Tensorflow默認會讓一個任務占用整個GPU的所有顯存資源,但事實上算上筆者的強化學習專案,也不會占用那么多資源,舉例來說,筆者的卡有24G顯存,本質只需要其中301M,但每次跑代碼上來就先把23.9G申請下來留著用,這是非常浪費的,而且效率也沒有任何提升,于是通過查找,我在大佬博客里發現了一種可以動態調整GPU消耗的方法:
config = tf.ConfigProto()
config.gpu_options.allow_growth = True
如果上述方法無效,也可以寫作:
gpu_options = tf.GPUOptions(allow_growth=True)
config = tf.ConfigProto(gpu_options=gpu_options)
當我們配置好了這個Config的時候還需要將它應用到Tensorflow中去,需要在Sess執行的時候加入Config,例如:
with tf.Session(config=config) as sess:
但其實動態分配GPU顯存也有其本身的弊端,它的策略不再是上來就申請獨占,而是剛一開始先分配少量的GPU顯存給任務,然后按需慢慢的增加,由于不會釋放記憶體,所以會導致碎片顯存占用的產生,也就是說在你的Task結束前,被占用的顯存都不會釋放,而如果卡內其他空間已經被其他人占用了,你的任務卻還需要更多的顯存時,你的task會因為顯存不足而shut.
筆者也是站在巨人的肩膀上學習,有其他識訓會在此補充,隨時更新,
轉載請註明出處,本文鏈接:https://www.uj5u.com/qita/344081.html
標籤:AI
上一篇:opencv 最大內接矩形筆記
