ホームページ >テクノロジー周辺機器 >AI >ニューラルネットワークの重量量子化

ニューラルネットワークの重量量子化

Joseph Gordon-Levitt
Joseph Gordon-Levittオリジナル
2025-03-08 10:40:10692ブラウズ

ますます大きな言語モデルと複雑なニューラルネットワークの時代において、モデルの効率を最適化することが最も重要になりました。重量の量子化は、モデルのサイズを縮小し、パフォーマンスの大幅な劣化なしに推論速度を改善するための重要な手法として際立っています。このガイドは、GPT-2を実際の例として使用して、体重量子化を実装および理解するための実践的なアプローチを提供します。

学習目標

  • 体重量子化の基礎とモデルの最適化におけるその重要性を理解してください。
  • ABSMAXとゼロポイントの量子化技術の違いを学びます。
  • pytorchを使用してGPT-2に重量量子化方法を実装
  • メモリ効率、推論速度、および精度に対する量子化の影響を分析します。
  • 洞察のためにヒストグラムを使用して量子化された重量分布を視覚化します
  • テキスト生成と困惑の指標を通じて定量化後のモデルのパフォーマンスを評価します。
  • リソースが制約されているデバイスにモデルを展開するための量子化の利点を探ります。
  • この記事は、

データサイエンスブログの一部として公開されました。 目次体重量子化の基礎

実用的な実装

量子化プロセス:体重とモデル
  • 量子化された体重分布の視覚化
  • パフォーマンス評価
  • 体重量子化の基礎
  • を理解しています
  • 重量量子化により、高精度の浮動小数点重量(通常32ビット)を低精度表現(一般的に8ビット整数)に変換します。このプロセスは、モデルのパフォーマンスを維持しようとしながら、モデルのサイズとメモリの使用量を大幅に削減します。重要な課題は、数値精度を減らしながらモデルの精度を維持することにあります。
  • なぜQUANTIZE?
  • メモリ効率:
  • 32ビットから8ビットに精度を減らすことで、理論的にモデルサイズを75%削減できます

推論の高速:

整数操作は、一般的に浮動小数点操作よりも高速です

電力消費量の低下:

