仕事関連でOllama関連の作業を少しお休みしていたのですが、そろそろ開始するかということで触り始めていたのですが、GTX1070 mobileではあるもののGPUありPCでのLLMの動作が遅く感じていました。なんでかなと思っていたのですが、わからず進めていました。ようやくその原因がDockerでGPUの使用をONにしていなかったということが判明しました。なんと情けない。
とはいうもののGPUを使用しているかどうかをリアルタイムで見る手段を自分のなかで確立していなかったというのが一番の原因かもしれません。Windowsであればタスクマネージャーを使用すればリアルタイムに負荷の確認はできますが、Ubuntuじゃどうするのかということになります。
NVIDIAのデフォルトツール(nvidia-smi)
NVIDIA GPUのデフォルトツールであるnvidia-smiを使用するのが一番基本的かと思います。コマンドラインツールなので可視化にはちょっと遠い感じですが、使用状況を確認するだけであればいいかなと思います。ピンポイントの情報を得る形なので、時系列に状態を追うには少し工夫がいります。
nvidia-smi はNVIDIA System Management Interface (nvidia-smi/NVSMI) は NVIDIA GPUデバイスの管理・モニタリングを行うコマンドラインユーティリティーです。
オプションスイッチを使用すれば、ログ出力はできます。このログを解析して動作を確認出来ると思います。少しわかりにくい表示かなと思います。
$ nvidia-smi \ --query-gpu=timestamp,name,utilization.gpu,utilization.memory,memory.used,memory.free,memory.used\ --format=csv \ -l 1
CSV形式で1秒毎にGPU情報を/var/log/gpu.logに出力する
$ sudo nvidia-smi \ --query-gpu=timestamp,name,utilization.gpu,utilization.memory,memory.used,memory.free \ --format=csv -l 1 \ -f /var/log/gpu.log
(h)topコマンドのような形で表示する
nvidia-smiでは時間経過とともに見やすい表示ができない難点がありました。できればtopコマンドやhtopコマンドのようにリアルタイムに表示するアプリがないか調べてみました。
(1)NVTOP
1つ目はNVTOPとなります。
ドキュメントには以下のように書かれています。
NVTOPはNeat Videocard TOPの略で、GPUとアクセラレータ用の(h)topライクなタスクモニターです。 複数のGPUを扱うことができ、htopでおなじみの方法でGPUに関する情報を表示します。 現在サポートされているベンダは、AMD (Linux amdgpuドライバ)、Apple (限定的なM1 & M2サポート)、Huawei (Ascend)、Intel (Linux i915またはXeドライバ)、NVIDIA (Linuxプロプライエタリダイバ)、Qualcomm Adreno (Linux MSMドライバ)です。
NVTOPは複数の種類のGPUに対応しています。そのため、CPUに内蔵されたグラフィック機能も計測対象となり表示されます。
NVTOPのインストール
NVTOPはGitHubからビルドを行ってもよいのですが、apt installコマンドからもインストールを行うことが出来ます。
$ sudo apt update $ sudo apt install nvtop
NVTOPの起動
NVTOPはnvtopコマンドを実行することで起動出来ます。実行時にサポートが切れているというようなメッセージが表示されていますが、実行にはあまり影響は無いようです。
実行するとtopコマンドなどと同様にGPU関連情報を常に表示してくれます。また、状態のグラフ化もおこなってくれます。
$ nvtop

(2)nvitop
先ほどのコマンドとかなりにていますがnvitopになります(vとtの間にiが含まれています)。ドキュメントには以下のように書かれています。先ほどのアプリとの大きな差は、NVIDIA GPUのみに対応しているというところです。
nvitopは、インタラクティブなNVIDIAデバイスおよびプロセスモニタリングツールです。 カラフルで有益なインターフェイスを持ち、デバイスとプロセスのステータスを継続的に更新します。 リソースモニターとして、ツリービュー、環境変数表示、プロセスフィルタリング、プロセスメトリックスモニタリングなど、多くの機能とオプションが含まれています。 さらに、本パッケージには、ディープラーニング研究者向けのCUDAデバイス選択ツールnviselも同梱されている。 また、開発者が独自の監視ツールを作成できる便利なAPIも提供されている。 詳細については、More than a Monitorのセクションと、https://nvitop.readthedocs.io のAPIリファレンスを参照してください。
このアプリはPythonから前述のnvidia-smiの結果情報を引き出して可視化しているようです。そのため、NVIDIAのドライバがインストールされていないと動作しません。

nvitopのインストール
インストールは2つの方法があり、1つはapt installコマンドを使用する方法、もう1つはPythonのアプリなのでpipxを使用した方法になります。後者はもちろんPythonの環境が必要になります。※pipxは隔離された仮想環境にPython製アプリをインストールする仕組みです。
参考
(1)apt installコマンドを使用してインストール
$ sudo apt update
# nvitopのインストール
$ sudo apt install nvitop
apt installコマンドを使用した場合にはこれで終了です。
(2)pipxを使用したインストール
$ sudo apt update # pipxのインストールが必要であれば $ sudo apt install pipx # nvitop実行(初回のみインストール後に実行) $ pipx run nvitop
nvitopの実行
(1)apt intallコマンドを使用しての実行
$ nvitop
実行するとこちらもtopコマンドなどと同様にGPU関連情報を常に表示してくれます。また、状態のグラフ化もおこなってくれます。
(2)pipxを使用した場合の実行
pipxを使用している場合にはやや面倒な形で実行することになりますが、bashのAlias登録を行うことでこの手間も減らす事ができます。
$ pipx run nvitop # bash環境へ実行するAliasを追加(推奨) $ echo 'alias nvitop="pipx run nvitop"' >> ~/.bashrc # .bashrcにAlias登録を行った場合にはnvitopのみで実行可能 $ nvitop
実行するとこちらもtopコマンドなどと同様にGPU関連情報を常に表示してくれます。また、状態のグラフ化もおこなってくれます。

おわりに
Ubuntu上でGPU・CUDAの動作確認する手段が分かっていなかったので調べてみました。
個人的にはnvtopが一番表示的には見やすいこと、NVIDIAだけでなくAMDなどのGPUについても確認ができることからこちらがおすすめかなと思います。とはいえ、現状ではLLMの動作などを考えるとnvitopでも大きく差はなさそうです。