Multi-Query Attention(MQA)(マルチクエリアテンション)
全QueryヘッドがKey/Valueヘッドを1つ共有するアテンション機構。KVキャッシュを最小化することで推論速度を大幅に向上させるが、モデル品質はMHAより若干低下する傾向がある。
Multi-Query Attention(MQA)とは
Multi-Query Attention(MQA)は、2019年にGoogleのNoam Shazeer(Transformerの原著者の一人)が提案したアテンション機構の効率化手法です。Transformerの推論ボトルネックであるKVキャッシュのメモリ帯域幅問題を解決することを目的としています。
仕組み
標準的なMHAとの違い
MHAでは Qヘッド数 = Kヘッド数 = Vヘッド数 = H であり、KVキャッシュサイズは 2 × H × d_k × seq_len となります。一方MQAでは Qヘッド数 = H(維持)に対し Kヘッド数 = Vヘッド数 = 1(大幅削減)となるため、KVキャッシュサイズは 2 × 1 × d_k × seq_len(H分の1)となります。
計算プロセス
全てのQueryヘッドが同一のK/Vに対してアテンションを計算します:
for i in range(H):
attn_i = softmax(Q_i @ K.T / math.sqrt(d_k)) @ V
# KとVはヘッドiに関係なく共通
採用モデルと歴史
2019年に論文発表(Shazeer "Fast Transformer Decoding")→ 2022年にPaLM 540BでGoogleが大規模採用 → 2022年にFalcon 7B/40BでMQAにより高速推論実現 → 2022年にStarCoderのコード生成モデルで採用 → 2023年以降にLlama 2でGQAに移行し、MQAは減少傾向。
MQAの長所と短所
長所:
- KVキャッシュが最小 → 長コンテキスト・大バッチでのメモリ効率が最高
- 推論速度が最速(メモリ帯域幅律速の解消)
- 実装がシンプル
短所:
- モデル品質がMHAより低下(表現力が落ちる)
- ファインチューニング時に品質差が現れやすい
- GQAの登場で現在は採用が減少
GQAへの移行
MQAはGQAに発展的に置き換えられています。GQAはグループ数Gのパラメータ調整でMHA(G=H)とMQA(G=1)の中間点を選べます:
# GQAでMQA相当の設定(グループ数=1)
config_mqa = {"num_attention_heads": 32, "num_key_value_heads": 1}
# GQAでバランスの良い設定
config_gqa = {"num_attention_heads": 32, "num_key_value_heads": 8}
推論エンジンでのMQA処理
llama.cpp・vLLM・TensorRT-LLMなどはMQAを自動認識して最適化します:
# llama.cppでMQAモデルを高速推論
./llama-cli \
--model falcon-7b.gguf \
--ctx-size 4096 \
--batch-size 512 \
-p "次のコードを説明して:"
2026年時点では、MQAは歴史的重要性を持つ技術として理解しておく価値があります。新規モデルのほとんどはGQAを採用し、MQAはほぼレガシーとなっています。ただし「KVキャッシュのメモリ帯域幅問題」という根本課題はGQAにも引き継がれており、LLM推論最適化の基礎知識として依然として重要です。