Connect with us

Microsoftの推論フレームワークにより、1ビットの大規模言語モデルがローカルデバイスで実行可能になる

人工知能

Microsoftの推論フレームワークにより、1ビットの大規模言語モデルがローカルデバイスで実行可能になる

mm
Understanding 1-bit LLMs and Microsoft's BitNet.cpp Framework

2024年10月17日、MicrosoftはBitNet.cppを発表しました。これは、1ビット量子化の大規模言語モデル(LLM)を実行するための推論フレームワークです。BitNet.cppは、Gen AIにおける重要な進歩であり、1ビットLLMを効率的に標準CPUで展開できるようにし、高価なGPUが不要になります。この開発により、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. 活性化の量子化

活性化の量子化により、入力が指定されたビット幅に制限されます。

ここで:

  • 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ビット

これは、従来の16ビットモデルと比較して約90%のメモリ削減に相当し、大規模なモデルを同じハードウェア制約内に収めることができます。

エネルギー効率

推論速度、エネルギー効率(Apple M2)

 

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

推論速度、エネルギー効率(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 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モデルでは、トークンごとのエネルギー消費量がLlama.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()

@staticmethod
def backward(ctx, grad_output):
return grad_output

混合精度トレーニング

トレーニング中の安定性を維持するために、混合精度が使用されます。

  • 重みと活性化: 1ビット精度に量子化されます。
  • 勾配とオプティマイザ状態: 高精度で保存されます。
  • 潜在的な重み: 高精度で維持され、トレーニング中の正確な更新を可能にします。

大きな学習率戦略

1ビットモデルには、学習率を高くする必要があるという独自の課題があります。小さな更新では、2値化された重みに影響しない可能性があるためです。したがって、収束を早くして最適化を改善するために、学習率が高く設定されます。

グループ量子化と正規化

BitNet.cppでは、グループ量子化と正規化を導入して、モデル並列性を向上させます。重みと活性化を複数のグループ(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

サポートされているモデル

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

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

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

インストールガイド

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コンパイラ
  • MS-Build Support for LLVM Toolset(Clang)

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 "Sandra journeyed to the kitchen. Where is Sandra?" -n 6 -temp 0.7

説明:

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

出力例

Sandra journeyed to the kitchen. Where is Sandra?

Answer: Sandra is in the kitchen.

BitNet.cppの技術的詳細

BitLinearレイヤー

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


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

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

業界への影響

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

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

課題と将来の方向性

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

結論

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

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