量化的力量:縮小 GPT 釋放速度
想像一下,採用像 GPT-2 這樣強大的語言模型(能夠編寫故事、回答問題和模仿人類文本)並將其壓縮為更精簡、更快的版本,而不會削弱其功能。
這就是量化的承諾:一種降低模型計算精度的技術,以犧牲邊際精度來換取顯著的效率提升。
第 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 模型會消耗 511 MB GPU 記憶體。
- 速度:依照提示「Once Upon a time」產生50個代幣需要1.76秒。
- 清理後佔用空間: 即使刪除模型後,458 MB 記憶體仍然被佔用。
FP32 可以工作,但體積龐大。
# 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()
第 2 階段:精簡-8 位元量化 (INT8)
輸入 8 位元量化,其中權重和活化儲存為整數而不是浮點數。轉變是立竿見影的:
- 記憶體: INT8 模型載入時僅 187 MB—比 FP32 小 63%。
- 速度: 推理加速至 1.38 秒,提升 22%。
- 清理後佔用空間:刪除後記憶體降至139 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
第 3 階段:效率邊緣 - 4 位元量化 (INT4)
現在我們更進一步。透過 4 位元量化,權重被壓縮到接近最小的精度,並且計算使用 16 位元浮點來確保穩定性。
- 記憶體: INT4 型號的重量為 149 MB,比 FP32 輕71%。
- 速度: 推理時間降至 1.08 秒,比 FP32 增加了 39%。
- 清理後佔用空間: 記憶體驟降至 58 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
權衡:精確性與實用性
量化不是免費的。降低精度可能會微妙地降低模型的準確性,但對於許多任務(例如臨時文本生成)來說,差異是難以察覺的。我們的收穫遠大於成本:
- 內存效率: fp32:511 MB→INT8:187 MB→INT4:149 MB。
>結果:>模型適合更嚴格的內存約束,在消費者GPU或邊緣設備上啟用部署。
- 推理速度: fp32:1.76S→INT8:1.38S→INT4:1.08S。 從聊天機器人到自動化的內容生成的實時應用程序的
結果:更快的響應。 >
它的工作原理:壓縮的機制
在其核心上,量化高精度值(例如32位浮點)將其映射到較低精確的格式(8位或4位整數)。例如:
- > fp32>使用32位,捕獲細節,但要求大量資源。
- int8/int4使用較少的位,近似值,損失最小的值。
視覺證明
並排比較密封了:
- >內存用法(條形圖):
- fp32塔在int8和int4上,展示了資源需求的明顯減少。 >推理時間(線圖):
- >從fp32到int4的向下斜率突出顯示速度的增長。 外賣?量化不僅是技術腳註 - 它是使AI民主化的實用工具。
!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"
該實現通過具體代碼和測量來揭示量化的功能。通過僅修改10-15行配置並部署量化,我們實現了:
> 71%記憶足蹟的減少
39%的推理速度
- 如果您很好奇並且希望有實驗的完整筆記本 - 前往Google Colab。
以上是量化的力量:縮小 GPT 釋放速度的詳細內容。更多資訊請關注PHP中文網其他相關文章!

熱AI工具

Undresser.AI Undress
人工智慧驅動的應用程序,用於創建逼真的裸體照片

AI Clothes Remover
用於從照片中去除衣服的線上人工智慧工具。

Undress AI Tool
免費脫衣圖片

Clothoff.io
AI脫衣器

AI Hentai Generator
免費產生 AI 無盡。

熱門文章

熱工具

記事本++7.3.1
好用且免費的程式碼編輯器

SublimeText3漢化版
中文版,非常好用

禪工作室 13.0.1
強大的PHP整合開發環境

Dreamweaver CS6
視覺化網頁開發工具

SublimeText3 Mac版
神級程式碼編輯軟體(SublimeText3)

本教程演示如何使用Python處理Zipf定律這一統計概念,並展示Python在處理該定律時讀取和排序大型文本文件的效率。 您可能想知道Zipf分佈這個術語是什麼意思。要理解這個術語,我們首先需要定義Zipf定律。別擔心,我會盡量簡化說明。 Zipf定律 Zipf定律簡單來說就是:在一個大型自然語言語料庫中,最頻繁出現的詞的出現頻率大約是第二頻繁詞的兩倍,是第三頻繁詞的三倍,是第四頻繁詞的四倍,以此類推。 讓我們來看一個例子。如果您查看美國英語的Brown語料庫,您會注意到最頻繁出現的詞是“th

本文解釋瞭如何使用美麗的湯庫來解析html。 它詳細介紹了常見方法,例如find(),find_all(),select()和get_text(),以用於數據提取,處理不同的HTML結構和錯誤以及替代方案(SEL)

處理嘈雜的圖像是一個常見的問題,尤其是手機或低分辨率攝像頭照片。 本教程使用OpenCV探索Python中的圖像過濾技術來解決此問題。 圖像過濾:功能強大的工具圖像過濾器

Python是數據科學和處理的最愛,為高性能計算提供了豐富的生態系統。但是,Python中的並行編程提出了獨特的挑戰。本教程探討了這些挑戰,重點是全球解釋

本文比較了Tensorflow和Pytorch的深度學習。 它詳細介紹了所涉及的步驟:數據準備,模型構建,培訓,評估和部署。 框架之間的關鍵差異,特別是關於計算刻度的

本教程演示了在Python 3中創建自定義管道數據結構,利用類和操作員超載以增強功能。 管道的靈活性在於它能夠將一系列函數應用於數據集的能力,GE

Python 對象的序列化和反序列化是任何非平凡程序的關鍵方面。如果您將某些內容保存到 Python 文件中,如果您讀取配置文件,或者如果您響應 HTTP 請求,您都會進行對象序列化和反序列化。 從某種意義上說,序列化和反序列化是世界上最無聊的事情。誰會在乎所有這些格式和協議?您想持久化或流式傳輸一些 Python 對象,並在以後完整地取回它們。 這是一種在概念層面上看待世界的好方法。但是,在實際層面上,您選擇的序列化方案、格式或協議可能會決定程序運行的速度、安全性、維護狀態的自由度以及與其他系

Python的statistics模塊提供強大的數據統計分析功能,幫助我們快速理解數據整體特徵,例如生物統計學和商業分析等領域。無需逐個查看數據點,只需查看均值或方差等統計量,即可發現原始數據中可能被忽略的趨勢和特徵,並更輕鬆、有效地比較大型數據集。 本教程將介紹如何計算平均值和衡量數據集的離散程度。除非另有說明,本模塊中的所有函數都支持使用mean()函數計算平均值,而非簡單的求和平均。 也可使用浮點數。 import random import statistics from fracti
