<?xml version="1.0" encoding="utf-8" standalone="yes"?>
<rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom">
    <channel>
        <title>GPUチューニング on KnightLiブログ</title>
        <link>https://www.knightli.com/ja/tags/gpu%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0/</link>
        <description>Recent content in GPUチューニング on KnightLiブログ</description>
        <generator>Hugo -- gohugo.io</generator>
        <language>ja</language>
        <lastBuildDate>Thu, 23 Apr 2026 12:13:04 +0800</lastBuildDate><atom:link href="https://www.knightli.com/ja/tags/gpu%E3%83%81%E3%83%A5%E3%83%BC%E3%83%8B%E3%83%B3%E3%82%B0/index.xml" rel="self" type="application/rss+xml" /><item>
        <title>8GB VRAM で llama.cpp をどう調整するか: 32K の方が安定しやすく、64K では KV Cache 量子化が重要</title>
        <link>https://www.knightli.com/ja/2026/04/23/llama-cpp-8g-vram-32k-64k-kv-cache-tuning/</link>
        <pubDate>Thu, 23 Apr 2026 12:13:04 +0800</pubDate>
        
        <guid>https://www.knightli.com/ja/2026/04/23/llama-cpp-8g-vram-32k-64k-kv-cache-tuning/</guid>
        <description>&lt;p&gt;&lt;code&gt;8GB&lt;/code&gt; の VRAM でローカル LLM をスムーズに動かせるのか、特に長いコンテキストで速度を維持できるのかは、&lt;code&gt;llama.cpp&lt;/code&gt; を使う人がよく直面する問題です。&lt;/p&gt;
