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では文脈を短めにします。