1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?

ゼロから学ぶローカルLLM #5 量子化とは? Q4・Q8・GGUFを理解する

1
Posted at

はじめに

前回の記事では、なぜローカル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を正しい知識のもとで活用できるよう、引き続き理解を深めていきたいです。

1
0
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
1
0

Delete article

Deleted articles cannot be recovered.

Draft of this article would be also deleted.

Are you sure you want to delete this article?