メモリとモデル

KVキャッシュとは:会話に必要なメモリを考える

モデルファイル自体は変わりませんが、会話が長くなるにつれてメモリ使用量が増えていきます。新しいモデルを取得していないのに、なぜより多くの空間が必要になるのでしょうか?その理由は、会話の続きを生成するために保存されている計算記録(KVキャッシュ)があるからです。KVキャッシュを理解することで、長い会話で発生するメモリ不足を説明できます。

毎回最初から計算しないように

次のトークンを生成するには、以前に読み込み・書き込みした内容を参照する必要があります。既に処理済みの部分を毎回再計算すると大きな無駄になります。KVキャッシュは、アテンションに必要なkeyとvalueの状態を保持することで、この繰り返しを減らします。

チャット内容をテキストでコピーしたファイルとは異なります。モデルの複数の層で使用される計算状態であり、ユーザーが見ている数行の文よりも多くの空間が必要になる可能性があります。ダイアログ画面に残っている文字数だけではキャッシュ容量を正確に把握することはできません。

長い入力で計算したキーや値を引き出しに保存し、次のトークン生成時に再び取得して使うKVキャッシュ図
KVキャッシュは、以前の入力の計算値を保存して再計算を減らし、文脈が長くなるにつれて保存空間も大きくなります。

短い質問では気づかなかったメモリの負担

最初は短い質問一つだけだったため、余裕があったかもしれません。長いドキュメントを投入して応答を継続すると、入力と出力の計算状態が増えていきます。同じモデルでも、文脈長、構造、あるいはKVキャッシュの精度によってメモリ使用量が変化します。

複数の会話が同時に実行される場合、各リクエストの状態を保持する必要があります。モデルの重みを一度読み込んでも、他のユーザーがほとんど空間を消費しないとは限りません。チームサーバーを準備する場合は、1人のユーザーの最大コンテキスト長と同時に処理されるリクエスト数を同時に調整する必要があります。

応答トークンが増えるにつれ、キーアンドバリーカードがペアをつくりキャッシュの引き出しに積もる図
各トークンはレイヤごとのキーや値を残すため、文脈長、レイヤ数、並列リクエスト数が大きくなるほどKVキャッシュは急速に増大します。

モデルをQ4で受信しましたが、キャッシュはなぜそのままですか?

重みの量子化とKVキャッシュの量子化は異なる設定です。Q4モデルを受け取ったとしても、キャッシュは別の精度で保存できます。サポートされる場合、キャッシュを8ビットまたは4ビットに減らして、長いコンテキストに必要な空間を節約できます。

ただし、変換や計算の負担が増えたり、作業によって品質に差が出たりする可能性があります。メモリに余裕がある短い会話で、必ず速くなる設定とはいえません。同じ文書への回答と速度を確かめながら、必要な分だけ変えてください。

高精度なKVキャッシュと、少ないビットで圧縮された小さなKVキャッシュを並べた図
KVキャッシュの量子化は長いコンテキストのメモリを減らすことができるが、サポートされるカーネルや品質、速度の変化を同時に確認する必要があります。

古い記録を消すと終わりますか?

キャッシュに上限を設け、古い状態を削除する方法もあります。空間を制限することはできますが、初期の詳細情報が直接参照されなくなる可能性があります。モデルが元の近くのコンテキストのみを観察する構造なのか、プログラムが任意に記録を切り抜いているのかを区別する必要があります。

対話の初期条件を後に再び確認するような処理であれば、この差が重要です。メモリ使用量が減ったことだけを成功として終了せず、最初に伝えられた数字やリクエストが回答に保持されているかを確認すべきです。

メモリ不足が示す次の選択肢

キャッシュの問題であれば、モデル全体を変更する前に、入力長と同時リクエスト、キャッシュの精度を検証できます。逆に常に長いドキュメントが必要であり、圧縮後でも望ましい品質を得られない場合は、より大きなメモリが必要であることが明確になります。

デバイスを選択する際、ファイルが含まれていることの後に「対話はどれくらい続くか」という項目を付けましょう。最初の挨拶に返答するデバイスではなく、実際に作業が終了するまで一緒に進める構成を検討してください。