ローカル LLM の実測
速いモデルが、使えるモデルとは限らなかったわ。だから速度だけでなく指示を守れた回数まで数えたの。
下流の処理に渡すなら、返ってきたものがそのまま食えるかどうかで決まるわ。それと、文脈長は「指定できる上限」と「この機械で実際に使える上限」が別物だったの。
ローカル LLM 5 本に同じ指示を渡して、指示を守れた回数を数えた
| モデル | 生成 tok/s | JSON そのまま | 必須語を保持 | 画像 60 語以内 | モーション 25 語以内 |
|---|---|---|---|---|---|
| qwen3.8:27b | 72.7-84.6 | 3/3 | 2/3 | 3/3 | 3/3 |
| gemma4:31b | 49.6-49.9 | 3/3 | 3/3 | 3/3 | 3/3 |
| qwen3:30b-a3b | 219.1-227.8 | 0/3 | 2/3 | 1/3 | 2/3 |
| qwen3:14b | 99.1-105.3 | 3/3 | 1/3 | 3/3 | 3/3 |
| nemotron-nano-9b-v2-jp | 138.4-139.2 | 1/3 | 3/3 | 1/3 | 1/3 |
いちばん速いモデルが、いちばん使えなかったわ
qwen3:30b-a3b は 219.1〜227.8 tok/s で、5 本のなかで断然の最速よ。2 番手の 138.4 tok/s に 1.6 倍の差を付けているわ。でも JSON をそのまま返せたのは 3 回中 0 回だったの。
返ってきたものを別の処理へ渡す使い方だと、これは「速い」以前の話ね。毎回こちらで直すなら、その手間ぶんは生成の速さから引かないと釣り合わないもの。
逆に、いちばん遅いものが全部通ったわ
gemma4:31b は 49.6〜49.9 tok/s で最下位。qwen3:30b-a3b の 4 分の 1 以下の速さよ。それでも 4 項目とも 3/3 で、崩れた回が 1 度も無かったの。
15 回まわして落ちた回はゼロ。だからここに出ている差は、動く・動かないではなく動いたうえで指示をどれだけ守ったかの差ね。
数えたのは 4 つ
JSON をそのまま返せたか、渡した必須の語を落とさなかったか、画像の指示を 60 語以内に収めたか、動きの指示を 25 語以内に収めたか。どれも「読めば分かる」ではなく機械で判定できる形にしてあるわ。そうしないと、わたしの読み方が結果を作ってしまうもの。
文脈長を伸ばすと、どこで CPU へ退避するか
| num_ctx | nvidia-smi 実測 | GPU に全部載ったか | 生成 tok/s |
|---|---|---|---|
| 131,072 | 28,447 MiB | はい | 約 95 |
| 196,608 | 31,465 MiB | いいえ (1.5 GB が CPU) | 16.8 |
| 262,144 (native 上限) | 31,483 MiB | いいえ (7.3 GB が CPU) | 16.3 |
指定できる上限と、この機械で使える上限は別物なの
131,072 までは 28,447 MiB で収まって、生成は約 95 tok/s。そこから 196,608 に上げると 1.5 GB だけが GPU に載りきらなくなって、生成が 16.8 tok/s まで落ちたわ。5.6 分の 1 よ。
1.5 GB でこれなの。載りきらなかった量に比例して遅くなるのではなくて、はみ出した瞬間に落ちるのね。実際、262,144 まで上げてはみ出しが 7.3 GB になっても 16.3 tok/s で、196,608 のときとほとんど変わらないわ。
いちばん危ないのは、エラーが出ないこと
上限を超えても止まらないし、警告も出ないの。普通に答えが返ってくるわ。ただ遅いだけ。だから「なんとなく重い」で済ませてしまって、設定を 1 つ戻せば 5 倍速くなることに気付かないまま使い続けることになるのよね。
公称の上限は 262,144 だけれど、この 1 台で使える上限は 131,072だったわ。はみ出したぶんの受け皿になっているのは DDR5 128GB のシステムメモリで、そこに逃がせているから止まらずに済んでいるの。GPU 側は RTX 5090 の 32GB ね。構成は 検証機材 に全部置いてあるわ。
VRAM が足りない側の話は 動画生成の実測 にもあるわよ。あちらは 2 つのモデルを同時に載せられなかった記録なの。