想像一下,採用像 GPT-2 這樣強大的語言模型(能夠編寫故事、回答問題和模仿人類文本)並將其壓縮為更精簡、更快的版本,而不會削弱其功能。
這就是量化的承諾:一種降低模型計算精度的技術,以犧牲邊際精度來換取顯著的效率提升。
!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"
實驗從處於自然狀態的 GPT-2 開始:32 位元浮點精度 (FP32)。這是模型的「全功率」模式——高精度但資源密集。
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()
輸入 8 位元量化,其中權重和活化儲存為整數而不是浮點數。轉變是立竿見影的:
該車型更輕、更快且仍然有效。明顯的升級。
# 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
現在我們更進一步。透過 4 位元量化,權重被壓縮到接近最小的精度,並且計算使用 16 位元浮點來確保穩定性。
這不僅僅是最佳化;這不僅僅是最佳化。這是重塑。
# 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
量化不是免費的。降低精度可能會微妙地降低模型的準確性,但對於許多任務(例如臨時文本生成)來說,差異是難以察覺的。我們的收穫遠大於成本:
>結果:>模型適合更嚴格的內存約束,在消費者GPU或邊緣設備上啟用部署。
結果:更快的響應。 >
視覺證明
並排比較密封了:
!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"通過量化,我們將GPT-2從資源豐富的龐然大物轉變為靈活,高效的工具 - 通過正確的技術,即使是巨人也可以學會輕輕地移動。
39%的推理速度
以上是量化的力量:縮小 GPT 釋放速度的詳細內容。更多資訊請關注PHP中文網其他相關文章!