ホームページ >バックエンド開発 >Python チュートリアル >量子化の力: GPTU の限界を超える速度の縮小

量子化の力: GPTU の限界を超える速度の縮小

DDD
DDDオリジナル
2025-01-27 02:16:09729ブラウズ

GPT-2のような強力な言語モデルを採用することを想像してください。ストーリーを作成したり、質問に答えたり、人間のテキストを模倣したり、能力を妨げることなく、よりleanせてより速いバージョンに圧縮します。

これは量子化の約束です。モデルの計算の精度を減らす手法、劇的な効率の向上のために限界精度を取引します。

フェーズ0:技術セットアップ

    !pip install torch transformers accelerate bitsandbytes psutil

    from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
    import torch
    import time
    import gc

    def get_memory_usage():
        return torch.cuda.memory_allocated() / 1e6 if torch.cuda.is_available() else 0


    device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
    model_name = "gpt2"
    input_text = "Once upon a time"
フェーズ1:ベースライン - 完全精度(FP32)

実験は、GPT-2で自然状態で始まります:32ビットの浮動小数点精度(FP32)。これは、モデルの「フルパワー」モードです。

メモリ:FP32モデルをロードすると、GPUメモリの511 MB
    を消費します。
  • 速度:プロンプトから50トークンを生成「昔々」
  • 1.76秒
  • クリーンアップ後のフットプリント:モデルを削除した後でも、メモリの458 mb は占有されたままです。
  • fp32は機能しますが、かさばりです。
  • フェーズ2:脂肪のトリミング - 8ビット量子化(INT8)
8ビットの量子化を入力します。ここで、重量と活性化はフロートの代わりに整数として保存されます。変換は即時です:


    # Load tokenizer and base model
    tokenizer = AutoTokenizer.from_pretrained(model_name)
    print(f"Pre-load memory: {get_memory_usage()} MB")

    # Full precision model
    model_fp32 = AutoModelForCausalLM.from_pretrained(model_name).to(device)
    print(f"Post-load memory: {get_memory_usage()} MB")  # 511.15 MB

    # Inference measurement
    inputs = tokenizer(input_text, return_tensors="pt").to(device)
    start_time = time.time()
    output = model_fp32.generate(**inputs, max_length=50)
    inference_time = time.time() - start_time  # 1.76s

    # Cleanup protocol
    del model_fp32, inputs
    gc.collect()
    torch.cuda.empty_cache()
メモリ:
int8モデルは、fp32よりも

187 mb

-

63%

  • 速度:推論は1.38秒に加速します、a 22%改善
  • クリーンアップ後のフットプリント:
  • メモリは、削除後に139 mb に低下します。 モデルは軽く、より速く、機能的です。明確なアップグレード。
  • フェーズ3:効率のエッジ - 4ビット量子化(INT4) 今度はさらにプッシュします。 4ビットの量子化により、重量は最小限の精度に圧縮され、計算は安定性のために16ビットフロートを使用します。
  • メモリ:
    int4モデルの重量は

    149 mb
        # 8-bit configuration
        quant_config_8bit = BitsAndBytesConfig(load_in_8bit=True)
    
        print(f"Pre-load memory: {get_memory_usage()} MB")  # 9.18 MB
        model_int8 = AutoModelForCausalLM.from_pretrained(
            model_name, 
            quantization_config=quant_config_8bit
        )
    
        # Dynamic input handling
        inputs_int8 = tokenizer(input_text, return_tensors="pt").to(model_int8.device)
        start_time = time.time()
        output = model_int8.generate(**inputs_int8, max_length=50)  # 1.38s
    

    71%軽量

      速度:
    • 推論時間は 1.08秒に低下します39%gain クリーンアップ後のフットプリント:
    • メモリプラムメット
    • 58 mb - オリジナルの割合。 これは単なる最適化ではありません。それは再発明です。
    • トレードオフ:精度と実用性 量子化は無料ではありません。精度を減らすことはモデルの精度を微妙に分解する可能性がありますが、カジュアルなテキスト生成のような多くのタスクでは、違いは知覚できません。私たちが得るものは、コストをはるかに上回っています:
      • メモリ効率:FP32:511 MB→INT8:187 MB→INT4:149 MB。

      result:モデルは、メモリの制約がタイトに適合し、消費者GPUまたはエッジデバイスへの展開を可能にします。

      • 推論速度:FP32:1.76S→INT8:1.38S→INT4:1.08S。

      結果:チャットボットから自動化されたコンテンツ生成まで、リアルタイムアプリケーションのより高速な応答。 それがどのように機能するか:圧縮の仕組み


      そのコアでは、量子化は高精度値(32ビットフロートなど)を低精度形式(8または4ビットの整数)にマップします。たとえば、

      fp32
        は、数ごとに32ビットを使用して、細かい詳細をキャプチャしますが、重いリソースを要求します。
      • int8/int4ビットを少なく使用し、値に最小限の損失で近似します。
      • BitsandBytesライブラリはこれを自動的に処理し、重みを再パックし、安定性を維持するために計算を調整します。
      • 視覚的証明


      並んで比較すると、議論がシールされています:

      The Visual Proof

      メモリの使用(バーチャート):

      fp32 int8およびint4に塔を並べて、リソース需要の厳しい削減を紹介します。

      • 推論時間(ラインプロット):FP32からINT4への下向きの勾配は、速度の向上を強調しています。
      • 持ち帰り?量子化は単なる技術的な脚注ではなく、AIを民主化するための実用的なツールです。
      • 最後の言葉

      量子化により、GPT-2をリソースを重視した巨人から機敏で効率的なツールに変換しました。それを適切なテクニックで促進すると、巨人でさえ軽く動くことができます。
      この実装により、具体的なコードと測定による量子化の能力が明らかになります。わずか10〜15行の構成を変更し、量子化を展開することにより、次のことを達成しました。

          !pip install torch transformers accelerate bitsandbytes psutil
      
          from transformers import AutoModelForCausalLM, AutoTokenizer, BitsAndBytesConfig
          import torch
          import time
          import gc
      
          def get_memory_usage():
              return torch.cuda.memory_allocated() / 1e6 if torch.cuda.is_available() else 0
      
      
          device = torch.device("cuda" if torch.cuda.is_available() else "cpu")
          model_name = "gpt2"
          input_text = "Once upon a time"
      
      71%のメモリフットプリントの減少

      39%推論速度が高速

      興味があり、実験のために完全なノートブックにアクセスしたい場合は、Google Colabに向かいます。

    以上が量子化の力: GPTU の限界を超える速度の縮小の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。

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