0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

LLM推論時のGPUメモリ消費量の計算方法

Last updated at Posted at 2025-10-24

はじめに

フルマネージドな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でどのモデルをどれくらいのトークンまで扱えるか」を考える際の参考になれば幸いです

0
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
0
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?