localaiforum
ログイン
ガイド › 実行とサービング

トークン毎秒の物理

トークン生成速度に謎はない。デコード中、各トークンは本質的にアクティブな重みのすべてをメモリから一度読む必要がある。これがデコードをメモリ帯域律速にし、割り算でtok/sを予測できることを意味する。人が議論するすべて——量子化、MoE、オフロード、バッチ——は、この式が違う帽子をかぶったもの。

唯一の式

tokens/sec ≈ 実効メモリ帯域幅 ÷ トークンあたり重み読み取りバイト数

RTX 4090、8B Q4_K_M:
  1008 GB/s ÷ 4.9 GB ≈ 205 tok/s が理論上限
  実測: ~120–150 tok/s(オーバーヘッド、アテンション、KV読み取り)

よくある1ケース(8B Q4_K_M、単一ストリーム)の健全性確認表。オーダーの数値であってスペックではない。自分で測ること。

ハードウェア 約帯域幅 期待デコード
RTX 4090 約1,000 GB/s 約120〜150 tok/s
RTX 3090 約936 GB/s 約110〜140 tok/s
RTX 4060 Ti 16GB 約288 GB/s 約35〜45 tok/s
デュアルチャネルDDR5 CPU 約60〜90 GB/s 約8〜14 tok/s
M3/M4 Max級Mac 約300〜400 GB/s(ユニファイド) 約40〜60 tok/s

上限と現実の差はなぜか。カーネル起動のオーバーヘッド、コンテキストとともに増えるアテンションの仕事、重みの上に乗るKVキャッシュの読み取り。式が与えるのは上限で、単一ストリームでは典型的に60〜75%を実現する。

1枚のカード、4つのモデル

この式は、固定ハードウェアでモデルサイズが速度とどうトレードするかも予測する。約1,000 GB/sカードの上限と、実現60〜75%(参考値)。

モデル Q4_K_Mでのサイズ 上限 現実的な単一ストリーム
4B 約2.5 GB 約400 tok/s 約230〜300 tok/s
8B 約4.9 GB 約205 tok/s 約120〜150 tok/s
14B 約8.5 GB 約118 tok/s 約70〜90 tok/s
32B 約19 GB 約53 tok/s 約30〜40 tok/s

2つの教訓。同じカードではパラメータを倍にすると速度は概ね半分。そして24 GBカードの32Bはチャットにはまだ十分速い——メモリ律速は絶望ではない。この組み合わせが、24 GBカードと32B Q4量子化が常に一緒に現れる理由(GPUティアを参照)。

量子化は単なる圧縮ではなく速度機能

同じ式、より少ないバイト。fp16の8Bモデルはトークンあたり約16 GBを読み、Q4_K_Mでは約4.9 GB。同じカードでQ4はfp16の約3倍の速度で動き、かつfp16が収まらない場所に収まる。Q4級量子化がローカル用途のデフォルト推奨である理由(量子化を参照)。品質損失は小さく、速度の利得は偶発的でなく構造的。

コンテキストは速度を下げる

会話が伸びるにつれ、各新トークンは過去全トークンのKVキャッシュも読む必要がある——この読み取りはコンテキスト長でスケールする。空のコンテキスト近くでは8B Q4は4090級カードで140 tok/sを出せるが、64kトークンのセッションの深部では同じ構成がその半分か3分の1に垂れ得る。アテンションカーネルもキャッシュフレンドリーな形に収まらなくなる。長コンテキストワークロードはフラッシュアテンションとKV量子化が元を取る場所(KVキャッシュとエンジンノブを参照)。

よくある混乱:「チャットが進むにつれモデルが遅くなった」は大抵KVの成長であって、サーバの劣化ではない(KVキャッシュを参照)。

MoE:能力に対して速い

専門家混合モデルはトークンごとに少数の専門家ブロックだけを活性化するので、トークンあたりの読み取りバイト数は総数ではなくアクティブパラメータに従う。総30B/アクティブ3BのモデルはQ4でトークンあたり数ギガバイトしか読まない——大きいモデルの知識を運びながら小さいモデルのようにデコードする。ローカル用途でのMoEファミリーの魅力のすべて(モデルファミリーを参照)。専門家の保管にはメモリを払うが、帯域幅は使用するものにだけ払う。

