3行でいうと
- 量子化は、1つの数字に使うビット数を減らして、モデルを小さくする方法。
- 27Bは元が約54GBだが、4ビットのSplash版は14.1GiB(約15GB)で、32GBのMacに載る。
- 大きさは「パラメータ数×ビット数÷8」で見積もる。倍率の情報の分、少し大きくなる。
- 測定では5〜6ビットはほぼ変わらず、4ビットで少し差が出る。見立てでは、迷ったら4ビット。
27B(270億パラメータ)のモデルは、4ビットにすると約14GBになり、メモリ32GBのMacに載ります。その理由を、計算の根拠から順に説明します。Q4_K_Mという名前の読み方、MLXの4bitとの違い、品質の落ち方、ビット数の選び方も扱います。
計算の根拠
AIモデルの中身は、大量の数字(重み)です。パラメータとは、その個数のことです。Hugging Faceの公式ページによると、Qwen3.8-27Bは「27B」で、重みの精度は「BF16」です。BF16は、1つの数字を16ビット(2バイト)で表します。
27,000,000,000個 × 2バイト = 約54GB
54GBは、32GBのMacには載りません。そこで、1つの数字に使うビット数を減らします。これが量子化です。数字を粗く丸めるので、目盛りの細かい定規を、粗い定規に替えるイメージです。少し誤差は出ますが、おおよその値は分かります。
式にすると、次のとおりです。
ファイルの大きさ(バイト)= パラメータ数 × 1個あたりのビット数 ÷ 8
4ビットなら、27B×4÷8=13.5GBです。元の約4分の1です。
llama.cppの公式の表で、式を確かめます。Llama-3.1-8Bの16ビット版は14.96GiBでした。80億個×2バイト=約16GB(約15GiB)なので、合っています。
実際は13.5GBより少し大きい
量子化は、数字を小さなグループに区切って、グループごとに「倍率」を持たせます。4ビットで表せる値は16通りだけなので、「このグループの範囲を16段階に分ける」と決めておくのです。この倍率の情報も、ファイルに入ります。
Splash版(Qwen3.8-27Bの4ビット版)のページでは、本体が「14.1 GiB」です。1GiBは約1.07GBなので、約15.1GBです。前の記事では「約14GB」と書きましたが、表記はGiBでした。1個あたりに直すと、約4.5ビットになります。これは筆者の計算です。4ビットに、倍率の分の0.5ビットが足された形です。
ビット数ごとの27Bの目安は、次のとおりです。ビット数は、倍率の分まで含めた値で、llama.cppの公式の表(Llama-3.1-8Bでの値)から借りました。大きさは、筆者の計算です。
| 形式 | 1個あたりのビット数 | 27Bの目安 |
|---|---|---|
| 元の形式(BF16) | 16 | 約54.0GB |
| Q8_0 | 8.50 | 約28.7GB |
| Q5_K_M | 5.70 | 約19.3GB |
| Q4_K_M | 4.89 | 約16.5GB |
| Q4_K | 4.5 | 約15.2GB |
| Q2_K | 3.16 | 約10.7GB |
実物のファイルは、モデルによって少しずれます。
32GBで本当に足りるか
足ります。ただし、メモリにはモデル本体のほかに、会話の長さの分の作業用メモリ(KVキャッシュ)と、macOSやほかのアプリも載ります。Macは、CPUとGPUが同じメモリを使います。ある解説では、32GBのMacでモデルに使えるのは約24GBで、macOSとブラウザなどに6〜10GBを見ておく、とされています。
作業用メモリは、大きくなることがあります。Gemma 4 31Bを64GBのMacで動かした記事では、標準の文脈の長さ(256Kトークン)に約21GBが必要でした。4ビットで約20GBのモデル本体と合わせると、大きな量です。
27Bの4ビット(約15GB)なら、文脈の長さを抑えれば、32GBに収まります。8ビットは約29GBで、載りません。前の記事で書いたとおり、Splashの公式条件は36GB以上なので、32GBでは文脈を短めにします。
