Yapay zeka modelleri ve platformlarÄą
BÞyÞk Dil Modellerinin Tahmin ve İyileÅtirme için Bellek Optimizasyonu
BÞyÞk dil modelleri (LLMâler) gibi GPT-4, Bloom ve LLaMA, milyarlarca parametre ile Ãķlçeklenerek dikkat çekici yetenekler elde etti. Ancak, bu devasa modelleri tahmine veya iyileÅtirmeye daÄÄątmak, muazzam bellek gereksinimleri nedeniyle zorlu bir gÃķrevdir. Bu teknik blogda, LLMâlerin tahmine ve iyileÅtirmesi sÄąrasÄąnda bellek tÞketimini tahmin etme ve optimize etme tekniklerini keÅfedeceÄiz.
Bellek Gereksinimlerini Anlama
Bir LLMâi yÞklemek için gereken bellek, Ãķncelikle parametre sayÄąsÄą ve parametreleri depolamak için kullanÄąlan sayÄąsal kesinlik tarafÄąndan belirlenir. Bir kural olarak:
- X milyar parametreli bir modeli yÞklemek için yaklaÅÄąk 4X GB VRAM gerekir 32-bit floatįēūåšĶde
- X milyar parametreli bir modeli yÞklemek için yaklaÅÄąk 2X GB VRAM gerekir 16-bit bfloat16/float16įēūåšĶde
ÃrneÄin, 175B parametreli GPT-3 modelini yÞklemek için yaklaÅÄąk 350GB VRAM gerekir bfloat16įēūåšĶde. BugÞn, en bÞyÞk ticari olarak disponible GPUâlar gibi NVIDIA A100 ve H100 sadece 80GB VRAM sunar, bu da tensor paralellik ve model paralellik tekniklerini gerektirir.
Tahmin sÄąrasÄąnda, bellek ayak izi, model parametreleri ve geçici aktivasyon tensÃķrleri tarafÄąndan domine edilir. Tahmin sÄąrasÄąnda zirve bellek kullanÄąmÄąnÄąn yÞksek bir tahmini, model parametrelerini yÞklemek için gereken bellek ve aktivasyonlar için belleÄin toplamÄądÄąr.
Tahmin BelleÄini nicelendirme
OctoCode modelini kullanarak, yaklaÅÄąk 15 milyar parametre ve bfloat16 formatÄąnda (~ 31GB) tahmine bellek gereksinimlerini nicelendirelim. Transformers kÞtÞphanesini kullanarak modeli yÞkleyerek ve metin oluÅturacaÄÄąz:
from transformers import AutoModelForCausalLM, AutoTokenizer, pipeline import torch <p>model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", torch_dtype=torch.bfloat16, device_map="auto", pad_token_id=0) tokenizer = AutoTokenizer.from_pretrained("bigcode/octocoder") pipe = pipeline("text-generation", model=model, tokenizer=tokenizer)</p> <p>prompt = "Soru: Python'da baytlarÄą gigabayta dÃķnÞÅtÞrmek için bir fonksiyon yazÄąn.\n\nCevap:" result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):]</p> <p>def bytes_to_gigabytes(bytes): return bytes / 1024 / 1024 / 1024</p> <p>bytes_to_gigabytes(torch.cuda.max_memory_allocated())
ÃÄąktÄą:
29.0260648727417Zirve GPU bellek kullanÄąmÄą yaklaÅÄąk 29GBâdir, bu da bfloat16 formatÄąnda model parametrelerini yÞklemek içinæäŧŽį tahmini 31GB ile uyumlu.
Tahmin BelleÄini nicelendirme ile Quantization
Bfloat16, LLMâlerin eÄitimi için yaygÄąn olarak kullanÄąlan birįēūåšĶdir, ancak araÅtÄąrmacÄąlar, model aÄÄąrlÄąklarÄąnÄą daha dÞÅÞkįēūåšĶ veri tÞrlerine (8-bit tam sayÄąlar veya 4-bit tam sayÄąlar) nicelendirdiklerinde, tahmine gÃķrevleri için Ãķnemli bellek kullanÄąmÄąnÄą azaltabileceÄini keÅfettiler.
OctoCode modelinin 8-bit ve 4-bit nicelendirmesinden bellek tasarrufunu gÃķrelim:
&lt;/div&gt; # 8-bit nicelendirme model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", load_in_8bit=True, pad_token_id=0) pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):] bytes_to_gigabytes(torch.cuda.max_memory_allocated())</pre>
ÃÄąktÄą:
15.219234466552734# 4-bit nicelendirme model = AutoModelForCausalLM.from_pretrained("bigcode/octocoder", load_in_4bit=True, low_cpu_mem_usage=True, pad_token_id=0) pipe = pipeline("text-generation", model=model, tokenizer=tokenizer) result = pipe(prompt, max_new_tokens=60)[0]["generated_text"][len(prompt):] bytes_to_gigabytes(torch.cuda.max_memory_allocated())
ÃÄąktÄą:
9.5435743331909188-bit nicelendirmesiyle, bellek gereksinimi 31GBâden 15GBâye dÞÅer, 4-bit nicelendirmesiyle ise 9.5GBâye dÞÅer! Bu, 15B parametreli OctoCode modelini tÞketici GPUâlarÄą gibi RTX 3090 (24GB VRAM) Þzerinde çalÄąÅtÄąrma olanaÄÄą saÄlar.
Ancak, daha agresif nicelendirme gibi 4-bitâin bazen 8-bit veya bfloat16įēūåšĶye gÃķre doÄruluk kaybÄąna neden olabileceÄini unutmayÄąn. KullanÄącÄąlar, kullanÄąm durumlarÄą için bellek tasarrufu ve doÄruluk arasÄąnda bir denge kurmalÄądÄąr.
Nicelendirme, LLMâlerin daÄÄątÄąmÄąnÄą kaynak kÄąsÄątlÄą ortamlarda, bulut Ãķrneklerinde, kenar cihazlarÄąnda veya hatta cep telefonlarÄąnda ermÃķgelenerek bellek kullanÄąmÄąnÄą Ãķnemli ÃķlçÞde azaltabilen gÞçlÞ bir tekniktir.
İyileÅtirme için Bellek Tahmini
Nicelendirme, verimli tahmine için kullanÄąlÄąrken, tensor paralellik ve model paralellik gibi teknikler, bÞyÞk dil modellerinin eÄitimi veya iyileÅtirmesi sÄąrasÄąnda bellek gereksinimlerini yÃķnetmek için kritiktir.
İyileÅtirme sÄąrasÄąnda zirve bellek tÞketimi, genellikle tahmine gÃķre 3-4 kat daha yÞksektir ve Åunlar için ek bellek gereksinimlerini içerir:
- Gradyanlar
- Optimizer durumlarÄą
- İleri geçiÅten geri yayÄąlÄąm için depolanan aktivasyonlar
Muhafazakar bir tahmin, X milyar parametreli bir LLMâyi iyileÅtirmek için yaklaÅÄąk 4 * (2X) = 8X GB VRAM gerekir bfloat16įēūåšĶde.
ÃrneÄin, 7B parametreli LLaMA modelini iyileÅtirmek için yaklaÅÄąk 7 * 8 = 56GB VRAM gerekir her GPU için bfloat16įēūåšĶde. Bu, mevcut GPUâlarÄąn bellek kapasitesini aÅar ve daÄÄątÄąlmÄąÅ iyileÅtirme tekniklerini gerektirir.
DaÄÄątÄąlmÄąÅ Ä°yileÅtirme Teknikleri
Birkaç daÄÄątÄąlmÄąÅ iyileÅtirme yÃķntemi, bÞyÞk modeller için GPU bellek kÄąsÄątlamalarÄąnÄą aÅmak için ÃķnerilmiÅtir:
- Veri Paralellik: Klasik veri paralellik yaklaÅÄąmÄą, tÞm modeli birden fazla GPUâya kopyalar ve eÄitim veri partilerini daÄÄątÄąr. Bu, eÄitim sÞresini GPU sayÄąsÄąyla lineer olarak azaltÄąr, ancak her GPUâdaki zirve bellek gereksinimini azaltmaz.
- ZeRO Stage 3: GeliÅmiÅ bir veri paralellik biçimi, model parametrelerini, gradyanlarÄą ve optimizer durumlarÄąnÄą GPUâlar arasÄąnda bÃķler. Bu, her GPUâda yalnÄązca gerekli paylaÅÄąlan verileri tutarak klasik veri paralellikten daha az bellek kullanÄąr.
- Tensor Paralellik: Modeli kopyalamak yerine, tensor paralellik, model parametrelerini satÄąrlara veya sÞtunlara bÃķler ve bunlarÄą GPUâlar arasÄąnda daÄÄątÄąr. Her GPU, parametrelerin, gradyanlarÄąn ve optimizer durumlarÄąnÄąn bir paylaÅÄąlan kÞmesini iÅler, bu da Ãķnemli bellek tasarrufu saÄlar.
- Boru HattÄą Paralellik: Bu teknik, model katmanlarÄąnÄą farklÄą GPUâlar veya iÅçiler arasÄąnda bÃķler, her cihazÄąn bir alt kÞme katmanlarÄą çalÄąÅtÄąrÄąr. Aktivasyonlar iÅçiler arasÄąnda geçirilir, bu da zirve belleÄi azaltÄąr, ancak iletiÅim yÞkÞnÞ artÄąrÄąr.
Bu daÄÄątÄąlmÄąÅ yÃķntemler için bellek kullanÄąmÄąnÄą tahmin etmek zorlu bir gÃķrevdir, çÞnkÞ parametreler, gradyanlar, aktivasyonlar ve optimizer durumlarÄąnÄąn daÄÄąlÄąmÄą tekniklere gÃķre deÄiÅir. AyrÄąca, transformer gÃķvdesi ve dil modeli baÅlÄąÄÄą gibi farklÄą bileÅenler, farklÄą bellek ayÄąrma davranÄąÅlarÄą gÃķsterebilir.
LLMem ÃÃķzÞmÞ
AraÅtÄąrmacÄąlar, LLMemâi Ãķnerdiler, bu da LLMâlerin daÄÄątÄąlmÄąÅ iyileÅtirme yÃķntemleri uygulanÄąrken GPU bellek tÞketimini doÄru bir Åekilde tahmin eden bir çÃķzÞmdÞr.
LLMem, hesaplamadan Ãķnce parametreleri birleÅtirmek (ZeRO Stage 3), geri yayÄąlÄąm sÄąrasÄąnda Ã§ÄąktÄą toplamak (tensor paralellik) ve transformer gÃķvdesi ve dil modeli baÅlÄąÄÄą için farklÄą bellek ayÄąrma stratejileri gibi faktÃķrleri dikkate alÄąr.
Deneysel sonuçlar, LLMemâin tek bir GPUâda LLMâlerin iyileÅtirilmesi için zirve GPU bellek kullanÄąmÄąnÄą %1,6ânÄąn altÄąnda bir hata oranÄąyla tahmin edebileceÄini, bu da DNNMemâin ortalama %42,6âlÄąk hata oranÄąnÄą aÅar. LLMâlerin birden fazla GPUâda daÄÄątÄąlmÄąÅ iyileÅtirme yÃķntemleri uygulandÄąÄÄąnda, LLMem %3,0âlÄąk ortalama bir hata oranÄąyla baÅarÄąlÄą olur.













