4bitで持つとき、目盛りを表全体で1つにすると誤差は19.81%でした。32個ごとに持つと9.70%まで下がります。
代わりに容量が戻ります。12.5%から14.1%へ。それでも8bitの25.0%よりは小さいままです。
目盛りを持つ群の大きさを変えて測りました。細かくするほど誤差は下がりますが、容量が戻ります。
INT4で群の大きさを変えると何が起きるのかを、実際に計算して測りました。使ったのは512×768の重みの表、393,216個です。
4bitで持てる刻みは16段階しかありません。その16段階をどの範囲に割り当てるかが、群の大きさで決まります。
def quant_group(x, bits, g):
qmax = 2 ** (bits - 1) - 1
blocks = flat.reshape(-1, g)
s = np.max(np.abs(blocks), axis=1, keepdims=True) / qmax
q = np.clip(np.round(blocks / s), -qmax - 1, qmax)
return (q * s).reshape(x.shape), blocks.shape[0]
群の大きさ 目盛りの数 相対誤差 本体 目盛り 合計 32bitとの比 全体で1つ 1 19.81% 192.0KB 0.0KB 192.0KB 12.5% 4096個ごと 96 15.78% 192.0KB 0.2KB 192.2KB 12.5% 1024個ごと 384 14.23% 192.0KB 0.8KB 192.8KB 12.5% 256個ごと 1,536 12.61% 192.0KB 3.0KB 195.0KB 12.7% 128個ごと 3,072 11.73% 192.0KB 6.0KB 198.0KB 12.9% 64個ごと 6,144 10.76% 192.0KB 12.0KB 204.0KB 13.3% 32個ごと 12,288 9.70% 192.0KB 24.0KB 216.0KB 14.1%
上の表を見てください。全体で1つの目盛りだと19.81%だったものが、32個ごとにすると9.70%まで下がりました。
群を12,288分の1にしても、誤差は半分にしかなりません。4096個ごとから32個ごとへ128倍細かくして、15.78%から9.70%です。
16段階しかないという制約は変わらないためです。目盛りをどこに置いても、刻みの粗さは残ります。
32個ごとだと目盛りが12,288個必要になり、24.0KBを占めます。本体192.0KBに対して12.5%です。
合計では12.5%から14.1%に戻りました。それでも8bitの25.0%よりは小さいままです。
細かくするほど誤差は下がるが、下がり方は緩やか。
reducing the bitwidth down to 3 or 4 bits per weight, with negligible accuracy degradation原文Frantar et al.「GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers」 この内容の有効期限2027-02-18
1つの重みを4bitで表します。刻みは16段階しかないので、目盛りの置き方が効きます。
INT4は、1つの重みを4bitの整数で持つ方式です。32bitの8分の1になります。
4bitで表せるのは16通りです。符号を含めると、マイナス8からプラス7までの整数になります。
この16段階を、実際の値の範囲に割り当てます。範囲が広いほど、1段階の刻みが粗くなります。前の節で群の大きさが効いたのはこのためです。
多くの場合、学習が終わったモデルに対して後から適用します。学習をやり直す必要はありません。
代表的な手法も、近似的な二次の情報にもとづく、一度きりの重みの量子化の方法として提案されています。1回の処理で終わる形です。
同じ手法は、1750億のパラメータを持つモデルを、およそ4GPU時間で量子化できると報告しています。
効果も規模で語られています。1750億のモデルを、初めて1つのGPUのなかで実行できるようにしたとされています。
使ったのは正規分布から作った人工の表で、実際のモデルの重みではありません。実際の手法は、どの値を優先して合わせるかを計算で決めるので、この計測より誤差は小さくなります。ここで見せているのは、群の大きさと容量の釣り合いという構造です。落とし方そのものは量子化の記事で扱っています。
a new one-shot weight quantization method based on approximate second-order information原文Frantar et al.「GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers」 この内容の有効期限2027-02-18
容量をそろえると、4bitと8bitの差がはっきりします。誤差は1桁以上違いました。
INT4を選ぶかどうかは、同じ容量にそろえて比べると判断しやすくなります。実際に並べました。
精度 群の大きさ 合計 32bitとの比 相対誤差 8bit 全体で1つ 384.0KB 25.0% 1.09% 8bit 1024個ごと 384.8KB 25.0% 0.78% 4bit 128個ごと 198.0KB 12.9% 11.73% 4bit 64個ごと 204.0KB 13.3% 10.76% 4bit 32個ごと 216.0KB 14.1% 9.70%
8bitで群を細かくすると、容量はほぼ変わらないまま誤差が1.09%から0.78%になりました。
4bitは容量が半分近くまで下がる代わりに、誤差が9.70%から11.73%です。1桁以上の開きがあります。
3番目は見落とされがちです。8bitで1024個ごとにしても容量は384.8KBで、全体で1つの384.0KBとほぼ同じでした。
4bitを選ぶ理由は載るかどうかです。冒頭で引いた手法も、規模の大きなモデルを1つのGPUで動かせるようにしたことを成果として挙げています。
つまり誤差と引き換えに、動かせる場所を増やしているという関係です。載るなら8bitのほうが素直です。
容量をそろえると、誤差の差がはっきりする。
allowing us for the first time to execute an 175 billion-parameter model inside a single GPU原文Frantar et al.「GPTQ: Accurate Post-Training Quantization for Generative Pre-trained Transformers」 この内容の有効期限2027-02-18
同じ課題を持つ会社にとって、動いている設定は「作る時間」を買えるということです。ServiceDockは自作のワークフローやテンプレートを出品できるマーケットプレイスです。手数料や出品の流れは出品者向けページにまとまっています。
出品の仕組みを見る