技術研究所(技研)のまつけんです。
技研では現在、2台のゲーミングデスクトップPCにLinux (Ubuntu)とJupyterをインストールして、共有で計算サーバとして使っています。2台のPCにグラフィックボードが2枚ずつ搭載しているのですが、技研メンバ全員が使うので、GPUやGDDR RAMなどのリソースの順番待ちが発生します。
グラフィックボードのステータスはnvidia-smiコマンドで確認するのですが、タスクの詳細(オーナなど)については、別途psコマンドなどで調べる必要があります。そこで今回、nvidia-smiコマンドの結果から自動的にpsコマンドで詳細を調べるシェルスクリプトを作ってみました(nvidia-smiのバージョンが450の場合は、awk ‘{print $5}’ ):
hostname |
echo '' |
nvidia-smi |
echo '' |
nvidia-smi | grep PID -A 10000 | grep -v PID | grep -v === | grep -v ^+-- | awk '{print $3}' | \ |
while read PID |
do |
ps aux | grep $PID |
done | grep -v grep | cut -c -80 |
実行結果は、このようになります:
giken-ml-2 |
Tue Aug 25 13:45:48 2020 |
+-----------------------------------------------------------------------------+ |
| NVIDIA-SMI 435.21 Driver Version: 435.21 CUDA Version: 10.1 | |
|-------------------------------+----------------------+----------------------+ |
| GPU Name Persistence-M| Bus-Id Disp.A | Volatile Uncorr. ECC | |
| Fan Temp Perf Pwr:Usage/Cap| Memory-Usage | GPU-Util Compute M. | |
|===============================+======================+======================| |
| 0 GeForce RTX 208... Off | 00000000:01:00.0 Off | N/A | |
| 34% 56C P2 86W / 250W | 4237MiB / 11016MiB | 0% Default | |
+-------------------------------+----------------------+----------------------+ |
| 1 GeForce RTX 208... Off | 00000000:02:00.0 Off | N/A | |
| 34% 53C P2 125W / 250W | 8439MiB / 11019MiB | 14% Default | |
+-------------------------------+----------------------+----------------------+ |
+-----------------------------------------------------------------------------+ |
| Processes: GPU Memory | |
| GPU PID Type Process name Usage | |
|=============================================================================| |
| 0 2016 G /usr/lib/xorg/Xorg 9MiB | |
| 0 2194 G /usr/bin/gnome-shell 14MiB | |
| 0 14427 C /usr/bin/python3 4201MiB | |
| 1 14339 C /usr/bin/python3 4227MiB | |
| 1 14385 C /usr/bin/python3 4201MiB | |
+-----------------------------------------------------------------------------+ |
root 2016 0.0 0.0 269172 9820 tty1 Sl+ Aug17 0:01 /usr/lib/xorg/X |
gdm 2194 0.0 0.0 4029456 38776 tty1 Sl+ Aug17 2:10 /usr/bin/gnome- |
hanako 14427 534 3.7 18846312 2443008 ? Rsl 09:15 1446:14 /usr/bin/pytho |
hanako 14339 531 3.6 18809292 2407708 ? Rsl 09:13 1445:12 /usr/bin/pytho |
taro 14385 531 3.6 18809016 2406060 ? Rsl 09:14 1440:23 /usr/bin/pytho |
nvidia-smiコマンドでは、プロセス毎のRAM使用量は表示されますが、その他のオーナなどの情報はわかりません。しかし、PIDをキーにしてps auxとgrepを組み合わせると各種の情報を得ることが出来ます。今回のスクリプトでは、nvidia-smiコマンドの結果からPIDを順に読み込んで各々のpx auxの結果を表示します。
勿論、このスクリプトは、Jupyter Notebook上でも実行できます。Jupyter上で、shellを呼び出すには、行頭に「!」を付ければよいので、先程のスクリプトの全ての行頭(スクリプトとしての行頭)に「!」を付け、複数行に渡る部分には、行末に「; \」を付けます(ただし、doのあとに「;」を付けると構文エラーになります):
!hostname |
!echo '' |
!nvidia-smi |
!echo '' |
!nvidia-smi | grep PID -A 10000 | grep -v PID | grep -v === | grep -v ^+-- | awk '{print $3}' | \ |
while read PID ; \ |
do \ |
ps aux | grep $PID ; \ |
done | grep -v grep | cut -c -80 |
ちなみに、これだと少し動作が遅いので、全てを1行に纏めてしまうのがお勧めです(Jupyter Notebookでは!毎にshellを呼び出すようです)。纏めたものがこちらです:
!hostname ; \ |
echo '' ; \ |
nvidia-smi ; \ |
echo '' ; \ |
nvidia-smi | grep PID -A 10000 | grep -v PID | grep -v === | grep -v ^+-- | awk '{print $3}' | \ |
while read PID ; \ |
do \ |
ps aux | grep $PID ; \ |
done | grep -v grep | cut -c -80 |
また、セルの先頭に「%%bash」を付けることで「!」と「; \」を使わずに記述する方法もありますね:
%%bash |
hostname |
echo '' |
nvidia-smi |
echo '' |
nvidia-smi | grep PID -A 10000 | grep -v PID | grep -v === | grep -v ^+-- | awk '{print $5}' | \ |
while read PID ; \ |
do \ |
ps aux | grep $PID ; \ |
done | grep -v grep | cut -c -80 |
如何でしたか? 今回は計算サーバのGPUのステータスをJupyter上から自動で詳細に調べる方法について紹介しました。よろしければ、使ってみてください。