Yapay zeka modelleri ve platformlarÄą

BÞyÞk Dil Modellerinin Tahmin ve İyileştirme için Bellek Optimizasyonu

mm
Unite.AI sitesini Google'daki tercih ettiğiniz kaynaklara ekleyin

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(&quot;bigcode/octocoder&quot;,
torch_dtype=torch.bfloat16,
device_map=&quot;auto&quot;,
pad_token_id=0)
tokenizer = AutoTokenizer.from_pretrained(&quot;bigcode/octocoder&quot;)
pipe = pipeline(&quot;text-generation&quot;, model=model, tokenizer=tokenizer)</p>

<p>prompt = &quot;Soru: Python'da baytlarÄą gigabayta dÃķnÞştÞrmek için bir fonksiyon yazÄąn.\n\nCevap:&quot;
result = pipe(prompt, max_new_tokens=60)[0][&quot;generated_text&quot;][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.0260648727417

Zirve 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:

&amp;lt;/div&amp;gt;
# 8-bit nicelendirme
model = AutoModelForCausalLM.from_pretrained(&quot;bigcode/octocoder&quot;, load_in_8bit=True,
pad_token_id=0)
pipe = pipeline(&quot;text-generation&quot;, model=model, tokenizer=tokenizer)
result = pipe(prompt, max_new_tokens=60)[0][&quot;generated_text&quot;][len(prompt):]
bytes_to_gigabytes(torch.cuda.max_memory_allocated())&lt;/pre&gt;
Ã‡ÄąktÄą:
15.219234466552734
# 4-bit nicelendirme
model = AutoModelForCausalLM.from_pretrained(&quot;bigcode/octocoder&quot;, load_in_4bit=True,
low_cpu_mem_usage=True, pad_token_id=0)
pipe = pipeline(&quot;text-generation&quot;, model=model, tokenizer=tokenizer)
result = pipe(prompt, max_new_tokens=60)[0][&quot;generated_text&quot;][len(prompt):]
bytes_to_gigabytes(torch.cuda.max_memory_allocated())

Ã‡ÄąktÄą:

9.543574333190918

8-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:

  1. 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.
  2. 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.
  3. 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.
  4. 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.

Ön eğitimli LLM'ler için GPU Bellek KullanÄąmÄąnÄąn Tahmini

Ön eğitimli LLM’ler için GPU Bellek KullanÄąmÄąnÄąn Tahmini

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.

LLMem, bellek gereksinimlerini Ãķnceden doğru bir şekilde tahmin ederek, kullanÄącÄąlarÄąn en verimli dağıtÄąlmÄąÅŸ iyileştirme yapÄąlandÄąrmasÄąnÄą seçmesine yardÄąmcÄą olur.

Yeni Teknikler

Nicelendirme, tensor paralellik ve model paralellik gibi teknikler kurulmuşken, araştÄąrmacÄąlar, verimli LLM eğitimi ve dağıtÄąmÄą için yeni yÃķntemler keşfetmeye devam ediyor.

  1. LoRA ve QLoRA: Bu teknikler, bÞyÞk bir LLM’yi doğrudan iyileştirmek yerine, yeni bilgi ile gÞncellemek için daha kÞçÞk bir artÄąmlÄą bir adaptÃķr modÞlÞnÞ eğitmeyi içerir. Bu, model performansÄąnÄą korurken Ãķnemli bellek tasarrufu sağlar.
  2. FlashAttention: Self-attention mekanizmasÄą, transformer modellerinde bir bellek ve hesaplama darboğazdÄąr. FlashAttention, standard attentionÄą lineer karmaÅŸÄąklÄąkta yaklaÅŸÄąk olarak hesaplar, bu da bellek gereksinimlerini girdinin uzunluğunun karesinden lineer olarak azaltÄąr.
  3. Uzmanlar KarÄąÅŸÄąmÄą: Bu yaklaÅŸÄąm, her girdi veri Ãķrneğini, tÞm modeli işlemek yerine, uzman bir modele yÃķnlendirir. Bu, her Ãķrnek için yalnÄązca bir alt kÞme uzmanlarÄąn etkinleştirilmesini sağlayarak bellek tasarrufu sağlar.
  4. Ters Model Cerrahisi: AraştÄąrmacÄąlar, daha az Ãķnemli bileşenleri (dikkat başlÄąklarÄą) kaldÄąrarak modeli cerrahi olarak sÄąkÄąÅŸtÄąrmayÄą keşfettiler. Bu, bellek/hÄąz için doğruluk arasÄąnda bir ticaret sağlar.
  5. Offloading: Son olarak, parametreleri, optimizer durumlarÄąnÄą veya aktivasyonlarÄą CPU RAM’ine veya diske offload eden teknikler, bÞyÞk modeller için sÄąnÄąrlÄą GPU belleğini tamamlayabilir.

Bu yeni yÃķntemler, verimli LLM eğitimi ve dağıtÄąmÄą için araştÄąrma ekosistemini gÃķstermektedir.

Sonuç

BÞyÞk dil modellerinin bellek gereksinimleri, gerçek dÞnya uygulamalarÄąnda yaygÄąn olarak benimsenmeleri için Ãķnemli bir engel oluşturur. LLM’lerin dağıtÄąmÄąnÄą optimize etmek için bellek tahmin tekniklerini anlama, nicelendirme, dağıtÄąlmÄąÅŸ eğitim stratejileri ve yeni gelişen yenilikleri kullanarak, kaynak kÄąsÄątlÄą cihazlarda LLM’lerin verimli bir şekilde çalÄąÅŸtÄąrÄąlmasÄąnÄą sağlayabiliriz.

Araçlar gibi LLMem, bellek gereksinimlerini doğru bir şekilde tahmin ederek, kullanÄącÄąlarÄąn en verimli dağıtÄąlmÄąÅŸ iyileştirme yapÄąlandÄąrmasÄąnÄą seçmesine yardÄąmcÄą olur. DonanÄąm geliştikçe ve araştÄąrma ilerledikçe, daha verimli LLM eğitimi ve tahmine doğru ilerleyebiliriz, bu da doğal dil işleme ve yapay zeka alanlarÄąnda ilerlemeye yol açar.

Model kapasitesi, doğruluk ve kaynak kullanÄąmÄą arasÄąnda doğru dengeyi bulmak, bÞyÞk dil modellerinin çeşitli alanlarda ve kullanÄąm durumlarÄąnda tam potansiyellerini aÃ§ÄąÄŸa Ã§Äąkarmak için kritik olacaktÄąr. Bellek optimizasyon tekniklerini benimseyerek, state-of-the-art dil AI’nin erişilebilir, Ãķlçeklenebilir ve sÞrdÞrÞlebilir olacağı bir geleceğe doğru ilerlemekteyiz.

Son beş yÄąldÄąr Makine Öğrenimi ve Derin Öğrenme dÞnyasÄąna kendimi adamÄąÅŸ bulunuyorum. Tutkum ve uzmanlığım, Ãķzellikle AI/ML'ye odaklanarak 50'den fazla çeşitli yazÄąlÄąm mÞhendisliği projesine katkÄąda bulunmama yol açtÄą. SÞregelen meraklÄąlığım da beni Doğal Dil İşleme alanÄąna yÃķneltti, bu alana daha da derinlemesine girmeye hevesliyim.