層の9割を速い機材に置いても、200トークン出すのに34.6秒かかりました。
全部を速い側に置けば7.7秒です。残した1割が全体を決めています。
載りきらない分を混ぜて動かせます。ただし遅い側に残った層が、全体の時間を決めます。
llama.cppは、載りきらないモデルも動かせます。公式はVRAMの総容量より大きなモデルを部分的に速くするための、CPUとGPUを混ぜた推論を挙げています。
混ぜるとどれだけ速くなるのか。実際に計算して数えました。
層 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層46msで、速い側の38倍です。3層残るだけで138msになります。
速い側29層ぶんは34.8msですから、3層のほうが29層より4倍重いことになります。
だから「入るところまで置く」という判断は、全部入るかどうかで意味が変わります。縮めて全部載せる手は量子化の記事で扱いました。
全部載るまでは、置いた割合ほどには速くならない。
CPU+GPU hybrid inference to partially accelerate models larger than the total VRAM capacity原文llama.cpp 公式リポジトリ README この内容の有効期限2027-02-18
ビット数を選べます。手元の機材に載るかどうかは、その選び方で決まります。
llama.cppは、細かいビット数まで対応しています。公式はより速い推論と記憶の削減のための、1.5ビット・2ビット・3ビット・4ビット・5ビット・6ビット・8ビットの整数による量子化を挙げています。
どこまで縮めれば載るのか。実際に計算して並べました。
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量子化の記事で扱いました。
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
準備を減らすことを目指しています。それでも重みを読み込む時間は、大きさに比例します。
llama.cppは、準備の少なさを目指しています。公式はllama.cppの主な目標は、最小限の準備と、多くの種類の機材の上での最先端の性能によって、大規模言語モデルの推論を可能にすることであると述べています。
準備が少なくても、読み込みの時間は残ります。実際に計算して数えました。
重みを読み込む速さを 毎秒 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秒を追い越します。ここから先は重みが効きます。
手元で動かす場合、入れ替えの列は関係しません。見るのは起動までの列だけです。
前の節で見たとおり、縮めれば重みは小さくなります。4bitなら16bitの4分の1で、起動も4分の1に近づきます。
3つの計測はいずれも手元で書いた模型で、実際のllama.cppを動かしたものではありません。速い側1層1.2ms・遅い側1層46msという値は置いたもので、機材と量子化の組み合わせで大きく変わります。読み込み毎秒900MB、準備12秒も置いた値です。重みの大きさも、1つの重みあたりのビット数から単純に掛けた計算で、実際の書式には付随する情報が加わります。ここで見せているのは、遅い側に少し残るだけで全体が引きずられるという点と、載るかどうかがビット数の選び方で決まるという点の2つです。
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
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る