GPU VRAM計算ツール(ローカルLLM)
7Bモデルを4ビットにすると重みは約3.3GiBで、Llama 3.1 8Bクラスではコンテキスト8,192トークンごとにKVキャッシュが約1GiB加わります。
使い方
- モデルのプリセットを選ぶと、パラメータ数、レイヤー数、KVヘッド数、ヘッド次元が入ります。自分で入れる場合は「手入力」を選び、モデルのconfig.jsonの値を入力します。
- 重みの量子化ビット(Q4なら4、FP16なら16)とKVキャッシュの精度を選びます。
- コンテキスト長(トークン数)とバッチサイズ(同時に処理するシーケンス数)を入力します。
- 合計と、重み・KVキャッシュ・オーバーヘッドの内訳を確認します。表で、どのサイズのGPUに収まるかが分かります。
計算方法
重みのメモリ = パラメータ数 × ビット数 ÷ 8 バイト。70億パラメータのモデルを4ビットにすると 7,000,000,000 × 0.5 = 3.5GB、つまり3.26GiBです。同じモデルを16ビットにすると14GBで、Hugging Faceのガイド「Optimizing LLMs for Speed and Memory」にあるbfloat16で10億パラメータあたり2GBという目安と一致します。
KVキャッシュ = 2 × レイヤー数 × KVヘッド数 × ヘッド次元 × コンテキスト長 × バッチサイズ × 1値あたりのバイト数。2はキーと値の分です。Hugging Faceのブログ「Unlocking Longer Generation with Key-Value Cache Quantization」は、16ビットの場合の1トークンあたりを 2 × 2 × レイヤー数 × KVヘッド数 × ヘッド次元 と示しています。
オーバーヘッドは、重みとKVキャッシュの合計に対する割合で指定します。CUDAコンテキスト、アクティベーション用バッファ、メモリの断片化を代わりに見込む値で、初期値の10%は実測ではなく仮定です。
結果はすべてGiB(1GiB = 1,073,741,824バイト)です。GPUメーカーは24GiBのカードを「24GB」と表記するため、適合表は合計を8・12・16・24・48・80とそのまま比べます。あくまで見積もりで、llama.cpp、vLLM、Ollama、Transformersなどのフレームワークやカーネル、キャッシュの確保方法によって実際の使用量は変わります。
VRAMを占めるもの
主な要素は2つです。重みは、モデルと量子化を決めれば固定されます。KVキャッシュはコンテキストのトークンが増えるほど、バッチのシーケンスが増えるほど大きくなります。収まっていたはずのモデルが、長いコンテキストや同時利用者の増加で急に収まらなくなるのはここが原因です。
GQA(グループクエリアテンション)のモデルは、アテンションヘッドよりKVヘッドを少なくしてキャッシュを数分の一に減らします。そのため、アテンションヘッド数よりKVヘッド数のほうが重要です。モデルのconfig.jsonのnum_key_value_headsを確認してください。
10億パラメータあたりの重みサイズ
| 重みのビット数 | 10億パラメータあたりのGiB | 例: 8Bモデル |
|---|---|---|
| 16 (FP16 / BF16) | 1.86 | 14.90 GiB |
| 8 (INT8 / Q8) | 0.93 | 7.45 GiB |
| 6 (Q6) | 0.70 | 5.59 GiB |
| 5 (Q5) | 0.58 | 4.66 GiB |
| 4 (Q4) | 0.47 | 3.73 GiB |
| 3 (Q3) | 0.35 | 2.79 GiB |
| 2 (Q2) | 0.23 | 1.86 GiB |
プリセットの出典
- 各リポジトリのconfig.json: huggingface.co/Qwen/Qwen2.5-{7B,14B,32B,72B}, huggingface.co/Qwen/Qwen3-{8B,32B}, huggingface.co/mistralai/Mistral-7B-v0.3, huggingface.co/mistralai/Mistral-Nemo-Base-2407, huggingface.co/microsoft/phi-4。
- Llama 3.1 8B・70B: MetaのconfigはHugging Face上で承認制のため、Metaの論文「The Llama 3 Herd of Models」(arXiv 2407.21783)のTable 3の値を使っています。Gemma 2 9B・27B: Googleの報告書「Gemma 2」(arXiv 2408.00118)のTable 1です。
- パラメータ数は、Hugging Face APIが各リポジトリについて返すsafetensorsの合計です。config.jsonにhead_dimがない場合は、hidden_size ÷ アテンションヘッド数を使います。
よくある質問
7Bモデルを4ビットで動かすにはVRAMがどれくらい必要ですか?
重みだけで約3.3GiBです。Llama 3.1 8Bクラスでコンテキストが8,192トークンなら、KVキャッシュが約1GiB加わり、オーバーヘッドまで含めて約5GiBを見込んでください。8GBのカードで動き、コンテキストを伸ばす余裕もあります。
24GBのカードで32Bモデルは動きますか?
4ビットなら動きます。Qwen2.5 32Bのパラメータは約327億6千万個なので、重みは約15.3GiBです。コンテキスト8,192トークンでKVキャッシュは2GiB、オーバーヘッド10%を足した合計は約19GiBです。
実際の使用量が見積もりと違うのはなぜですか?
フレームワークごとにオーバーヘッドが違います。vLLMはKVキャッシュ用にGPUの大半をあらかじめ確保し、空きが足りなくなるとリクエストをプリエンプトします。llama.cppは最初にコンテキスト全体分のキャッシュを確保します。GGUFのK-quantはスケール値を別に持つため、表記より実質のビット数が高くなります。メモリ不足が出たら、ビット数かオーバーヘッドを上げてください。
MoE(専門家混合)モデルにも使えますか?
重みはすべてメモリに載せる必要があるので、活性パラメータではなく総パラメータ数を入れてください。KVキャッシュはアテンション層だけで決まるため、configのレイヤー数とKVヘッド数を使います。ここのプリセットはすべて密(dense)モデルです。
Gemma 2はスライディングウィンドウを使うので、見積もりはもっと小さくなるのでは?
Gemma 2は4,096トークンのウィンドウを持つローカル層と、全体を見るグローバル層を交互に使います。このツールは全レイヤーでコンテキスト全体を数えるため、コンテキストがウィンドウより長いときのGemma 2では上限値になります。