ニュース

3値重みを1トリットあたり1.6ビットでパッキング

巧妙な固定小数点トリックにより、5桁の3進数を8ビットに99%の効率で詰め込み、LLM推論向けの高速SIMD展開を実現。

July 21, 2026· 1 min read
3値重みを1トリットあたり1.6ビットでパッキング

BitNet b1.58の論文では3値重み(-1, 0, 1)が使われているが、単純に格納するとスペースが無駄になる。理論上の最小値はlog₂(3) ≈ 1.585ビット/トリット。実用的な方式はこれに近づきつつ、現代のハードウェアで高速な並列展開を可能にする必要がある。

なぜ1バイトあたり5トリットか

5桁の3進数は3⁵ = 243通りの状態を表し、8ビット(256通り)にぴったり収まる。これは1.6ビット/トリットであり、理論限界の99.06%に相当する。次に良いブロックサイズ(3トリットを5ビット、4トリットを7ビット)は効率が劣るか、バイト境界に合わない。

固定小数点トリック

核となる洞察:パックされたバイトを[0, 1)の固定小数点数とみなす。3を掛けて整数部を取り出せば最上位トリットが得られ、残りの小数部で繰り返す。除算や剰余は不要——乗算とビットシフトだけで済み、SIMDに最適。

パッキングには天井割り算が必要:b = ((b * 256) + 242) / 243。展開はb = b * 3; trit = b >> 8; b = b & 0xFFのタイトループ。

著者はこれをllama.cppに実装し、TriLMおよびBitNet b1.58の推論向けにAVX2とNEONのSIMDパスを用意した。プルリクエストはこちら

LLMにとっての重要性

3値量子化はモデルサイズを劇的に削減する——BitNet b1.58では重みあたり平均1.58ビット。効率的なパッキングと展開は、特にCPU上での推論スループットに直接影響する。この手法は、密度をわずかに犠牲にしてデコード速度で大きな利益を得る、見事な例である。