SON DAKİKA

Nvdia

“CPU-GPU Bellek Paylaşımı ile Büyük Ölçekli LLM Çıktı Hızlandırma ve KV Önbellek Offload’u”

Büyük Dil Modelleri (LLM’ler), yapay zeka yeniliklerinin öncüsü konumundadır. Ancak, bu modellerin büyük boyutları, çıkarım verimliliğini zorlaştırabilir. Örneğin, Llama 3 70B ve Llama 4 Scout 109B gibi modeller, büyük bağlam pencereleri dahil edildiğinde, GPU’daki bellekten daha fazla bellek talep edebilir.

Örneğin, Llama 3 70B ve Llama 4 Scout 109B modellerinin yarım hassasiyet (FP16) modunda yüklenmesi sırasıyla yaklaşık 140 GB ve 218 GB bellek gerektirir. Bu modellerin çıkarım sürecinde, bağlam uzunluğu ve işlemci sayısı ile büyüyen ek veri yapıları olan anahtar-değer (KV) cache’i de gerekir. Tek bir kullanıcı (batch boyutu 1) için 128k token bağlam penceresini temsil eden bir KV-cache, Llama 3 70B ile yaklaşık 40 GB bellek tüketir ve bu, kullanıcı sayısı ile doğru orantıda artar. Üretim ortamında, bu tür büyük modellerin tamamen GPU belleğine yüklenmesi out-of-memory (OOM) hatası ile sonuçlanabilir.

NVIDIA Grace Blackwell ve Grace Hopper mimarilerindeki CPU ve GPU arasındaki bağlantı, 900 GB/s hızında, bellek tutarlı NVLink C2C ile gerçekleştirilir. Bu, PCIe Gen 5’ten 7 kat daha fazla bant genişliği sunar. NVLink-C2C bellek tutarlılığı, CPU ve GPU tarafından paylaşılan tek bir birleşik bellek adres alanı oluşturur (Şekil 1). Bu sayede, aynı verilere erişmek ve bu veriler üzerinde işlem yapmak mümkündür, böylece açık veri transferleri veya çift bellek kopyaları gerekmez.

Bu yapı, büyük veri setlerinin ve modellerinin daha kolay erişilmesini ve işlenmesini sağlar. NVLink-C2C bağlantısının yüksek bant genişliği ve Grace Hopper ile Grace Blackwell’daki birleşik bellek mimarisi, LLM ince ayarları, KV cache offload, çıkarım, bilimsel hesaplama ve daha fazlasının verimliliğini artırır. Bu da, modellerin verileri hızla taşımasını ve GPU belleği yeterli olmadığında CPU belleğini kullanmasını sağlar.

The figure shows how CPU physical memory and GPU physical memory serve to create a single system memory page table to be shared across both.
Şekil 1. NVLink-C2C tutarlılığı ve adres çevirme servisi

Örneğin, NVIDIA GH200 Grace Hopper Superchip platformuna bir model yüklendiğinde, bu model 96 GB yüksek bant genişliğine sahip GPU belleğini kullanır ve ayrıca CPU’ya bağlı 480 GB LPDDR belleğe erişir. Bu sayede veri transferine gerek kalmadan toplam kullanılabilir bellek genişletilmiş olur; bu da modellerle ve veri setleriyle çalışmayı mümkündür kılar.

Kod Yürüyüşü

Bu blog yazısında, örnek olarak Llama 3 70B modelini ve GH200 Superchip’i kullanarak, birleşik bellek ile büyük bir modelin GPU’ya nasıl akıtılacağını göstereceğiz.

Başlamak için

Öncelikle, ortamımızı ayarlamamız ve Llama 3 70B modeline erişim sağlamamız gerekiyor. Aşağıdaki kod örnekleri, bu yazının yararlarını gösteren bir NVIDIA Grace Hopper GH200 Superchip makinesinde çalışmak üzere tasarlanmıştır.

  1. Model erişimi talep edin: Hugging Face’teki Llama 3 70B modelinin sayfasını ziyaret ederek erişim talep edin.
  2. Erişim belirteci oluşturun: Talebiniz onaylandıktan sonra, Hugging Face hesabı ayarlarınızda bir erişim verisi oluşturun. Bu belirteç, modele programlı olarak erişiminizi doğrulamak için kullanılacak.
  3. Gerekli paketleri yükleyin: Modelle etkileşime geçebilmek için gerekli Python kütüphanelerini yükleyin. GH200 makinesinde Jupyter defterini açın ve aşağıdaki komutları çalıştırın:
#Hugging Face ve CUDA paketlerini yükleyin
!pip install --upgrade huggingface_hub
!pip install transformers
!pip install nvidia-cuda-runtime-cu12
  1. Hugging Face’e giriş yapın: Paketleri yükledikten sonra, oluşturduğunuz belirteçle Hugging Face’e giriş yapın. huggingface_hub kütüphanesi bunu kolaylaştırır:
#Oluşturulan belirteç ile Hugging Face'e giriş yapın

from huggingface_hub import login
login("belirtecinizi buraya girin")

Llama 3 70B modeli GH200’ye yüklendiğinde ne olur?

