實驗室有多個大佬同時共用多台伺服器,每個伺服器上有若干塊GPU顯卡,經常在一台伺服器上搭好環境,調好代碼,準備跑程序,發現GPU卡已經全被被佔了。將環境和代碼移植到另一台伺服器,完成後發現也沒有GPU卡可用。請問在實驗室如何優雅的搶佔GPU顯卡?


最近不得不實踐了,因為想把顯卡空餘的時間浪費降到最低。貼一下代碼吧。

import pynvml
import os
pynvml.nvmlInit()
# 這裡的0是GPU id
handle = pynvml.nvmlDeviceGetHandleByIndex(0)
ratio = 1024**2
while 1:
meminfo = pynvml.nvmlDeviceGetMemoryInfo(handle)
total = meminfo.total/ratio#以兆M為單位就需要除以1024**2
used = meminfo.used/ratio
free = meminfo.free/ratio
print("total: ", total)
print("used: ", used)
print("free: ", free)
if used &< total/8: print("start") os.system(python train.py) print("finish") break


沒有實踐過,但提供一個思路。

首先,了解一下screen命令,這個可以達到終端關閉,命令依然可以運行的效果。

其次,學會寫一個shell文件或者Python文件,在screen里運行,包含循環判斷顯卡佔用率以及運行自己的訓練文件功能。

最後,添加邏輯,一旦顯卡空缺,則運行你想要的命令。

有三點需要注意:

第一,可以不用判斷顯卡使用情況,直接while循環你的命令,但不優雅。

第二,最好顯卡空缺長達二十分鐘再使用,以防他人短時間內還要再用。

第三,以上方法沒有相互協商好,相互體量來的優雅。


趁GPU空閑的時候在上面開個程序佔滿內存。等你要用的時候再把這個程序kill掉,跑自己的代碼。我實驗室有一個大佬就這樣長期霸佔7塊顯卡中的3塊,另一個大佬霸佔3塊,還剩1塊給我們十幾個閑雜人等用。


寫了個程序,伺服器有卡可以郵件通知,僅供參考,希望幫到你。https://www.yuque.com/docs/share/d28fc430-e5bf-461b-9181-069d3bacf78d?# 《記錄一下好用的程序》


最近也是被這東西逼瘋了,擼了個小程序,歡迎提bug

https://github.com/cnstark/gputasker?

github.com


我覺得跑一個程序留兩塊卡給別人用是基本的美德,我們實驗室有位大佬每次跑自己的程序,8個卡全部佔用,一塊不留給別人,說真的有點過分。


我只有一塊GPU。不太清楚跑程序可以指定一塊顯卡嗎?


推薦閱讀:
相关文章