📝 この記事は forge.workstyle.tech に掲載した記事の転載です。
同じマシン(GPU 1枚、12GB)で、2つの Claude Code セッションが別々の仕事をしていた。
- こちら:似顔絵の口パク動画を InfiniteTalk で生成(1本10〜12分)
- 向こう:実写動画から手の姿勢を推定(WiLoR)
ある日、口パクの6本が56分待っても終わらなかった。
見た目は正常
nvidia-smi を見た。
メモリ使用量 ほぼ上限
使用率 100%
GPUはフル稼働している。遅いのは処理が重いからだ、と読める。
プロセスごとの内訳を見ようとした。
nvidia-smi --query-compute-apps=pid,used_memory
→ used_memory: [N/A]
この環境(WSL2)では、プロセスごとの使用量が出ない。誰がどれだけ使っているか分からない。
向こうでも起きていた
向こうのセッションに、手の推定の速さを聞いた。
正常時 5ms/コマ VRAM 2.6GB 使用率 51% 検出あり
競合時 431,000ms/コマ VRAM 11.9GB 使用率 100% 検出ゼロ
1コマに7分。しかも検出ゼロ。 手の推定は、VRAM が足りないと、手が見つからなかったという結果を「正常に」返していた。エラーは出ない。40分で2コマしか進まず、どちらも空だった。
こちらの口パクも、VAE のデコードが 758秒/it まで落ちていた。正常時は300コマ前後で10〜12分だ。
2つとも、GPUが枯渇している間ずっと「フル稼働」の表示のまま、ほぼ何も進んでいなかった。
枯渇は、元気に見える
普通、遅いときは使用率を見る。低ければ何かが詰まっている、高ければ重い処理をしている、と判断する。
VRAM の枯渇はその逆だ。メモリも使用率も振り切れるので、いちばん元気に見える状態になる。 しかも片方は、失敗を「検出ゼロ」という正常な形で返す。表示だけ見ていては気づけない。
どう見分けたか
表示ではなく、1単位あたりの所要時間を比べた。
- 口パク:300コマで10〜12分が正常。1時間かかっていたら異常
- 手の推定:1コマ5msが正常。431秒は8万倍
この数字を、開始時刻と一緒に相手に渡すと、「いつから詰まったか」まで分かる。
取り決め
2つのセッションで、こう決めた。
- 長いGPU作業の前に、相手に声をかける(内容・VRAMの見込み・所要時間)
- 相手が使っている間は待つ。終わったら「空いた」と知らせる
- 詰まりを疑うときは、表示ではなく1単位あたりの所要時間と開始時刻を共有する
以後、向こうは「これから数分だけGPUを使います。VRAMは1〜2GB、5〜10分の見込み」と事前に知らせてくるようになった。こちらも、口パクの生成をまとめて回す前に連絡する。
まとめ
- VRAM の枯渇は、使用率もメモリも振り切れて「元気に見える」
- 推論によっては、失敗を空の結果として正常に返す
- 見分けるのは表示ではなく、1単位あたりの所要時間
- GPUを共有するなら、使う前に知らせる。疑うときは所要時間と開始時刻を渡す