Llama 3 70B modelini GPU belleğine yüklemeye çalıştığınızda, modelin parametreleri (ağırlıkları) GPU belleğine (NVIDIA CUDA belleği) yüklenir. Yarım hassasiyette (FP16) bu ağırlıkların yaklaşık 140 GB GPU belleğine ihtiyacı vardır. GH200 yalnızca 96 GB bellek sağladığı için model tam olarak mevcut belleğe sığamaz ve yükleme süreci bir OOM hatasıyla sonuçlanır. Aşağıdaki hücrede bu durumu bir örnek kod ile göstereceğiz.

import torch
from transformers import pipeline
pipe = pipeline("text-generation", model="meta-llama/Llama-3.1-70B") # modeli GPU belleğine yükler

Yukarıdaki komutları çalıştırdığınızda, aşağıdaki hata mesajını görürüz:

Hata mesajı:
OutOfMemoryError: CUDA out of memory. 896.00 MiB tahsis etmeye çalıştı. GPU 0'ın toplam kapasitesi 95.00 GiB, bunun 524.06 MiB'i boştur. Ayrık PyTorch bellek dışındaki bellek, bu süreçte 86.45 GiB kullanılmaktadır. Ayrılan belleğin 85.92 GiB'i PyTorch tarafından ayrılmıştır ve 448.00 KiB'i PyTorch tarafından ayrılmış ancak ayrılmamıştır. Eğer ayrılmış ancak ayrılmamış bellek çok büyükse, parçalayıcıdan kaçınmak için PYTORCH_CUDA_ALLOC_CONF=expandable_segments:True ayarlamayı deneyin. Bellek Yönetimi belgelerine bakın.

Hata mesajından, GPU belleğinin dolu olduğunu görebiliyoruz. GPU bellek durumunuzu kontrol etmek için şu komutu çalıştırabilirsiniz:

!nvidia-smi

Bu komutu çalıştırdığınızda elde edeceğiniz çıktı, aşağıdaki görüntüye benzer olmalıdır. Çıktı, GPU üzerinde 96.746 GB belleğin 97.871 GB’ını tükettiğimizi gösterir. Çıktıyı daha iyi anlamak için referans olarak bu forum‘a göz atabilirsiniz.

Output from nvidia-smi showing that we have consumed 96.746 GB of the memory out of 97.871 GB on the GPU.
Şekil 2. nvidia-smi çıktısı

Bir sonraki adımlarımıza hazırlanmak ve GPU belleğini serbest bırakmak için, bu başarısız denemeden kalan tüm değişkenleri temizleyeceğiz. Aşağıdaki komutta, <PID> kısmını Python işlem kimliğinizle değiştirin; bu kimliği !nvidia-smi komutunu çalıştırarak bulabilirsiniz.

!kill -9 <PID>

Bu OOM hatası nasıl çözülür?

Bu sorun, yönetilen bellek tahsisatlarının kullanılmasıyla çözülebilir. Bu, GPU’nun kendi belleğine ek olarak CPU belleğine de erişebilmesini sağlar. GH200 sisteminde, birleşik bellek mimarisi, CPU’nun (480 GB’a kadar) ve GPU’nun (144 GB’a kadar) tek bir adres alanını paylaşmasını ve her birinin birbirinin belleğine şeffaf bir şekilde erişimini sağlar. RAPIDS Bellek Yöneticisi (RMM) kütüphanesini yönetilen belleği kullanacak şekilde yapılandırarak, geliştiricilerin hem GPU hem de CPU’dan erişilebilen bellek tahsis etmeleri sağlanır; bu da iş yüklerinin fiziksel GPU bellek limitini aşmasına olanak tanır ve manuel veri transferi gerektirmez.

import rmm
import torch
from rmm.allocators.torch import rmm_torch_allocator
from transformers import pipeline

rmm.reinitialize(managed_memory=True)  # CPU belleğine erişimi sağlıyor
torch.cuda.memory.change_current_allocator(rmm_torch_allocator)
 # PyTorch'un RMM bellek yöneticisini kullanarak birleşik belleği tüm bellek tahsisatları için kullanır


pipe = pipeline("text-generation", model="meta-llama/Llama-3.1-70B")

Model yükleme komutunu çalıştırdığımızda artık OOM hatasıyla karşılaşmıyoruz, çünkü artık daha geniş bir bellek alanına erişimimiz var. Artık LLM’ye bir istek göndermek ve yanıt almak için komutu kullanabilirsiniz.

pipe("Dünyanın en yüksek dağı hangisidir?")

Sonuç

Model boyutları büyüdükçe, model parametrelerini GPU’lara yüklemek önemli bir zorluk haline gelmiştir. Bu blogda, birleşik bellek mimarisinin bu sınırlamaları nasıl aştığını keşfettik; böylece açık veri transferi gerektirmeden CPU ve GPU belleklerine erişim sağlanır. Bu durum, modern donanımlarda son teknoloji LLM’lerle çalışmayı çok daha kolay hale getirir.

Daha fazla bilgi edinmek için CPU ve GPU bellek yönetimi hakkında RAPIDS Bellek Yöneticisi belgelerine göz atabilirsiniz.

Kaynak

Nvdia Blog

Düşüncenizi Paylaşın

E-posta adresiniz yayınlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

İlgili Teknoloji Haberleri