AIモデルとプラットフォーム
マイクロソフトの推論フレームワーク「BitNet.cpp」が1ビット大規模言語モデルをローカルデバイスに導入
2024年10月17日、マイクロソフトは、1ビット量子化大規模言語モデル(LLM)を実行するための推論フレームワーク「BitNet.cpp」を発表しました。BitNet.cppは、Gen AIにおける重要な進歩であり、1ビットLLMを標準CPUで効率的に展開できるようにします。この開発により、LLMのアクセスが民主化され、幅広いデバイスで利用可能になり、オンデバイスAIアプリケーションに新たな可能性が生まれます。
1ビット大規模言語モデルの理解
大規模言語モデル(LLM)は、従来、高精度浮動小数点数(通常FP16またはBF16)をモデル重みに使用していたため、重大な計算リソースを必要としました。この必要性により、LLMの展開が高価でエネルギー消費の多いものとなりました。
1ビットLLMの核となる部分は、極端な量子化技術を使用して、モデル重みを-1、0、1の3つの値のみで表現することです。したがって、「1.58ビット」(3つの状態を符号化するためにわずかに1ビット以上が必要であるため)という用語が使用されます。
3値重みシステム
概念
BitNet.cppの1ビット量子化は、3値重みシステムです。BitNetは、各パラメータに以下の3つの値のみを使用します。
- -1(負の値)
- 0(中立の値)
- 1(正の値)
これにより、約1.58ビットのパラメータごとのストレージ要件が生じ、BitNet b1.58という名前が付けられます。このパラメータビット幅の劇的な削減により、メモリ使用量と計算複雑性が大幅に削減され、ほとんどの浮動小数点乗算が単純な加算と減算に置き換えられます。
数学的基礎
1ビット量子化には、重みと活性化を以下の手順を通じて3値表現に変換することが含まれます。
1. 重みの2値化
重みを2値化するには、重みを平均(α)を中心に配置し、3値表現を得る必要があります。数学的には、次のように表されます。
Wf=Sign(W−α)
ここで:
- Wは元の重み行列です。
- αは重みの平均です。
- Sign(x)は、x > 0の場合+1を返し、さもなくば-1を返します。
2. 活性化の量子化
活性化の量子化により、入力が指定されたビット幅に制限されます。
x^e=Quant(x)=Clip(γx×Qb,−Qb+ϵ,Qb−ϵ)
ここで:
- Qb = 2(b−1)2^{(b-1)}は、bビット幅の最大量子化レベルです。
- γは、xの最大絶対値(∣∣x∣∣∞で表されます)です。
- εは、計算中にオーバーフローを防ぐための小さな数です。
3. BitLinear演算
BitLinearレイヤーは、従来の行列乗算を簡略化された演算に置き換えます。
y=Wf×x^e×(Qbβγ)
ここで:
- βは、近似エラーを最小限に抑えるためのスケーリング係数です。
- γは活性化をスケーリングします。
- Q_bは量子化係数です。
この変換により、計算が効率的に行われる同时に、モデル性能が維持されます。
パフォーマンスの影響
メモリ効率
3値重みシステムは、メモリ要件を大幅に削減します。
- 従来のLLM:重みごとに16ビット
- BitNet.cpp:重みごとに1.58ビット
この削減により、約90%のメモリ節約が可能になり、従来の16ビットモデルと比較して、同じハードウェア制約内でより大きなモデルを格納できるようになります。
1. 推論速度:CPUの両方で高速化
推論速度は、1秒あたりに処理されるトークンの数として表されます。以下は、観察結果の概要です。
- Apple M2 Ultraで:BitNet.cppは、Llama.cppと比較して、大きなモデル(30B)で最大5.07倍の高速化を達成し、125Mモデルのピーク速度は593.43トークン/秒で、1.37倍の高速化を実現します。3.8Bおよび7Bの大きいモデルでは、BitNet.cppは84.77トークン/秒以上の速度を維持し、スケール全体で効率性を示しています。
- Intel (INTC ) i7-13700Hで:BitNet.cppは、さらに劇的な高速化を実現します。7Bモデルの場合、BitNet.cppはLlama.cppと比較して5.68倍の高速化を達成します。125Mモデルの場合、389.08トークン/秒の速度を達成し、Llama.cppと比較して2.37倍の高速化を実現します。
2. エネルギー効率:エッジデバイスのゲームチェンジャー
提供されたグラフには、エネルギー消費量の比較も含まれています。これは、トークンごとのエネルギー消費量が大幅に削減されたことを示しています。
- Apple M2 Ultraで:BitNet.cppのエネルギー節約は顕著です。700Mモデルの場合、BitNet.cppはトークンごとに55.4%のエネルギー消費量を削減し、0.314から0.140に低下します。この傾向は、大きなモデルでも続き、70Bモデルの場合、70.0%のエネルギー消費量削減を実現します。
- Intel i7-13700Hで:BitNet.cppは、700Mモデルの場合、71.9%のエネルギー節約を実現し、消費量は1.367から0.384に低下します。70BモデルのLlama.cppのエネルギーデータは利用できないものの、BitNet.cppは効率性を維持し、70Bモデルのエネルギー消費量は17.33です。
3. 人間の読書速度ベンチマークの超越
これらのグラフから得られる最も興味深い洞察の1つは、人間の読書速度の参照線(5-7トークン/秒)です。この赤い線は、BitNet.cppが人間の読書速度を超えることを示しています。特に、大きなモデルでも。
- Apple M2 Ultraで:BitNet.cppは、すべてのモデルサイズで人間の読書速度を超え、最も低い速度は70Bモデルの場合で8.67トークン/秒です。
- Intel i7-13700Hで:100Bモデルの場合、1.70トークン/秒に達し、人間の読書速度の下限に近づきますが、小さいモデルではこのベンチマークを超えています。
トレーニングの考慮
直通推定(STE)
1ビット量子化では非可微分関数を導入するため、トレーニングには特殊な技術である直通推定(STE)が必要です。このアプローチでは、非可微分点を通じて勾配が変化せずに流れます。以下は、Pythonでの簡略化された実装です。
class StraightThroughEstimator(Function): @staticmethod def forward(ctx, input): return input.sign() <p>@staticmethod def backward(ctx, grad_output): return grad_output
混合精度トレーニング
トレーニング中の安定性を維持するために、混合精度が使用されます。
- 重みと活性化:1ビット精度に量子化されます。
- 勾配と最適化状態:高精度で保存されます。
- 潜在的な重み:トレーニング中の正確な更新を可能にするために、高精度で維持されます。
大きな学習率戦略
1ビットモデルの独自の課題は、小さな更新が2値化された重みに影響を与えない可能性があることです。この問題を緩和するために、学習率を増やし、従来のアプローチと比較して収束が速く、最適化が良くなるようにします。
グループ量子化と正規化
BitNet.cppでは、グループ量子化と正規化を導入して、モデル並列性を向上させます。重み行列全体のパラメータを計算するのではなく、BitNetは重みと活性化を複数のグループ(G)に分割します。
このグループ化により、グループ間の追加の通信なしに効率的な並列処理が可能になり、大規模なモデルトレーニングと推論が可能になります。
実装ノートと最適化
CPU最適化
BitNet.cppは、以下の低レベルの最適化を使用して、ピークのCPUパフォーマンスを達成します。
- ベクトル化された演算:SIMD命令を使用してビット操作を効率的に実行します。
- キャッシュに優しいメモリアクセス:データを構造化してキャッシュミスを最小限に抑えます。
- 並列処理:ワークロードを複数のCPUコアに効果的に分散します。
以下は、BitNet.cppの重要な関数の1つで、量子化と推論を実装する例です。














