ニュース
3値重みを1トリットあたり1.6ビットでパッキング
巧妙な固定小数点トリックにより、5桁の3進数を8ビットに99%の効率で詰め込み、LLM推論向けの高速SIMD展開を実現。
July 21, 2026· 1 min read

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上での推論スループットに直接影響する。この手法は、密度をわずかに犠牲にしてデコード速度で大きな利益を得る、見事な例である。
ディスカッション
0 件のコメント
最初のコメントを投稿しましょう。