AIモデルとプラットフォーム

マイクロソフトの推論フレームワーク「BitNet.cpp」が1ビット大規模言語モデルをローカルデバイスに導入

mm
Unite.AI を Google の優先ソースに追加

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ビットモデルと比較して、同じハードウェア制約内でより大きなモデルを格納できるようになります。

エネルギー効率

推論速度、エネルギー効率(Apple [securities_stock_price_tag symbol="AAPL" exchange="NASDAQ"] M2)

 

推論速度:CPUの両方で高速化

推論速度、エネルギー効率(i7-13700H)

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つで、量子化と推論を実装する例です。


def bitlinear_forward(input, weight, scale):
# 入力を絶対最大値量子化で量子化します
input_q = quantize(input)

# 2値化された重みと入力のバイナリ行列乗算を実行します
output = binary_matmul(input_q, weight)

# 出力を元の精度にスケーリングします
return output * scale

def quantize(x):
# 絶対最大値量子化を実行します
scale = torch.max(torch.abs(x))
return torch.clamp(x / scale, -1, 1) * scale
[/code]

サポート対象モデル

BitNet.cppの現在のリリースでは、以下のHugging Faceで利用可能な1ビットLLMがサポートされます。

  • bitnet_b1_58-large(0.7Bパラメータ)
  • bitnet_b1_58-3B(3.3Bパラメータ)
  • Llama3-8B-1.58-100B-tokens(8.0Bパラメータ)

これらのモデルは、フレームワークの推論機能を示すために一般に公開されています。マイクロソフトによって公式にトレーニングまたはリリースされていませんが、フレームワークの汎用性を示しています。

インストールガイド

BitNet.cppを使用するには、以下の手順に従ってください。

前提条件

  1. Python >= 3.9
  2. CMake >= 3.22
  3. Clang >= 18
  4. Conda(推奨)

Windowsユーザーの場合、以下のコンポーネントを有効にしてVisual Studioをインストールする必要があります。

  • デスクトップアプリケーションのC++開発
  • Windows用C++-CMakeツール
  • Windows用Git
  • Windows用C++-Clangコンパイラ
  • LLVMツールセット(Clang)用MS-Buildサポート

Debian/Ubuntuユーザーの場合、自動インストールスクリプトが利用可能です。

bash -c "$(wget -O - https://apt.llvm.org/llvm.sh)"

ステップバイステップのインストール

  1. リポジトリのクローン
    git clone --recursive https://github.com/microsoft/BitNet.git

    cd BitNet
  2. 依存関係のインストール
    # 新しいConda環境を作成する(推奨)
    conda create -n bitnet-cpp python=3.9
    conda activate bitnet-cpp


    pip install -r requirements.txt
  3. プロジェクトのビルドと準備:Hugging Faceから直接モデルをダウンロードして量子化された形式に変換できます。
    python setup_env.py --hf-repo HF1BitLLM/Llama3-8B-1.58-100B-tokens -q i2_s

    または、モデルを手動でダウンロードして変換します。

    huggingface-cli download HF1BitLLM/Llama3-8B-1.58-100B-tokens --local-dir models/Llama3-8B-1.58-100B-tokens

    python setup_env.py -md models/Llama3-8B-1.58-100B-tokens -q i2_s

BitNet.cppを使用した推論の実行

推論を実行するには、以下のコマンドを使用します。

python run_inference.py -m models/Llama3-8B-1.58-100B-tokens/ggml-model-i2_s.gguf -p "サンドラはキッチンに旅立った。サンドラはどこにいるの?" -n 6 -temp 0.7

説明

  • -mはモデルファイルのパスを指定します。
  • -pはプロンプトテキストを定義します。
  • -nは予測するトークンの数を設定します。
  • -tempは推論時のランダム性(温度)を調整します。

出力例

サンドラはキッチンに旅立った。サンドラはどこにいるの?

答え:サンドラはキッチンにいます。

BitNet.cppの技術的詳細

BitLinearレイヤー

BitNet.cppは、標準的な行列乗算をBitLinear演算に置き換えることで、変更されたTransformerアーキテクチャを実装します。このアプローチでは、重みを量子化前に0を中心に配置し、スケーリングして近似エラーを最小限に抑えます。重要な変換関数は次のとおりです。


<p># 1ビット重みの2値化関数
def binarize_weights(W):
alpha = W.mean()
W_binarized = np.sign(W - alpha)
return W_binarized</p>

重みの集中とスケーリングの組み合わせにより、量子化エラーが最小限に抑えられ、パフォーマンスが維持されます。

業界への影響

BitNet.cppは、LLMの展開に大きな影響を与える可能性があります。

  • アクセシビリティ:LLMを標準デバイスで実行可能にし、強力なAIへのアクセスを民主化します。
  • コスト効率:高価なGPUの必要性を減らし、導入の障壁を下げます。
  • エネルギー効率:標準CPUベースの推論を活用してエネルギーを節約します。
  • イノベーション:クラウド依存なしでリアルタイム言語翻訳、音声アシスタント、プライバシー重視アプリケーションなどのオンデバイスAIに新たな可能性をもたらします。

課題と将来の方向性

1ビットLLMは有望ですが、いくつかの課題が残っています。これらには、さまざまなタスク用の堅牢な1ビットモデルを開発すること、1ビット計算用のハードウェアを最適化すること、開発者がこの新しいパラダイムを採用することが含まれます。また、1ビット量子化をコンピュータビジョンまたはオーディオタスクに適用することも、将来の興味深い方向性です。

結論

マイクロソフトのBitNet.cppのリリースは、重要な進歩です。標準CPUで効率的な1ビット推論を可能にすることで、BitNet.cppはAIのアクセシビリティと持続可能性を創り出します。このフレームワークは、よりポータブルでコスト効率の高いLLMの道を開き、オンデバイスAIの可能性を拡大します。

私は過去5年間、機械学習とディープラーニングの魅力的世界に没頭してきました。私の情熱と専門知識は、AI/MLに特に焦点を当てた50以上の多様なソフトウェアエンジニアリングプロジェクトに貢献することになりました。私の継続的な好奇心は、自然言語処理という分野にも私を引き付け、さらに探求したいと思っています。