はじめに
前回の記事では、なぜローカルLLMでGPUが使われるのか、そしてVRAMがなぜ重要なのかについて整理しました。
また、モデルが大きくなるほど必要なVRAMも増えていくことについて触れました。
例えば7Bモデルのパラメータを16bitで保持した場合、単純計算では約14GBの容量が必要になります。
では、より大きなモデルを限られたVRAMで動かすことはできないのでしょうか。
そこで登場するのが、 量子化(Quantization) という技術です。
ローカルLLMのモデルを探していると、
- Q4
- Q8
- Q4_K_M
- Q5_K_M
- GGUF
といった表記を目にすることがあります。
今回は、
- そもそも量子化とは何なのか
- なぜ量子化が必要なのか
- 16bit・8bit・4bitでは何が違うのか
- Q4やQ8とは何なのか
- 量子化するとモデルの性能はどうなるのか
- Q4_K_Mなどの表記は何を意味しているのか
- GGUFとは何なのか
といった内容を中心に整理していきます。
量子化とは?
量子化とは、簡単に言えばモデルのパラメータをより少ないbit数で表現する技術です。
以前の記事で、LLMは数十億から数百億ものパラメータを持っていることを紹介しました。
例えば7Bモデルであれば、約70億個のパラメータを持っています。
これらのパラメータは数値として保存されています。
仮に1つのパラメータを16bitで保持すると、
70億 × 2Byte
│
▼
約14GB
となります。
そこで、パラメータをより少ないbit数で表現します。
例えば、
16bit
│
▼
8bit
│
▼
4bit
と情報量を減らすことで、モデルを小さくすることができます。
これが量子化の基本的な考え方です。
なぜ量子化が必要なのか
ローカルLLMでは、自分のPCに搭載されているGPUやメモリを使ってモデルを動かします。
前回の記事で整理したように、GPUで推論する場合はモデルのパラメータなどをVRAMへ読み込む必要があります。
例えば32Bモデルを16bitで保持すると、パラメータだけでも単純計算で、
320億 × 2Byte
│
▼
約64GB
となります。
一般的なPCに搭載されているGPUで、64GBものVRAMを用意することは簡単ではありません。
しかし、4bitまで量子化した場合は、
320億 × 0.5Byte
│
▼
約16GB
まで小さくできます。
非常に単純化すると、
32Bモデル
16bit
│
▼
約64GB
↓ 量子化
4bit
│
▼
約16GB
という関係になります。
もちろん実際に必要な容量やVRAMはこれだけで決まるわけではありません。
それでも、量子化によって大きなモデルを限られたハードウェアで動かしやすくなることが分かります。
16bit・8bit・4bitでは何が違う?
では、16bit・8bit・4bitでは何が違うのでしょうか。
大きな違いは、一つの数値を表現するために使用する情報量です。
bit数が多いほど、より細かく数値を表現できます。
イメージすると、
16bit
│
├─ より細かく数値を表現できる
│
└─ 必要なメモリが多い
8bit
│
├─ 情報量を減らす
│
└─ 必要なメモリも減る
4bit
│
├─ さらに情報量を減らす
│
└─ 必要なメモリもさらに減る
という関係になります。
単純計算では、16bitから8bitにすれば必要な容量は約半分、4bitにすれば約4分の1になります。
| 精度 | 1パラメータあたり | 7Bモデルの単純計算 |
|---|---|---|
| 16bit | 2Byte | 約14GB |
| 8bit | 1Byte | 約7GB |
| 4bit | 0.5Byte | 約3.5GB |
ただし実際のモデルファイルにはパラメータ以外の情報も含まれるため、必ずこのサイズになるわけではありません。
量子化すると何が起きる?
量子化によって必要なメモリを減らせるのであれば、
全部4bitにすればいいのでは?
と思うかもしれません。
しかし、量子化にはトレードオフがあります。
bit数を減らすということは、パラメータを表現できる細かさも減るということです。
例えば非常に単純化すると、
元の値
0.123456
0.128731
0.135842
細かく表現できる場合
0.123
0.129
0.136
表現できる値を減らした場合
0.12
0.13
0.14
のように、元の数値を近い値へ置き換えることになります。
このように情報を圧縮することで、モデルサイズを小さくしています。
そのため、
bit数を減らす
│
▼
モデルが小さくなる
│
▼
必要なメモリが減る
│
▼
一部の情報が失われる
という関係になります。
量子化の方法やモデルによって影響は異なりますが、基本的には量子化を強くするほど元のモデルとの性能差が発生する可能性があります。
Q4・Q8とは?
ローカルLLMのモデルを探していると、
Q4
Q8
といった表記をよく目にします。
この「Q」はQuantization、つまり量子化を表しています。
非常に大まかに考えると、
Q8
│
▼
8bit程度で量子化
Q4
│
▼
4bit程度で量子化
という意味になります。
一般的には、
Q8
│
├─ モデルサイズが大きい
│
└─ 元モデルの情報を比較的多く保持
Q4
│
├─ モデルサイズが小さい
│
└─ 必要なメモリも少ない
という違いがあります。
そのため、利用できるメモリ容量や求める品質などに応じて量子化方式を選択することになります。
Q4_K_Mなどの表記は何?
さらにモデルを探していると、
Q4_K_M
Q5_K_M
Q6_K
Q8_0
といった、さらに複雑な名前を目にすることがあります。
最初に見ると少し分かりにくいですが、それぞれ量子化の方式や精度などを表しています。
例えば、
Q4_K_M
│ │ │
│ │ └─ M
│ └─── K
└───── Q4
と分けて考えることができます。
Q4は、主に4bitを利用した量子化であることを表します。
Kは、llama.cppで利用されているK-quantと呼ばれる量子化方式を表します。
MはMediumを表し、モデル内の一部の重要なテンソルに異なる精度を使用する構成になっています。
同じQ4であっても、使用する量子化方式によってモデルサイズや品質が異なる場合があります。
そのため、
Q4ならすべて同じ
というわけではありません。
ローカルLLMでは、モデルと同じくらい「どの量子化方式を選ぶのか」も重要になります。
Q4とQ8ならどちらを選ぶ?
では、Q4とQ8ではどちらを選べば良いのでしょうか。
これは、利用できるハードウェアと求める品質によって変わります。
非常に単純化すると、
メモリに余裕がある
│
▼
Q8など高精度な量子化
│
▼
元モデルに近い品質を重視
メモリが限られている
│
▼
Q4など低bitの量子化
│
▼
モデルサイズを抑える
という考え方になります。
例えばQ8ではVRAMに収まらないモデルでも、Q4であれば収まる可能性があります。
その場合、
小さいモデルをQ8で使う
VS
大きいモデルをQ4で使う
という選択肢も出てきます。
必ずしも「高精度な量子化を選べば良い」というわけではなく、モデルそのものの大きさとのバランスも重要になります。
GGUFとは?
量子化されたローカルLLMを探していると、GGUFという言葉もよく登場します。
GGUFは、ローカルLLMで広く利用されているモデルファイル形式の一つです。
ここで注意したいのが、
GGUF = 量子化方式
ではないということです。
GGUFはあくまでモデルを保存するためのファイル形式です。
イメージとしては、
LLMモデル
│
▼
量子化
│
▼
Q4_K_Mなど
│
▼
GGUF形式で保存
│
▼
model.Q4_K_M.gguf
という関係になります。
GGUFにはモデルのパラメータだけではなく、モデルを実行するために必要となるさまざまな情報をまとめて保持できます。
ローカルLLMでよく利用されるllama.cppなどでは、このGGUF形式のモデルを読み込んで推論できます。
そのため、ローカルLLMのモデルを探していると、
model-Q4_K_M.gguf
model-Q5_K_M.gguf
model-Q8_0.gguf
といったファイルを目にすることがあります。
同じモデルでも、複数の量子化方式でGGUFファイルが提供されている場合があります。
GGUFと量子化の関係
GGUFと量子化は一緒に登場することが多いため、少し関係が分かりにくい部分です。
整理すると、
モデル
│
▼
量子化
│
├─ Q4_K_M
├─ Q5_K_M
└─ Q8_0
│
▼
GGUFファイル
という関係になります。
つまり、
- 量子化 = モデルの数値表現を小さくする技術
- Q4やQ8 = 量子化された精度や方式を表すもの
- GGUF = モデルを保存するファイル形式
という違いがあります。
それぞれ似た場面で登場しますが、役割は異なります。
量子化モデルを選ぶときに考えること
ここまで整理すると、量子化モデルを選ぶ際には単純にファイルサイズだけを見れば良いわけではないことが分かります。
例えば、
- 使用したいモデル
- パラメータ数
- 利用できるVRAMやRAM
- 量子化方式
- 求める回答品質
- 求める推論速度
などを考える必要があります。
イメージすると、
使いたいモデル
│
▼
モデルサイズ
│
▼
利用できるメモリ
│
▼
量子化方式を選択
│
▼
実際に動かして評価
という流れになります。
前回までの記事で整理したモデルサイズやVRAMの知識と組み合わせることで、
このモデルを使いたい
│
▼
そのままではVRAMに収まらない
│
▼
量子化モデルを検討
│
▼
Q4なら動かせそう
といった判断ができるようになります。
用語集
今回の記事で登場した用語を簡単に整理します。
| 用語 | 概要 |
|---|---|
| 量子化(Quantization) | モデルのパラメータをより少ないbit数で表現し、モデルサイズや必要なメモリ量を削減する技術。 |
| bit | コンピュータが扱う情報量の基本単位。量子化ではパラメータを表現する情報量に関係する。 |
| Q4 | 主に4bit程度を利用してモデルを量子化したもの。 |
| Q8 | 主に8bit程度を利用してモデルを量子化したもの。 |
| K-quant | llama.cppなどで利用される量子化方式の一つ。 |
| Q4_K_M | K-quantを利用した4bit系の量子化方式の一つ。 |
| GGUF | モデルのパラメータや実行に必要な情報などを保持できるモデルファイル形式。 |
| llama.cpp | LLMをローカル環境で実行するための推論エンジン。GGUF形式のモデルを利用できる。 |
| VRAM | GPUが利用するメモリ。量子化によってモデルに必要なVRAMを削減できる。 |
さいごに
モデル、GPU、VRAM、そして量子化と少しずつ知識がつながってきましたね。
ローカルLLMを正しい知識のもとで活用できるよう、引き続き理解を深めていきたいです。