技術研究所(技研)のまつけんです。

 

技研では現在、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上から自動で詳細に調べる方法について紹介しました。よろしければ、使ってみてください。