如何監(jiān)控NVIDIA GPU 的運行狀態(tài)和使用情況
來源:deephub imba
設(shè)備跟蹤和管理正成為機(jī)器學(xué)習(xí)工程的中心焦點。這個任務(wù)的核心是在模型訓(xùn)練過程中跟蹤和報告gpu的使用效率。
有效的GPU監(jiān)控可以幫助我們配置一些非常重要的超參數(shù),例如批大小,還可以有效的識別訓(xùn)練中的瓶頸,比如CPU活動(通常是預(yù)處理圖像)占用的時間很長,導(dǎo)致GPU需要等待下一批數(shù)據(jù)的交付,從而處于空閑狀態(tài)。
什么是利用率?
過去的一個采樣周期內(nèi)GPU 內(nèi)核執(zhí)行時間的百分比,就稱作GPU的利用率。
如果這個值很低,則意味著您的 GPU 并沒有全速的工作,可能是受到 CPU或者IO 操作的瓶頸,如果你使用的按小時付費的云服務(wù)器,那么就是在浪費時間和金錢!
使用終端命令監(jiān)控
nvidia-smi

以下是我們在這里收集的一些信息:
GPU:Tesla T4
設(shè)備溫度:設(shè)備當(dāng)前運行溫度為 25 攝氏度
功耗:GPU 目前運行功率9W,官方設(shè)定的額定最大功率消耗 70W ?。
顯存:0MiB / 15109MiB 上限
GPU利用率:0%。同樣,NVIDIA 將利用率定義如下:過去采樣周期中一個或多個內(nèi)核在 GPU 上執(zhí)行的時間百分比。
如果你負(fù)責(zé)硬件相關(guān)的工作,溫度和功率是跟蹤的可能是你關(guān)注的主要問題,這樣您就可以平衡嘗試最大化計算和維護(hù)設(shè)備安全。如果你是硬件使用者(就像一般我們使用云服務(wù)器一樣),最關(guān)心的應(yīng)該是內(nèi)存使用和GPU利用率。
使用 nvidia-smi 進(jìn)行監(jiān)控的其他一些技巧:
調(diào)用 watch -n 1 nvidia-smi ?可以每一秒進(jìn)行自動的刷新。
nvidia-smi 也可以通過添加 --format=csv 以 CSV 格式輸。在 CSV 格式中,可以通過添加 --gpu-query=... 參數(shù)來選擇顯示的指標(biāo)。
為了實時顯示 CSV 格式并同時寫入文件,我們可以將 nvidia-smi 的輸出傳輸?shù)?tee 命令中,如下所示。這將寫入我們選擇的文件路徑。
nvidia-smi --query-gpu=timestamp,pstate,temperature.gpu,utilization.gpu,utilization.memory,memory.total,memory.free,memory.used --format=csv | tee gpu-log.csv用 Python 代碼監(jiān)控
基于終端的工具很棒,但有時我們希望將 GPU 監(jiān)控和日志記錄直接整合到 Python 程序中。這里提供2中方法:
1、使用NVIDIA 管理庫 (NVML)
NVML(nvidia-management-library)是CUDA中提供的可以查看顯卡信息的工具包,nvidia-smi也是基于這個工具包
在python中NVML有很多個包,我們只比較其中的兩個。nvvidia-ml-py3 ,它是 NVML 的簡單接口,沒有任何重要的附加功能。使用此庫可能如下所示:
# Install with "pip install nvidia-ml-p3"
import pynvml# Must call this first
pynvml.nvmlInit()
# Use device index to get handle
handle = pynvml.nvmlDeviceGetHandleByIndex(0)
# Use handle to get device stats
memory_info = pynvml.nvmlDeviceGetMemoryInfo(handle)
utilization = pynvml.nvmlDeviceGetUtilizationRates(handle)
# Report device stats
print("Total memory:", memory_info.total)
print("Free memory:", memory_info.free)
print("Used memory:", memory_info.used)
print("GPU Utilization:", utilization.gpu)
print("Memory Utilization:", utilization.memory)
另一個比較好用的庫是py3nvml,因為它添加了一些用于管理 GPU 的實用功能,而 nvidia-ml-py3 僅用于監(jiān)控。除了上面顯示的功能類型之外,該庫還允許我們執(zhí)行以下操作(摘自官方文檔):
import py3nvml
import tensorflow as tf
py3nvml.grab_gpus(3)
sess = tf.Session() # now we only grab 3 gpus!
在這里,我們在一臺可以訪問多個 GPU 的機(jī)器上運行,但我們只想將其中三個用于 本次TensorFlow session。使用 py3nvml,我們可以簡單地調(diào)用 py3nvml.grab_gpus(3) 來分配三個設(shè)備。
總結(jié)
以上命令可以是我們獲取到需要的GPU監(jiān)控指標(biāo)了,下一步就是進(jìn)行可視化,我們可以直接打印出來,或者將指標(biāo)推送到tensorboard,甚至是使用prometheus將GPU的運行狀況納入到運維的監(jiān)控體系。

作者:Michael Cullan
