推論最適化・実行基盤

llama.cppとは|層の9割を速い機材に置いても、残り1割で4.5倍遅いままだった

載らない分をどう扱うのか何ビットまで縮めれば載るのか起動にどれだけかかるのか

層の9割を速い機材に置いても、200トークン出すのに34.6秒かかりました。

全部を速い側に置けば7.7秒です。残した1割が全体を決めています

この記事の要点

  • 9割置いても4.5倍
  • 全部なら7.7秒
  • 700億は8GBに載らない
  • 24GBなら2bitまで

9割を速い側に置いても、4.5倍遅いまま

載りきらない分を混ぜて動かせます。ただし遅い側に残った層が、全体の時間を決めます。

llama.cppは、載りきらないモデルも動かせます。公式はVRAMの総容量より大きなモデルを部分的に速くするための、CPUとGPUを混ぜた推論を挙げています。

混ぜるとどれだけ速くなるのか。実際に計算して数えました。

速い側に置く割合を変える

text
層 32。速い機材なら1層 1.2ms、遅い側なら1層 46ms として計算する
200 トークン出す場合で比べる

速い側に置く割合  速い側の層  遅い側の層  1トークン  200トークン  全部速い側との比
              0%          0層         32層   1472.0ms       294.4秒             38.3倍
             25%          8層         24層   1113.6ms       222.7秒             29.0倍
             50%         16層         16層    755.2ms       151.0秒             19.7倍
             75%         24層          8層    396.8ms        79.4秒             10.3倍
             90%         29層          3層    172.8ms        34.6秒              4.5倍
            100%         32層          0層     38.4ms         7.7秒              1.0倍

半分を速い側に置いても、まだ19.7倍かかります。速くなった実感は出にくい水準です。

9割で4.5倍、全部置いて1.0倍です。最後の1割で4.5倍縮みます

遅い側の1層が効く

遅い側は1層46msで、速い側の38倍です。3層残るだけで138msになります。

速い側29層ぶんは34.8msですから、3層のほうが29層より4倍重いことになります。

だから「入るところまで置く」という判断は、全部入るかどうかで意味が変わります。縮めて全部載せる手は量子化の記事で扱いました。

全部載るまでは、置いた割合ほどには速くならない。

全部速い側に置いた場合との比(倍)速い側に置いた層の割合(%)→42.11100%25%50%75%90%100%層32・速い側1.2ms・遅い側46msでの計算。200トークンでは294.4秒から7.7秒まで変わる。
図1 ── 速い側に置いた割合と、全部置いた場合との比
出典llama.cpp 公式リポジトリ README2026-08-18 確認
CPU+GPU hybrid inference to partially accelerate models larger than the total VRAM capacity
原文llama.cpp 公式リポジトリ README この内容の有効期限2027-02-18

700億の重みは、24GBだと2bitまで落として載る

ビット数を選べます。手元の機材に載るかどうかは、その選び方で決まります。

llama.cppは、細かいビット数まで対応しています。公式はより速い推論と記憶の削減のための、1.5ビット・2ビット・3ビット・4ビット・5ビット・6ビット・8ビットの整数による量子化を挙げています。

どこまで縮めれば載るのか。実際に計算して並べました。

ビット数と規模を並べる

text
1つの重みを何ビットで持つかで、重み全体の大きさがどう変わるか

規模               16bit        8bit        6bit        4bit        3bit        2bit
30億               5.6 GB      2.8 GB      2.1 GB      1.4 GB      1.0 GB      0.7 GB
80億              14.9 GB      7.5 GB      5.6 GB      3.7 GB      2.8 GB      1.9 GB
700億            130.4 GB     65.2 GB     48.9 GB     32.6 GB     24.4 GB     16.3 GB

どの機材に載るか(重みだけで判断し、文脈の分は含めない)

機材                         30億             80億            700億
手元の8GB                  16bit まで         8bit まで            載らない
手元の24GB                 16bit まで        16bit まで         2bit まで
業務用80GB                 16bit まで        16bit まで         8bit まで

700億の重みは16bitで130.4GBです。8GBの機材には2bitにしても載りません

24GBなら2bitまで落として16.3GBです。ぎりぎり載るという水準になります。