メモリ帯域幅の減少とより単純な計算により、エネルギー節約につながります
  • 展開の柔軟性:小規模なモデルは、リソース制約のデバイスに展開できます
  • 実用的な実装
  • ABSMAX量子化とゼロポイント量子化の2つの一般的な量子化方法の実装に飛び込みましょう。
  • 環境のセットアップ 最初に、必要な依存関係を備えた開発環境を設定します。
  • 以下では、量子化方法の実装を検討します:

    absmax Quantization

    ABSMAX量子化法は、テンソルの最大絶対値に基づいて重みをスケーリングします:

    import seaborn as sns
    import torch
    import numpy as np
    from transformers import AutoModelForCausalLM, AutoTokenizer
    from copy import deepcopy
    import matplotlib.pyplot as plt
    import matplotlib.ticker as ticker
    import seaborn as sns

    このメソッドは次のとおりです

      重量テンソルの最大絶対値を見つける
    • int8範囲内に値を適合させるスケーリング係数を計算
    • 値のスケーリングと丸め
    • Quantizedバージョンと定量化されたバージョンの両方を提供します
    • 重要な利点:

    単純な実装
    • 大きな値の良好な保存
    • ゼロの周りの対称量子化
    • ゼロポイント量子化

    ゼロポイントの量子化は、非対称分布をより適切に処理するためにオフセットを追加します:

    # Define quantization functions
    def absmax_quantize(X):
        scale = 100 / torch.max(torch.abs(X))  # Adjusted scale
        X_quant = (scale * X).round()
        X_dequant = X_quant / scale
        return X_quant.to(torch.int8), X_dequant
    output:

    この方法:
    def zeropoint_quantize(X):
        x_range = torch.max(X) - torch.min(X)
        x_range = 1 if x_range == 0 else x_range
        scale = 200 / x_range
        zeropoint = (-scale * torch.min(X) - 128).round()
        X_quant = torch.clip((X * scale + zeropoint).round(), -128, 127)
        X_dequant = (X_quant - zeropoint) / scale
        return X_quant.to(torch.int8), X_dequant

    値の全範囲を計算します
    • スケールパラメーターとゼロポイントパラメーターを決定します
    • スケーリングとシフトを適用します
    • int8の境界を確保するためのクリップ値
    • 利点:

    非対称分布のより良い取り扱い
    • ゼロ近くの値の表現の改善
    • 多くの場合、全体的な精度が向上します
    • モデルの読み込みと準備
    これらの量子化方法を実際のモデルに適用しましょう。例としてgpt-2を使用します:

    output:
    Using device: cuda

    量子化プロセス:重みとモデルニューラルネットワークの重量量子化

    個々の重みとモデル全体の両方に量子化技術を適用するようになります。このステップにより、パフォーマンスを維持しながら、メモリの使用量と計算効率が低下します。

    量子化された重量分布の視覚化

    元の、ABSMAX量子化、およびゼロポイントの量子化されたモデルの重量分布を視覚化して比較します。これらのヒストグラムは、量子化が体重値と全体的な分布にどのように影響するかについての洞察を提供します。

    # Load model and tokenizer
    model_id = 'gpt2'
    model = AutoModelForCausalLM.from_pretrained(model_id).to(device)
    tokenizer = AutoTokenizer.from_pretrained(model_id)
    
    # Print model size
    print(f"Model size: {model.get_memory_footprint():,} bytes")
    コードには、包括的な視覚化関数が含まれています:

    元の重みを表示するグラフ対ABSMAX重み

    # Quantize and visualize weights
    weights_abs_quant, _ = absmax_quantize(weights)
    weights_zp_quant, _ = zeropoint_quantize(weights)
    
    
    # Quantize the entire model
    model_abs = deepcopy(model)
    model_zp = deepcopy(model)
    
    for param in model_abs.parameters():
        _, dequantized = absmax_quantize(param.data)
        param.data = dequantized
    
    for param in model_zp.parameters():
        _, dequantized = zeropoint_quantize(param.data)
        param.data = dequantized
    グラフは、元の重みとゼロポイントの重みを表示します

    • output:

    パフォーマンス評価ニューラルネットワークの重量量子化 モデルのパフォーマンスに対する量子化の影響を評価することは、効率と精度を確保するために不可欠です。量子化されたモデルが元のモデルと比較してどれだけうまく機能するかを測定しましょう。

    テキスト生成

    ニューラルネットワークの重量量子化量子化されたモデルがテキストを生成する方法を探り、出力の品質を元のモデルの予測と比較します。

    import seaborn as sns
    import torch
    import numpy as np
    from transformers import AutoModelForCausalLM, AutoTokenizer
    from copy import deepcopy
    import matplotlib.pyplot as plt
    import matplotlib.ticker as ticker
    import seaborn as sns
    このコードは、3つのモデル、オリジナル、「absmax」量子化モデル、および「ゼロポイント」量子化モデルの3つのモデルからのテキスト生成出力を比較します。 Generate_Text関数を使用して、入力プロンプトに基づいてテキストを生成し、30のトップK値でサンプリングを適用します。最後に、3つのモデルすべての結果を印刷します。

    output:

    ニューラルネットワークの重量量子化

    コードは、3つのモデルを使用して、特定の入力の困惑(モデルがテキストを予測する尺度の尺度)を計算します:オリジナルの「ABSMAX」量子化、「ゼロポイント」量子化モデル。低い困惑は、パフォーマンスの向上を示します。比較のために困惑のスコアを印刷します。
    # Define quantization functions
    def absmax_quantize(X):
        scale = 100 / torch.max(torch.abs(X))  # Adjusted scale
        X_quant = (scale * X).round()
        X_dequant = X_quant / scale
        return X_quant.to(torch.int8), X_dequant

    output:

    ニューラルネットワークの重量量子化ここからcolabリンクにアクセスできます。

    体重量子化の利点

    以下では、体重量子化の利点を調べます:

      メモリ効率:
    • 量子化により、モデルサイズが最大75%減少し、荷重と推論が速くなります。 推論の高速:
    • 整数操作は、フローティングポイント操作よりも高速であり、モデルの実行が迅速になります。
    • 電力消費量の低下:メモリ帯域幅の削減と単純化された計算は、エネルギー節約につながり、エッジデバイスとモバイル展開に不可欠です。
    • 展開の柔軟性:小規模なモデルは、限られたリソース(携帯電話、埋め込みデバイスなど)でハードウェアに展開しやすい。
    • 最小限のパフォーマンス劣化:
    • 適切な量子化戦略を使用すると、モデルは精度の低下にもかかわらず、その精度のほとんどを保持できます。 結論
    • 重量量子化は、特にリソースが制約のあるデバイスに展開することになると、大規模な言語モデルの効率を高める上で重要な役割を果たします。高精度の重みを低精度の整数表現に変換することにより、モデルのパフォーマンスに深刻な影響を与えることなく、メモリの使用量を大幅に削減し、推論速度を改善し、消費電力を削減できます。 このガイドでは、GPT-2を実用的な例として使用している2つの一般的な量子化技術(アブスマックス量子化とゼロポイント量子化)を調査しました。どちらの手法も、テキスト生成タスクの高レベルの精度を維持しながら、モデルのメモリフットプリントと計算要件を削減する能力を実証しました。ただし、非対称アプローチを備えたゼロポイント量子化法は、一般に、特に非対称の重量分布の場合、モデルの精度をより良く保存しました。

      キーテイクアウト

      • ABSMAX量子化はよりシンプルで、対称的な重量分布に適していますが、非対称分布をゼロポイントの量子化ほど効果的にキャプチャしない可能性があります。
      • ゼロポイント量子化は、非対称分布を処理するオフセットを導入することにより、より柔軟なアプローチを提供し、多くの場合、より良い精度とより効率的な重みの表現につながります。
      • 計算リソースが制限されているリアルタイムアプリケーションに大規模なモデルを展開するには、量子化が不可欠です。
      • 量子化プロセスが精度を減らすにもかかわらず、適切なチューニングと量子化戦略を使用して、モデルのパフォーマンスを元のパフォーマンスを維持することが可能です。
      • ヒストグラムのような視覚化技術は、量子化がモデルの重みとテンソルの値の分布にどのように影響するかについての洞察を提供できます。
      • よくある質問
      • q1。体重量子化とは?重量量子化により、通常は32ビットの浮動小数点値から低精度の整数(8ビット整数など)にモデルの重量の精度が低下し、パフォーマンスを維持しながらメモリと計算を保存します。体重量子化はモデルのパフォーマンスにどのように影響しますか?量子化により、モデルのメモリフットプリントと推論時間が短縮されますが、精度がわずかに分解される可能性があります。ただし、正しく行われた場合、精度の損失は最小限です。任意のモデルに量子化を適用できますか?はい、言語モデル、ビジョンモデル、その他の深い学習アーキテクチャなど、任意のニューラルネットワークモデルに量子化を適用できます。モデルに重量量子化を実装するにはどうすればよいですか?モデルの重みをスケーリングして回転させる関数を作成し、すべてのパラメーターにそれらを適用することにより、量子化を実装できます。 Pytorchのようなライブラリは、いくつかの量子化技術のネイティブサポートを提供しますが、ガイドに示されているようにカスタム実装は柔軟性を提供します。すべてのタイプのモデルで量子化は機能しますか?重量量子化は、メモリフットプリントと計算を減らすことが重要である大規模なモデルに最も効果的です。ただし、非常に小さなモデルは量子化からそれほど利益を得ないかもしれません。
      この記事に示されているメディアは、Analytics Vidhyaが所有しておらず、著者の裁量で使用されています。

以上がニューラルネットワークの重量量子化の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

声明:
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。