StreamingLLM(ストリーミングエルエルエム)
MITとMetaが共同開発した無限長ストリーミングに対応するLLM推論手法。アテンションシンクトークンをKVキャッシュに保持しながらスライディングウィンドウで効率的に処理する。ICLR 2024採択。
StreamingLLM
StreamingLLM(Efficient Streaming Language Models with Attention Sinks)は、MITとMetaが共同で2023年に発表し、ICLR 2024に採択された研究で、学習済みLLMへの変更なしで無制限長のテキストシーケンスを安定して処理する推論手法を提供する。
アテンションシンクの発見
StreamingLLMの核心となる発見は「アテンションシンク(Attention Sink)」と呼ばれる現象:LLMのアテンション層を分析すると、シーケンスの最初の1〜4トークンが実際の意味的重要度とは無関係に、ほぼすべてのアテンションヘッドで異常に高いアテンション値を受け取る。
なぜこれが起きるのか: softmaxアテンションは全トークンへのアテンション重みの和が1になる必要がある。現在の予測に本質的に不要な情報でも「ダミーのアテンション先」として冒頭トークンに集中する傾向がある。これはモデルが「ここには注意しなくていい」という信号を冒頭に送ることで、実質的に関係ないトークンへの意図しないアテンションを避けるメカニズムと解釈できる。
動作原理
通常のKVキャッシュ(学習コンテキスト4096で学習):
[token 1, 2, ..., 4096] → 4097番目のトークンが来るとクラッシュ
StreamingLLM:
┌─────────────────┬──────────────────────────────┐
│ Attention Sinks │ Sliding Window Cache │
│ [tok 1, 2, 3, 4] │ [tok N-W, ..., tok N-1, tok N] │
└─────────────────┴──────────────────────────────┘
└─ 常に保持(~4トークン) └─ スライディング(W≈1000-4000)
KVキャッシュ管理
# StreamingLLM KVキャッシュ更新のイメージ
class StreamingKVCache:
def __init__(self, sink_size=4, window_size=2048):
self.sink_size = sink_size
self.window_size = window_size
self.sink_cache = None # 冒頭シンクトークン(常に保持)
self.recent_cache = [] # 直近ウィンドウ
def update(self, new_kv):
if self.sink_cache is None:
# 最初の数トークンをシンクとして保存
self.sink_cache = new_kv[:self.sink_size]
else:
self.recent_cache.append(new_kv)
if len(self.recent_cache) > self.window_size:
self.recent_cache.pop(0) # 古いキャッシュを削除
def get_cache(self):
return torch.cat([self.sink_cache] + self.recent_cache, dim=0)
パフォーマンス特性
メモリ: O(sink_size + window_size) = 定数(入力長に依存しない) スループット: 標準的なスライディングウィンドウより20〜22倍高速(Sink保持あり vs なし比較) 安定性: シンクなし・ウィンドウのみの場合はperplexityが爆発的に増加するが、StreamingLLMは安定
プリセンテッドシンク(Prepended Sink)
StreamingLLMは学習時に意図的なシンクトークンを追加する「プリセンテッドシンク」手法も提案:
学習時: [SINK_TOKEN] + [通常入力]
推論時: [SINK_TOKEN] のKVキャッシュを常に保持
これにより学習済みモデルではなく、新しくファインチューニングされたモデルでより安定したシンク動作を保証できる。
実際の応用
- カスタマーサポートBot: 数時間の会話でもメモリ増加なし
- コーディングエージェント: 長期セッションでの継続的なコーディング支援
- ライブ翻訳: リアルタイムストリーミング翻訳(テレビ字幕等)
- 文書監視: 継続的に更新されるログファイル・ニュースフィードの分析
制限事項
StreamingLLMは全コンテキストを保持しないため「中間の情報が失われる」問題がある。文書の全体的な理解が必要なタスクではYaRNやLM-Infiniteのような手法との組み合わせ、またはRetrieval-Augmented Generationとの併用が推奨される。
StreamingLLMの「アテンションシンク」発見はLLMの内部動作の理解を深めただけでなく、KVキャッシュ最適化の方向性を示した重要な研究として位置づけられている。