はじめに
フルマネージドなAPIでは意識しづらいものの、自前のGPU(オンプレや固定のクラウドGPU)でLLMを動かす際には、LLMがGPUメモリをどの程度使うかを意識しながら運用する必要があります。
LLMをGPUで推論する際に、どの程度のGPUメモリを使うかを予め計算しておくことで、使うべきGPUの種類や処理できる文字数(トークン数)を把握しておく事ができます。
LLM推論時のGPUメモリ消費量の主要因
LLM推論時のGPUメモリ消費量の支配的な要因は以下の2つです。
- モデルパラメータ
- KV キャッシュ
パラメータによる消費は基本的に固定ですが、KVキャッシュは処理するトークン数に比例して増加します。
モデルパラメータによるGPUメモリ消費量
モデルをGPUメモリにロードした時点で常に占有する領域です。
計算方法
単純で、
総パラメータ数[billions] \times バイト数[bytes] = メモリ消費量 [GB]
になります。
モデルのパラメータは計算のためにすべてGPUメモリに置かれるため、モデルの容量がそのままGPUメモリ消費量になります。コンピュータの文脈ではbillionは $1024^3$ を表し、同様にG(ギガ)も$1024^3$の意味なのでこの式が成り立ちます。
例えば、google/gemma-3-27b-itの場合は総パラメータ数 27 billion (270億)で、数値型はbfloat16です。bfloat16は1つの数値を16ビットを表す形式の1つで、バイト数は2となります。よって、
27 \times 2 = 54 [GB]
となります。この値は、Hugging Faceのgemma-3-27b-itのページに飛んで上の方の54.9 GBという記載ともほぼ一致します。
KVキャッシュとはなにか
Transformerアーキテクチャにおける推論高速化の中核をなすのが、KVキャッシュと呼ばれる機構です。これは各アテンション層で計算されるKey(キー)とValue(バリュー)を一度計算した後に保存し、以降の処理で再利用することで計算量を削減する技術です。
アテンション構造の概要
アテンション層1つあたり、アテンションヘッドを$H$個持ちます。
各アテンションヘッドでは、入力トークン列に対応するベクトル列(または、隠れ状態とも呼ぶ)$X$を入力として、この$X$を線形変換することで得られる新しいベクトル列$Q$, $K$, $V$を生成します。この$K$, $V$が、Key(キー)とValue(バリュー)の実体です。
各アテンションヘッド $ h \in {1, 2, \ldots, H} $において、入力 $X$ から以下のように計算されます:
\begin{align}
h &\in \{1, 2, \ldots, H\} \\
Q_h &= X W_h^Q \\
K_h &= X W_h^K \\
V_h &= X W_h^V
\end{align}
ここで、$X$ のサイズは $ L \times (d_{\text{head}} \cdot H) $ であり、各ヘッドにおける $K_h$ および $V_h$ のサイズは $ L \times d_{\text{head}}$ となります。
- $L$:トークン列長さ
- $d_{\text{head}}$:アテンションヘッドあたりの次元数
トークン列長さ $L$ の増加に伴い、KVキャッシュのサイズも線形に増大します。このため、長文処理においてはGPUメモリの消費量が深刻なボトルネックとなります。
KVキャッシュのメモリ使用量
1つのアテンション層あたりのKVキャッシュの要素数は、以下の式で表されます:
\text{要素数} = 2 \times L \times d_{\text{head}} \times H
- 係数 $2$:KeyとValueの両方を保持するため
- $H$:アテンションヘッドの総数
実際のメモリ使用量(バイト単位)は、データ型の精度に依存します。KVキャッシュ量子化を利用していない限り、モデルのパラメータで使われているデータ型の精度と等しいです。例えば、bfloat16を使用する場合、1要素あたり2バイトが必要です:
\text{アテンション層1つあたりのKVキャッシュ [GB]} = \frac{2 \times L \times d_{\text{head}} \times H \times \text{bytes}}{1024^3}
したがって、モデル全体のKVキャッシュのメモリ使用量は:
\text{全体のKVキャッシュ [GB]} = N \times \frac{2 \times L \times d_{\text{head}} \times H \times \text{bytes}}{1024^3}
このように、KVキャッシュのメモリ消費量はトークン列長さ $L$、ヘッド次元 $d_{\text{head}}$、ヘッド数 $H$、アテンション層の数$N$の積に比例して増加します。
マルチクエリアテンションにおけるKVキャッシュ
標準的なマルチヘッドアテンション(MHA)に対し、推論速度とメモリ効率を改善する手法として、マルチクエリアテンション(Multi-Query Attention, MQA)が提案されました。MQAの特徴は、全アテンションヘッド間でKeyとValueを共有する点にあります。この共有により、保持すべきKeyとValueの数を大幅に削減できます。
アーキテクチャ
MQAでは、全アテンションヘッド間で単一のKeyとValueペアを共有します。各ヘッドは独自のQueryを持ちますが、KeyとValueは1セットのみを計算し、全ヘッドで再利用します:
\begin{align}
h &\in \{1, 2, \ldots, H\} \\
Q_h &= X W_h^Q \quad \text{(ヘッドごとに固有)} \\
K &= X W^K \quad \text{(全ヘッド共有)} \\
V &= X W^V \quad \text{(全ヘッド共有)}
\end{align}
メモリ効率
MQAでは、KeyとValueを1セットのみ保存すれば十分であるため、KVキャッシュの要素数は:
\text{要素数(MQA)} = 2 \times L \times d_{\text{head}}
これは、マルチヘッドアテンションと比較して、KVキャッシュのサイズが $1/H$ に削減されることを意味します。
グループドクエリアテンションにおけるKVキャッシュ
MQAは計算速度とメモリ効率において優れている一方で、モデルの表現力低下による精度劣化という課題があります。この問題に対処するため、MHAの精度とMQAの効率性を両立させる手法として、グループドクエリアテンション(Grouped-Query Attention, GQA)が提案されました。2025年現在、多くのオープンソースLLMがGQAを採用しており、事実上の標準技術となりつつあります。
アーキテクチャ
GQAでは、全ヘッドでKeyとValueを共有するのではなく、アテンションヘッドを $G$ 個のグループに分割し、各グループ内でKeyとValueを共有します:
\begin{align}
g &\in \{1, 2, \ldots, G\} \quad \text{(グループインデックス)} \\
Q_{h_g} &= X W_{h_g}^Q \quad \text{(ヘッドごとに固有)} \\
K_g &= X W_g^K \quad \text{(グループごとに固有)} \\
V_g &= X W_g^V \quad \text{(グループごとに固有)}
\end{align}
メモリ効率
GQAのKVキャッシュの要素数は:
\text{要素数(GQA)} = 2 \times L \times d_{\text{head}} \times G
となります。グループ数 $G$ を調整することで、精度とメモリ効率のトレードオフを柔軟に制御できます。$G = H$ の場合はMHAと等価であり、$G = 1$ の場合はMQAと等価になります。
Qwen3 8Bの場合
Qwen3シリーズのモデルはGQAを採用しています。Qwen3-8Bの場合、アテンションヘッド数$H=32$、グループ数$G=8$、ヘッド次元数$d_{\text{head}}=128$、アテンション層の数$N=36$です。
上記の式を利用して、全体のKVキャッシュを計算してみます。Qwen3の最大コンテキスト長は32,768なので、トークン列長さ$L=32768$としてみます。
\text{全体のKVキャッシュ [GB]} = 36 \times \frac{2 \times 32768 \times 128 \times 8 \times 2}{1024^3} = 4.5 [GB]
Qwen3-8Bモデルのパラメータによる容量は$8B \times 2 = 16[GB]$なので、合わせて最大$16 + 4.5= 20.5[GB]$のGPUメモリを消費することになります。
また、Qwen3シリーズのモデルはYarn設定をオンにすることで、最大コンテキスト長を131,072まで拡張できます。トークン列長さ$L=131072$としてKVキャッシュを再計算してみます。
\text{全体のKVキャッシュ [GB]} = 36 \times \frac{2 \times 131072 \times 128 \times 8 \times 2}{1024^3} = 18 [GB]
KVキャッシュがQwen3-8Bモデルのパラメータによる容量$16 GB$を上回りました。合計$16 + 18 = 34 [GB]$のGPUメモリを消費します。
KVキャッシュ計算サイト
KVキャッシュを自動で計算できる便利なツールも存在します。例えば、LMCache公式サイトでは、以下を入力すると即座に結果が得られます。
- Model:
Qwen/Qwen3-8B - Data Type:
bfloat(BF16) - Number of Tokens:
32768
出力結果:
KV Cache Size: 4.5000 GB
Calculation Details:
Selected Model: Qwen/Qwen3-8B
Hidden Size: 4096
Number of Attention Heads: 32
Number of Hidden Layers: 36
Number of Key-Value Heads: 8
Head Dimension: 128
Data Type Size: 2 bytes
Total Elements: 2 × 36 × 32768 × 8 × 128 = 2415919104
Total Bytes: 2415919104 × 2 = 4831838208 bytes
KV Cache Size: 4831838208 / (1024³) ≈ 4.5000 GB
こちらでも、KVキャッシュが4.5GBであることが確認できました。
終わりに
LLM推論に必要なGPUメモリ量(特に、KVキャッシュ)について解説されている日本語記事が少ないと感じたため、今回記事を作成しました。
本記事が、「どのGPUでどのモデルをどれくらいのトークンまで扱えるか」を考える際の参考になれば幸いです