概要 - Abstract
WSL2でのCUDAにはある重大な課題があります。
NVIDIAの佐々木さん ( @ksasaki ) の記事にあるように、WSL2からnvidia-smi
コマンドからGPU使用率を確認することはできません。
(2021/11/25現在)
上の記事では、Windows側からnvidia-smiコマンドを叩いてGPU使用率をロギングする策が紹介されています。しかし、WSL2とNative Windowsの行き来が必要なので、実用上の不便さは否めません。
この度は、実はWSL2の/mnt/c
にはCドライブがマウントされていること、およびWSL2がWindowsのバイナリを実行できること、の2点に着目して、linux内からnvidia-smi
経由でGPU使用率を扱う裏技を思いついたので、共有しつつ、その便利さを述べていきます。
結論 - Conclusion
1. nvidia-smi.exeのWindows上でのパスを確認する
> get-command nvidia-smi
2. WSL2からWindowsのnvidia-smiの実行ファイルのパスを指定する
/mnt/c/
に続けて1.にて得られたパスをlinuxのパスの形式で打ち込みましょう。
(以下のbar
とかfoo
はあくまで例なので、パスは各自書き込んでください。)
"/mnt/c/bar/foo/nvidia-smi.exe"
驚くべきことに、なんとこれにより、WSL2のlinuxターミナルからWindowsにインストールされている方のnvidia-smiコマンドを呼び出せるのです。それはまさに、WSL2のlinuxターミナルからGPU使用率が見えることを意味します。
驚きは止まらない
しかも、その出力結果は、grepやパイプラインなど、linuxのターミナルを普段使いするように扱いと加工ができるのです。
"/mnt/c/bar/foo/nvidia-smi.exe" > ./log.txt
しかも、それには何の違和感もなく、linuxでnvidia-smi
を扱うように、パラメータを与えることもできるのです。
例えば、以下の記事で登場する佐々木さんお好みのWindows側でのロギング方法を見てみましょう。
C:\WINDOWS\system32>nvidia-smi --loop=2 -i 0 --format=csv --query-gpu=timestamp,utilization.gpu,clocks.sm,power.draw,temperature.gpu
適切にパスを指定することにより、上のコマンドが、WSL2のlinuxターミナルから全く同じように扱えるのです!
"/mnt/c/bar/foo/nvidia-smi" --loop=2 -i 0 --format=csv --query-gpu=timestamp,utilization.gpu,clocks.sm,power.draw,temperature.gpu
さらなる実用上の工夫の余地も
とはいえnvidia-smi.exe
のパスを毎回指定するのは面倒なので、bashエイリアスを用いてmy-nvidia-smi
とか適当な名前をつけて扱うのもいいかもしれませんね。
まあ、それも面倒なので、私は場合はctrl+rで履歴から繰り返してますが。。。
WSL2におけるnvidia-smiコマンドの問題は修正予定
NVIDIAの中の人の佐々木さん曰く、
開発チームは認識済みで修正の予定
とのことですので、私の書いているこの記事は、そのうち不要になることでしょう!(と願いたい🤲)
感想
中の人から直接耳寄りの情報がQiitaで手に入るとは、いい時代になったものですね。
お読みいただきありがとうございました。それでは、より良きGPUライフを!