&lt;p&gt;まず覚えておきたいポイントは 3 つあります。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;8GB&lt;/code&gt; VRAM では、&lt;code&gt;32K&lt;/code&gt; コンテキストの方が安定したバランスになりやすい&lt;/li&gt;
&lt;li&gt;どうしても &lt;code&gt;64K&lt;/code&gt; を使いたいなら、&lt;code&gt;KV Cache&lt;/code&gt; の量子化がほぼ必須になる&lt;/li&gt;
&lt;li&gt;フル GPU 推論では、&lt;code&gt;CPU&lt;/code&gt; スレッド数をむやみに増やすとかえって遅くなることがある&lt;/li&gt;
&lt;/ul&gt;
&lt;h2 id=&#34;1-まず32k64kkv-cache-とは何か&#34;&gt;1. まず、32K・64K・KV Cache とは何か
&lt;/h2&gt;&lt;p&gt;この手の調整記事で最初につまずきやすいのが、この 3 つの用語です。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;32K&lt;/code&gt; と &lt;code&gt;64K&lt;/code&gt; はコンテキスト長を意味し、モデルが一度に処理できる &lt;code&gt;token&lt;/code&gt; 数の上限を表します。ここでの &lt;code&gt;K&lt;/code&gt; は千なので、&lt;code&gt;32K&lt;/code&gt; は約 &lt;code&gt;32000 token&lt;/code&gt;、&lt;code&gt;64K&lt;/code&gt; は約 &lt;code&gt;64000 token&lt;/code&gt; です。コンテキストが長いほど、モデルは一度により多くの過去情報を見られるため、長文読解、長い対話、複数段階の分析に向いています。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;KV Cache&lt;/code&gt; は、連続生成を高速化するためにモデルが保持する中間結果のキャッシュです。すでに読んで計算済みの部分を毎回最初から計算し直すのではなく、重要な中間情報を保存して再利用する仕組みだと考えるとわかりやすいです。&lt;code&gt;K&lt;/code&gt; と &lt;code&gt;V&lt;/code&gt; は Transformer の &lt;code&gt;Key&lt;/code&gt; と &lt;code&gt;Value&lt;/code&gt; を指します。&lt;/p&gt;
&lt;p&gt;この 3 つがいつも一緒に出てくるのは、次の関係があるからです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;32K&lt;/code&gt; と &lt;code&gt;64K&lt;/code&gt; は、一度にどれだけの内容を記憶させたいかを決める&lt;/li&gt;
&lt;li&gt;&lt;code&gt;KV Cache&lt;/code&gt; は、その記憶を維持するためにどれだけ追加の VRAM が必要かを決める&lt;/li&gt;
&lt;li&gt;コンテキストが長くなるほど &lt;code&gt;KV Cache&lt;/code&gt; は大きくなり、VRAM の負担も増える&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;そのため、長コンテキストで速度が落ちる原因は、モデルの計算能力不足というより、キャッシュが大きくなりすぎて VRAM が限界に近づくことにある場合が多いです。&lt;/p&gt;
&lt;h2 id=&#34;2-なぜ-32k-と-64k-で速度差が大きくなるのか&#34;&gt;2. なぜ 32K と 64K で速度差が大きくなるのか
&lt;/h2&gt;&lt;p&gt;たとえば《三体》の約 &lt;code&gt;3&lt;/code&gt; 万字を使って負荷テストを行い、&lt;code&gt;32K&lt;/code&gt; と &lt;code&gt;64K&lt;/code&gt; のコンテキストを比較すると、文章量が近くても &lt;code&gt;64K&lt;/code&gt; の方が大きく遅くなり、総処理時間もかなり長くなることがあります。&lt;/p&gt;
&lt;p&gt;原因はモデルが急に遅くなったからではなく、VRAM の境界にぶつかったからです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;32K&lt;/code&gt; では、モデルの重みとキャッシュがまだ &lt;code&gt;8GB&lt;/code&gt; VRAM の中にほぼ収まり、データは主に GPU メモリ帯域の中で処理されます。ところが &lt;code&gt;64K&lt;/code&gt; にするとキャッシュがさらに増え、総使用量が VRAM 上限に近づくか超えてしまい、一部データが共有メモリやシステムメモリに押し出されます。&lt;/p&gt;
&lt;p&gt;このとき落ちるのは演算性能そのものではなく、帯域です。&lt;/p&gt;
&lt;p&gt;つまり、「コンテキストを倍にしたら急に遅くなった」という現象の本質は、データ経路が VRAM からより遅いメモリへ落ちたことにあります。&lt;/p&gt;
&lt;h2 id=&#34;3-64k-を使うならkv-cache-量子化が重要&#34;&gt;3. 64K を使うなら、KV Cache 量子化が重要
&lt;/h2&gt;&lt;p&gt;&lt;code&gt;8GB&lt;/code&gt; VRAM 環境で特に重要なのが、&lt;code&gt;KV Cache&lt;/code&gt; の量子化です。&lt;/p&gt;
&lt;p&gt;モデル本体を変えず、キャッシュだけを量子化すると、長コンテキスト時のキャッシュ使用量を直接削減できます。すると、もともと VRAM からあふれていた一部のデータを 다시 VRAM 側に戻しやすくなります。その結果、&lt;code&gt;64K&lt;/code&gt; は依然として &lt;code&gt;32K&lt;/code&gt; より重いものの、最も遅い領域に落ち込みにくくなります。&lt;/p&gt;
&lt;p&gt;要するに、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;32K&lt;/code&gt; は &lt;code&gt;8GB&lt;/code&gt; VRAM における実用的な標準レンジ&lt;/li&gt;
&lt;li&gt;&lt;code&gt;64K&lt;/code&gt; も不可能ではない&lt;/li&gt;
&lt;li&gt;ただしキャッシュ量子化なしでは、「使える」から「かなり厳しい」へ一気に落ちやすい&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;長コンテキストを安定して使いたいなら、優先順位は次のようになります。&lt;/p&gt;
&lt;ol&gt;
&lt;li&gt;まず VRAM が上限に近づいていないか確認する&lt;/li&gt;
&lt;li&gt;次に &lt;code&gt;KV Cache&lt;/code&gt; 量子化を有効にするか判断する&lt;/li&gt;
&lt;li&gt;その後で、より攻めたスループット設定を試す&lt;/li&gt;
&lt;/ol&gt;
&lt;h2 id=&#34;4-gpu-使用率が低くてもgpu-が遊んでいるとは限らない&#34;&gt;4. GPU 使用率が低くても、GPU が遊んでいるとは限らない
&lt;/h2&gt;&lt;p&gt;これは直感に反しやすいポイントです。&lt;/p&gt;
&lt;p&gt;タスクマネージャーで &lt;code&gt;GPU&lt;/code&gt; 使用率が 20% や 30% しか見えないと、多くの人は次のように考えます。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;パラメータ設定が間違っているのではないか&lt;/li&gt;
&lt;li&gt;モデルが本当に GPU 上で動いていないのではないか&lt;/li&gt;
&lt;li&gt;GPU を使い切れていないのではないか&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;しかし &lt;code&gt;llama.cpp&lt;/code&gt; の推論では、ボトルネックがコア演算ではなくメモリ読み書きにあることがよくあります。&lt;/p&gt;
&lt;p&gt;つまり、GPU コアはあるバッチの計算をすぐ終えても、次の重みやキャッシュデータが届くまで待たされる、という状態です。&lt;/p&gt;
&lt;p&gt;その結果、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;コア使用率はそれほど高くない&lt;/li&gt;
&lt;li&gt;それでも全体の速度は伸びない&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という現象になります。&lt;/p&gt;
&lt;p&gt;これは GPU が怠けているのではなく、データ経路が狭いだけです。&lt;/p&gt;
&lt;p&gt;そのため、ローカル LLM の速度を見るときは &lt;code&gt;GPU Usage&lt;/code&gt; だけで判断してはいけません。VRAM 容量、メモリ帯域、キャッシュのあふれ方の方が重要なことが多いです。&lt;/p&gt;
&lt;h2 id=&#34;5-スループット関連パラメータは効くことがあるがvram-余裕が前提&#34;&gt;5. スループット関連パラメータは効くことがあるが、VRAM 余裕が前提
&lt;/h2&gt;&lt;p&gt;GPU コアが完全には埋まっていないなら、スループット関連の設定を上げて一度に処理するデータ量を増やし、GPU の並列性をもっと引き出せるのではないか、という考え方があります。&lt;/p&gt;
&lt;p&gt;これは実際に速度向上につながることがあります。&lt;/p&gt;
&lt;p&gt;ただし前提条件があります。VRAM にまだ余裕があることです。&lt;/p&gt;
&lt;p&gt;スループット関連の設定を上げると、VRAM 使用量も増えることが多いからです。すでに &lt;code&gt;64K&lt;/code&gt;、大きなキャッシュ、VRAM ぎりぎりという状態でさらに押し上げると、次のような結果になりがちです。&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;そのままクラッシュする&lt;/li&gt;
&lt;li&gt;クラッシュしなくても、より遅い共有メモリモードに落ちる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;したがって、より安全な順番は「最初に全部最大化する」ことではなく、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;まず VRAM の境界を守る&lt;/li&gt;
&lt;li&gt;次にスループット最適化を試す&lt;/li&gt;
&lt;li&gt;変更のたびに速度と安定性を確認する&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;という流れです。&lt;/p&gt;
&lt;h2 id=&#34;6-cpu-スレッドは多ければ多いほどよいわけではない&#34;&gt;6. CPU スレッドは多ければ多いほどよいわけではない
&lt;/h2&gt;&lt;p&gt;これも覚えておきやすい落とし穴です。&lt;/p&gt;
&lt;p&gt;スレッドが多いほど速いはずだ、と考えるのは自然です。しかし、モデルがすでに主に GPU で動いている場合、&lt;code&gt;CPU&lt;/code&gt; スレッド数を無理に増やすとかえって性能が落ちることがあります。&lt;/p&gt;
&lt;p&gt;理由は単純です。&lt;/p&gt;
&lt;p&gt;フル GPU 推論では、&lt;code&gt;CPU&lt;/code&gt; は主力の計算機というより、スケジューラや前処理補助の役割に近くなります。この状態でスレッドを増やしすぎると、CPU 側のスレッド競合、スケジューリング負荷、コンテキストスイッチのコストが大きくなり、本来スムーズであるべきデータの流れを乱してしまいます。&lt;/p&gt;
&lt;p&gt;結果として、&lt;/p&gt;
&lt;ul&gt;
&lt;li&gt;&lt;code&gt;CPU&lt;/code&gt; はより忙しそうに見える&lt;/li&gt;
&lt;li&gt;それでも全体は遅くなる&lt;/li&gt;
&lt;/ul&gt;
&lt;p&gt;ということが起きます。&lt;/p&gt;
&lt;p&gt;この種の構成では、デフォルト設定や低めのスレッド数の方が、全部を最大化するより安定しやすいです。&lt;/p&gt;
&lt;h2 id=&#34;7-8gb-vram-向けのより実用的な考え方&#34;&gt;7. 8GB VRAM 向けの、より実用的な考え方
&lt;/h2&gt;&lt;p&gt;ここまでの結論を実行しやすい形にまとめると、だいたい次のようになります。&lt;/p&gt;
&lt;h3 id=&#34;1-まず-32k-を標準目標にする&#34;&gt;1. まず 32K を標準目標にする
&lt;/h3&gt;&lt;p&gt;&lt;code&gt;8GB&lt;/code&gt; GPU なら、最初から &lt;code&gt;64K&lt;/code&gt; を狙いにいかない方が無難です。&lt;code&gt;32K&lt;/code&gt; の方が、速度・安定性・メモリ使用量のバランスが取りやすいことが多いです。&lt;/p&gt;
&lt;h3 id=&#34;2-64k-を使いたいならまずキャッシュを見る&#34;&gt;2. 64K を使いたいなら、まずキャッシュを見る
&lt;/h3&gt;&lt;p&gt;「あと少し速くできるか」より先に、&lt;code&gt;KV Cache&lt;/code&gt; が量子化されているか、VRAM がすでに限界付近ではないかを確認すべきです。&lt;/p&gt;
&lt;h3 id=&#34;3-gpu-使用率だけで判断しない&#34;&gt;3. GPU 使用率だけで判断しない
&lt;/h3&gt;&lt;p&gt;使用率が低いからといって設定ミスとは限りません。単にメモリ帯域が本当のボトルネックかもしれません。&lt;/p&gt;
&lt;h3 id=&#34;4-スループット最適化は有効だがvram-境界を越えない&#34;&gt;4. スループット最適化は有効だが、VRAM 境界を越えない
&lt;/h3&gt;&lt;p&gt;これらの設定は確かに効くことがありますが、前提は VRAM に余裕があることです。&lt;/p&gt;
&lt;h3 id=&#34;5-cpu-スレッドは保守的に始める&#34;&gt;5. CPU スレッドは保守的に始める
&lt;/h3&gt;&lt;p&gt;モデルがほぼ GPU 上で動いているなら、CPU スレッド数は高ければよいわけではありません。まずはデフォルトか低めで試し、必要なら少しずつ調整します。&lt;/p&gt;
&lt;h2 id=&#34;結論&#34;&gt;結論
&lt;/h2&gt;&lt;p&gt;この話の価値は、いくつかのベンチマーク数字そのものより、ひとつの見落とされがちな事実をはっきりさせてくれる点にあります。&lt;/p&gt;
&lt;p&gt;ローカル LLM の調整で本当に大事なのは、すべての設定を最大にすることではなく、ボトルネックが演算性能なのか、VRAM 容量なのか、メモリ帯域なのか、それとも &lt;code&gt;CPU&lt;/code&gt; のスケジューリングなのかを見極めることです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;8GB&lt;/code&gt; VRAM ユーザーにとって、より安全な方針は「最長コンテキストを無理に追う」ことではなく、まず VRAM の境界を守り、そのうえでどこまで伸ばすかを判断することです。&lt;/p&gt;
&lt;p&gt;ひとことでまとめるなら、こうです。&lt;/p&gt;
&lt;p&gt;&lt;code&gt;32K&lt;/code&gt; は &lt;code&gt;8GB&lt;/code&gt; VRAM でより安定しやすい作業レンジであり、&lt;code&gt;64K&lt;/code&gt; も不可能ではないが、その前提として &lt;code&gt;KV Cache&lt;/code&gt; と VRAM 使用量をしっかり管理できている必要がある。&lt;/p&gt;
</description>
        </item>
        
    </channel>
</rss>