執筆時点での具体的な形:Qwen3-30B-A3B級はトークンあたり約3Bのアクティブパラメータだけを読む——小さいモデルの速度で大きいモデルの知識を、Q4でVRAM約18 GBで。

スペキュラティブデコーディング

小さなドラフトモデルを大きなターゲットと組む。ドラフトがkトークンを安く提案し、ターゲットが1回のフォワードパスでk個すべてを検証し、受理されたトークンはターゲットの品質で出てくる。greedy的なワークロード——コード補完、JSON、低temperatureでの抽出——では2〜3倍のデコード高速化を期待。高temperatureではドラフトの推測がより頻繁に外れ、利得は縮む。llama.cppは--model-draftとドラフト長フラグで公開。正確なフラグ名はバージョンで流れるので--helpを確認。

コスト:ドラフトはターゲットのトークナイザを共有する必要があり、両モデルがメモリに載る。

並列性:現実

GPU 2枚は単一ストリームの2倍を与えない。テンソル並列(vLLM -tp 2)はスループットのために各レイヤーをカードに分割し、代償にインターコネクトトラフィックを払う。llama.cppのデフォルト分割はパイプライン(レイヤー単位)で、単一ストリームのレイテンシより容量に効く。良い2枚分割の現実的期待値は1.2〜1.6倍で、2倍ではない。GPUごとの線形スケールを約束する人がいたら、何かを売っている。

もっとも、カード追加は容量をきれいにスケールさせる——それが同時実行のサーバの物語。

CPUオフロードの崖

レイヤーがCPUに残ると、各トークンのフォワードパスはPCIe(約10〜25 GB/s)を越えてシステムRAMへ往復する。ループは最も遅い常駐部分の速度で走る。レイヤーの80%がGPUにあるモデルは「GPU速度の80%」よりCPU速度にはるかに近く走る。モデルがほぼ収まるなら、半分オフロードするより量子化を1段下げる——エンジンノブを参照。うっかり部分オフロードの目印は、GPU級ハードウェアでの3〜10 tok/s。

プリフィルは計算律速:TTFTは別の測定

プロンプトの処理はトークン間で並列で、帯域幅ではなく計算に制限される——4090級カードは8B Q4を毎秒数千トークンでプリフィルできる。だから12kトークンの貼り付けは、最初の出力トークンの前に約3〜5秒を要する。その後のデコードが140 tok/sで走るにもかかわらず。初回トークンまでの時間と定常tok/sは、異なるボトルネックを測る異なる数値。ベンチマークを読むときは、どちらを示しているか確認すること。

自分で測る

ページ上の数値(このページを含む)は上限と範囲。自分の構成は2分で測れる。

  1. 短いプロンプトから約200トークン生成。最初の1回(コールドロード)は無視。
  2. 定常デコードを取る。最初のトークン以降の、生成トークン数 ÷ 秒数。
  3. 長い貼り付けの初回トークンまでの時間は別途記録——別のボトルネック。

llama-serverはリクエストごとにプロンプト評価と評価tok/sを出力し、LM Studioはデコードtok/sをライブ表示し、nvidia-smiはテスト中にGPUが実際に忙しいことを確認させる。

速度の感じ方

tok/s 感触
5 実用可能だが痛い——長い回答が怖くなる
10 チャットには十分
20 軽快。会話が機械的でなくなる
50+ 一瞬。コードアシスタント級

しきい値が驚くほど低いのは、人間の読書速度が毎秒約5〜10トークンだから——しかし完了を5 tok/sで待つのは惨めさ。自分で感じること。シミュレータは同じ回答を異なるトークン速度で描画し、そこでの1分はどんな表より多くを教える。

約2〜3 tok/s未満では、ストリーミングUIは遅いではなく壊れて感じられる——人はタブを閉じる。対話用途の硬い下限として扱うこと。

関連: ハードウェア概要 · VRAM計算 · GPUティア · エンジンノブ