文脈の分が別に要る

この表は重みだけを見ています。実際には文脈を覚えておく分が別に要ります

だから24GBで700億・2bitという組み合わせは、文脈をほとんど取れません。実用には1段階落とすか、規模を下げることになります。

縮めたときに品質がどう落ちるかは4bit量子化の記事で扱いました。

出典llama.cpp 公式リポジトリ README2026-08-18 確認
1.5-bit, 2-bit, 3-bit, 4-bit, 5-bit, 6-bit, and 8-bit integer quantization for faster inference and reduced memory use
原文llama.cpp 公式リポジトリ README この内容の有効期限2027-02-18

30GBの重みなら、起動までに46.1秒かかる

準備を減らすことを目指しています。それでも重みを読み込む時間は、大きさに比例します。

llama.cppは、準備の少なさを目指しています。公式はllama.cppの主な目標は、最小限の準備と、多くの種類の機材の上での最先端の性能によって、大規模言語モデルの推論を可能にすることであると述べています。

準備が少なくても、読み込みの時間は残ります。実際に計算して数えました。

重みの大きさを変える

text
重みを読み込む速さを 毎秒 900MB、それ以外の準備を 12秒として計算する
同じものを 6 本立てている場合の、入れ替え中に減る処理力を見る

重み      読み込み      起動まで      1本ずつ入れ替え      半分ずつ入れ替え      全部同時
  0.5 GB        0.6秒       12.6秒           75秒 / 減 17%             25秒 / 減 50%        13秒 / 減 100%
    2 GB        2.3秒       14.3秒           86秒 / 減 17%             29秒 / 減 50%        14秒 / 減 100%
    8 GB        9.1秒       21.1秒          127秒 / 減 17%             42秒 / 減 50%        21秒 / 減 100%
   30 GB       34.1秒       46.1秒          277秒 / 減 17%             92秒 / 減 50%        46秒 / 減 100%

0.5GBなら読み込みは0.6秒で、起動までの12.6秒のほとんどは準備の分です。

30GBでは読み込みが34.1秒になり、準備の12秒を追い越します。ここから先は重みが効きます

手元では1回きり

手元で動かす場合、入れ替えの列は関係しません。見るのは起動までの列だけです。

前の節で見たとおり、縮めれば重みは小さくなります。4bitなら16bitの4分の1で、起動も4分の1に近づきます

余談 この計測での注意

3つの計測はいずれも手元で書いた模型で、実際のllama.cppを動かしたものではありません。速い側1層1.2ms・遅い側1層46msという値は置いたもので、機材と量子化の組み合わせで大きく変わります。読み込み毎秒900MB、準備12秒も置いた値です。重みの大きさも、1つの重みあたりのビット数から単純に掛けた計算で、実際の書式には付随する情報が加わります。ここで見せているのは、遅い側に少し残るだけで全体が引きずられるという点と、載るかどうかがビット数の選び方で決まるという点の2つです。

出典llama.cpp 公式リポジトリ README2026-08-18 確認
The main goal of llama.cpp is to enable LLM (and VLM) inference with minimal setup and state-of-the-art performance on a wide range of hardware - locally and in the cloud.
原文llama.cpp 公式リポジトリ README この内容の有効期限2027-02-18

よくある質問

llama.cppは何を目指していますか
最小限の準備で、多くの種類の機材の上で最先端の性能を出すことだと説明されています。
機材に載らないモデルは動きますか
動きます。速い機材と遅い側を混ぜて、載りきらない分を部分的に速くできると説明されています。
分けて置くとどれだけ遅くなりますか
9割を速い側に置いても、全部置いた場合の4.5倍かかりました。
何ビットまで縮められますか
1.5ビットから8ビットまでの整数での持ち方に対応していると説明されています。

まとめ

  • 載らなくても動かせる
  • 残した層が時間を決める
  • 縮めれば載る幅が広がる
  • 文脈の分は別に要る

今日から始められること

  1. 手元の機材の容量を確かめる
  2. 重みの大きさをビット数ごとに出す
  3. 何層を速い側に置けるか数える
  4. 残る層の数から時間を見積もる

実務で組んだllama.cppのワークフローには、値段が付きます

同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。

出品の仕組みを見る