ML araştırması için GPU · KYC'siz kripto ödeme
IteraGPU
Yöntem 01 · Tahminden ölçüme

Bellek zirvesi neden tahmininizi aşıyor?

Bir ağırlık formülü, parametrelerin depolanmasını tanımlar; tepe değer ise girişleri ve geçici tahsisleriyle bir çalıştırmayı tanımlar. Farkı açıklamak için aynı birimleri koruyun, her aşamayı ölçün ve ayrılan belleği, rezerve edilen belleği ve kart doluluğunu birbirinden ayırın. IteraGPU Lab v1 dosyası, yeniden üretilebilir bir hesaplama ve küçük, enstrümante edilmiş bir alıştırma sunar. Aşağıdaki örnek sayılar hesaplamalardır, hiçbir zaman yayımlanmış GPU ölçümleri değildir.

01 /

Sayaç seçmeden önce yükü belirleyin

« 7B'lik bir model» ne ağırlıkların gösterimini ne de yapılacak işi belirtir. Sürümünü, çerçevesini, eklenti sürümlerini, gerçekte yüklenen biçimi ve işlemi not edin: eğitim, uyarlama veya üretim. Metin için giriş ve çıkış uzunluklarını; görüntü için çözünürlüğü ve görüntü sayısını kaydedin. Çok kipli bir model bu iki boyutun da korunmasını gerektirir.

Her zamanki bir girdi, uzun ama beklenen bir girdi ve işlevsel sınırınıza yakın bir girdi hazırlayın. Bunları karşılaştırmalar sırasında saklayın. Tokenizasyon, padding, gruplama veya yeniden boyutlandırma sonrasındaki şekilleri doğrulayın: yapılandırmaya yazılan değer, gerçekte işlenen şekli kanıtlamaz.

Aynı anda bellekte kalan her şeyi de sabitleyin: bir dizi, bir microbatch, birden fazla istek veya eğitimden sonra başlatılan bir değerlendirme. Sorunuz artık doğrulanabilir hale gelir: bu tam yük, en zorlu adımı da dahil olmak üzere kullanılan her cihaza sığıyor mu?

  • Deneme kimliği: model veya kod, revizyon, girdi kümesi ve ilgili olduğunda tohum değeri.
  • Boyutlar: batch, bağlam, üretilen token'lar, çözünürlük veya eşzamanlı istek sayısı.
  • Ortam: seçilen GPU, sürücü, Python, PyTorch, CUDA veya HIP/ROCm arka ucu ve ayırıcı ayarları.
  • Kapsam: yükleme, hesaplama, aktarım, değerlendirme, dışa aktarma; ilk geçiş veya ısınma sonrası geçiş.
02 /

Ağırlıkları GB ile GiB'yi karıştırmadan hesaplayın

Bir GB 1 000 000 000 bayta karşılık gelir; bir GiB ise 1 073 741 824 bayta. Burada kullanılan PyTorch sayaçları bayt döndürür. Bu ham değeri sonuç dosyasında saklayın, ardından satırları karşılaştırmak için tek bir dönüştürme uygulayın. Bir kartın ticari adı, aygıtın gerçekte bildirdiği kapasitenin yerini tutmaz.

Her biri iki bayt olarak saklanan yedi milyar parametreli yoğun bir küme için ağırlıklar 14 000 000 000 bayt eder: 14 GB veya yaklaşık 13,04 GiB. Bu işlem ne aktivasyonları, ne gradyanları, ne KV önbelleğini ne de en iyileyici durumlarını içerir. 4 GiB'lik bir pay eklendiğinde hazırlık varsayımı olarak yaklaşık 17,04 GiB elde edilir; bu, bir iş yükünün bu zarfa sığacağını kanıtlamaz.

Teorik dört bitlik bölme, tekdüze kompakt bir depolama varsayar. Gerçek bir nicemlenmiş yükleme ölçekler ve başka bilgiler ekleyebilir, bazı modülleri farklı bir hassasiyette tutabilir. Bu nedenle ağırlık depolama biçimi ile hesaplama biçimi fiche'nizde ayrı ayrı yer almalıdır.

GiB cinsinden tahmini ağırlık = parametreler × parametre başına bit ÷ 8 ÷ 1 073 741 824
7 000 000 000 parametre için örnek hesaplama; hiçbir yürütme sonucu değildir.
Depolama varsayımıHesaplanan baytYaklaşık GiB
Tekdüze 32 bit28 000 000 00026,08
Tekdüze 16 bit14 000 000 00013,04
Kompakt 4 bit, üst veriler hariç3 500 000 0003,26

Teknik kaynaklar: NIST — ikili önekler ve GB/GiB karşılaştırması · Hugging Face — bitsandbytes ile nicemlenmiş biçimler ve modüller

03 /

Eğitimde tam bir adım ölçün

Ağırlıklar başka nesnelerle bir arada bulunur: gradyanlar, en iyileyici durumları, geri geçiş için gereken aktivasyonlar ve geçici tensörler. Boyutları döngüye, hassasiyete ve iş yükünün boyutlarına bağlıdır. Parametre başına bayt cinsinden evrensel bir sabit, özellikle microbatch ve girdilerin etkisini gizler.

İleri geçişi, kayıp hesaplamasını, geri yayılımı ve güncellemeyi ölçümleyin. En iyileyicinizin gerçekte oluşturduğu durumları gözlemlemek için modelin yüklenmesinde durmayın. Ayrıca ilk tam adımın ölçümünü de saklayın: başarılı bir ısınma, başlangıçta bellekte karşılamanız gereken bir ilklendirmeyi zaten gerçekleştirmiş olabilir.

Projenizin gerektirdiği değerlendirmeyi ve dışa aktarmayı ekleyin. Hata değerlendirme sırasında ortaya çıkıyorsa, yalnızca eğitim batch'ini küçültmek bu aşamayı düzeltmez. Az sayıda parametre eğiten bir uyarlama, yine de büyük bir temel model ve hacimli aktivasyonlar barındırabilir.

Teknik kaynaklar: Hugging Face — eğitim sırasında bellek kategorileri

04 /

Çıkarımda bağlamı ve eşzamanlılığı izleyin

Dikkatli otomatik bağlam üretiminde, KV önbelleği token'larla ilişkili durumları tutar. Tekdüze yoğun bir önbellek için boyutu katmanlara, KV başlarına, bunların boyutuna, tutulan token'lara ve aynı anda bulunan dizilere bağlıdır. Modelin sorgu başlarını değil, KV başlarını kullanın.

Aritmetik örnek: 32 katman, 8 KV başı, 128 boyut, 8 192 token, değer başına iki bayt ve bir dizi 1 073 741 824 bayt, yani K ve V birlikte 1 GiB verir. Aynı dört dizi yalnızca bu kalem için 4 GiB verir. Bu hesaplama ne verimi ne de GPU'nun tam doluluğunu ölçer.

Formülü gerçekte kullanılan önbelleğe uyarlayın. Kayan bir pencere tüm geçmişi tutmayabilir; statik bir önbellek azami kapasitesini önceden ayırabilir. Nicemlenmiş ve yere kaydırılmış önbellekler de sorunu değiştirir. Girdinin ilk işlenmesini ve üretimi ayrı ayrı ölçün, aralarındaki tüm farkı otomatik olarak önbelleğe yüklemeyin.

Bayt cinsinden yoğun KV ≈ 2 × katman × KV başı × baş boyutu × tutulan token × dizi × değer başına bayt

Teknik kaynaklar: Hugging Face — önbellek stratejileri, statik ayırma ve pencereler

05 /

Allocated ve reserved: toplanmayan iki okuma

memory_allocated, PyTorch tarafından aygıtta izlenen tensörlerin kapladığı baytları tanımlar. memory_reserved, önbellekli ayırıcısı tarafından yönetilen belleği tanımlar; buna hâlihazırda bu tensörlere hizmet eden bellek de dahildir. İkisini toplamak, belleğin bir kısmını iki kez sayar. Bunları iki ayrı sütunda saklayın.

Bunların maks değerleri, izlemenin başlangıcından ya da son sıfırlamadan bu yana bir tepe değeri kaydeder. Bunlar dönemin mutlak tepeleridir ve başlangıçta zaten mevcut olan tahsisleri de içerir. Sonuç, otomatik olarak yalnızca bu aşamada oluşturulan nesneleri temsil etmez.

Bir sistem okuması daha geniş bir kapsama sahip olabilir. Örneğin bazı NCCL iletişimleri gibi doğrudan bir CUDA kütüphanesi tarafından yapılan tahsislerin tümü PyTorch ayırıcısında görünmez. Dolayısıyla bir sistem aracıyla arasındaki fark tek başına bir sızıntı olduğunu kanıtlamaz.

Aynı cihaz için kaydedilmesi gereken dört sayaç, hepsi bayt cinsinden.
SayaçYanıtladığı soruKaçınılması gereken hata
memory_allocatedBu okuma noktasında tensörler ne kadar yer kaplıyor?Bunu kartın tüm doluluğu olarak almak.
memory_reservedBu okuma noktasında ayırıcı ne kadarını yönetiyor?Bunu allocated değerine eklemek.
max_memory_allocatedDönem boyunca tensörlerin hangi tepesi izlendi?Bunu aşama sonundaki değerle karıştırmak.
max_memory_reservedAyırıcı hangi rezervasyon tepesini bildiriyor?Bunun diğer tepeyle aynı anda gerçekleştiğini varsaymak.

Teknik kaynaklar: PyTorch — memory_allocated · PyTorch — memory_reserved · PyTorch — max_memory_allocated · PyTorch — ayırıcısı dışındaki tahsisler

06 /

İki tepe arasındaki fark neden önbelleği ölçmez

Yalnızca tablodaki iki kurgusal anı ele alalım. allocated tepesi 8 GiB, reserved tepesi ise 12 GiB. Aralarındaki fark olan 4 GiB, bu iki andan hiçbirinde gözlemlenen fark değildir: bu fark sırasıyla 2 ve 6 GiB'dir. İki maksimum, illa aynı durumu tanımlamaz.

Belirli bir andaki aralarındaki farkı incelemek için allocated ve reserved değerlerini aynı kontrol noktasında, senkronizasyondan sonra ve okumalar arasında kasıtlı yeni bir işlem yapmadan kaydedin. Bu anda sayaçlar arasındaki bir fark elde edersiniz; modelin KV önbelleğinin bir ölçümü değil, ne de bu farkın tamamının bir sonraki tahsisi karşılayabileceğinin garantisi.

Ayırıcının backend'ini de raporda tutun. PyTorch 2.14 belgeleri, cudaMallocAsync ile max_memory_reserved değerinin iki havuzun en yüksek seviyelerini birleştirerek eşzamanlı tepenin bir üst sınırını verebileceğini belirtir. Bu, sayacın adını ve kapsamını koruma gereğini güçlendirir.

Hesabı açıklamak için uydurulmuş iki durum; bu tablo bir GPU izi değildir.
Örnek anAllocatedReservedBu andaki reserved − allocated
A8 GiB10 GiB2 GiB
B6 GiB12 GiB6 GiB

Teknik kaynaklar: PyTorch — max_memory_reserved tanımı ve sınırı

07 /

Tepesini kaydetmeden önce her aşamayı sınırlandırın

GPU işlemleri tamamlanmadan önce kuyruğa alınabilir. Aşama başına ölçüm için, tepeleri sıfırlamadan önce önceki işleri tamamlayın, ardından okumadan önce aşamanın bitmesini bekleyin. torch.cuda.synchronize, seçilen cihazın tüm stream'lerinin kernel'lerini bekler; bu seçim, bu protokol için açık bir sınır tanımlar.

reset_peak_memory_stats, tepe izlemesini mevcut durumdan itibaren sıfırlar; programın tensörlerini serbest bırakmaz. Önce başlangıç seviyelerini kaydedin. Sonda, iki mutlak tepeyi ve iki mevcut seviyeyi koruyun. Bir başlangıç seviyesinin çıkarılmasını tüm geçici tensörlerin tam hacmi olarak sunmayın: önceki nesneler de aşama sırasında serbest bırakılmış olabilir.

Bu enstrümantasyon, aşamaların olağan örtüşmesini değiştirebilir. Sorunu yerelleştirmek için kullanın, ardından tam döngüyü gerçek zamanlamasıyla da doğrulayın. Çok kartlı kurulumda, okumaları her cihaz için yineleyin; cuda:0 üzerindeki bir ölçüm diğer GPU'ları tanımlamaz.

  • 1. Aşamaya bir ad verin ve tam girdilerini not edin.
  • 2. Cihazı senkronize edin, ardından başlangıç allocated ve reserved değerlerini kaydedin.
  • 3. Aynı cihazda reset_peak_memory_stats çağırın.
  • 4. Tanımlanan aşamayı, sonraki adımlar için gerekli çıktıları koruyarak çalıştırın.
  • 5. Senkronize edin, tepeleri ve bitiş seviyelerini kaydedin, ardından başarı veya hatayı kaydedin.
  • 6. Ham sonucu, boyutları ve yapılandırmayı saklayın; eksik hiçbir ölçümü sıfırla doldurmayın.

Teknik kaynaklar: PyTorch — bir cihazın senkronizasyonu · PyTorch — tepe istatistiklerinin sıfırlanması

08 /

İlk geçiş ile ısınma sonrası geçişleri ayırt edin

İlk deneme ile önceden hazırlanmış bir döngü aynı soruya yanıt vermez. Yüklemenin ve ilk geçişin kaydını tutun, ardından tekrarlardan önceki ısınma iterasyonlarının sayısını belgeleyin. Sonraki geçişler daha hafif olacak diye bir başlatma hatasını silmeyin.

IteraGPU betiği model_load, inputs, cold_forward, warmup ve warm_forward aşamalarını birbirinden ayırır. cold_forward, cihaz başlatıldıktan sonra küçük modelin ilk geçişidir. Bir sunucunun, sürücünün veya servisin tüm açılışını ölçmez. warm_forward tekrarları aynı süreçte kalır ve sürecin mevcut durumundan yararlanır.

Kendi modeliniz için, önceki nesneleri veya rezervasyonları bırakabilecek bir koşulu değiştirdiğinizde yeni bir süreçte yeni bir seri başlatın. Denemelerin sırasını ve ısınma politikasını not edin. Aynı döngüyü beş kez yeniden çalıştırmak ile beş süreç başlatmak aynı protokol değildir.

09 /

Notebook'u ve IteraGPU Lab v1 betiğini kullanma

README ile başlayın, ardından bağımsız notebook'u veya Python betiğini indirin. estimate hesaplaması standart kütüphaneyi kullanır. Ölçüm, uyumlu bir GPU arka ucuyla kurulmuş PyTorch ve erişilebilir bir cihaz gerektirir; ne model ne de paket indirir. Notebook, ipynb dosyalarını okuyabilen bir ortam gerektirir.

Ölçüm alıştırması özgün küçük bir yoğun ağ ve sentetik girdiler kullanır. batch, context ve width seçenekleri bu ağın tensörlerini tanımlar; context burada KV önbellekli gerçek bir LLM'in uzunluğu değildir. Bu materyal, ölçüm yöntemini incelemeye ve tek bir boyutu değiştirmeye yarar. Bir kartın araştırma modeliniz için kapasitesini kanıtlamaz.

Aşağıdaki komutları betiği içeren klasörden çalıştırın. Önce environment raporuna bakın. PyTorch veya GPU yoksa measure açıkça kod 2 ile durmalıdır; hiçbir CPU sonucu GPU ölçümü olarak yorumlanmamalıdır. Başarılı bir ölçümün çıktı JSON'u sizin ortamınızda üretilir. Her seri için yeni bir dosya adı seçin: betik mevcut bir sonucun üzerine yazmayı reddeder.

İlk komut, ağırlıkların ve varsayımsal 4 GiB rezervin hesabını yeniden yapar. Sonrakiler için, kullanma izniniz olan bir cihaz kullanın ve başlangıçta mütevazı boyutlar tutun. Gerçekte kullanılan PyTorch sürümünü not edin: bu sayfadaki teknik referanslar özellikle 2.14 sürümünü açıklar, ancak bunun sizde kurulu olmasını şart koşmaz.

Betiğin çalışması küçük bir vakada kontrol edildi: katalog dışı yerel RTX 5070, sürücü 610.62, Python 3.14.6 ve PyTorch 2.11.0+cu128. Denemede batch 1, context 16, width 64, float32, bir ısınma ve iki tekrar kullanıldı. Bu, söz konusu yürütme yolunu doğrular; bir LLM'i, eğitimi veya kiralamaya sunulan GPU'ları nitelendirmez. Notebook çıktılar olmadan ve karşılaştırma tablosu sonuçlar olmadan teslim edilir; PyTorch yokluğu koruması da ayrı bir ortamda doğrulanmıştır.

shell
python mesure_memoire.py estimate --parameters 7000000000 --bits 16 --reserve-gib 4
python mesure_memoire.py environment --device cuda:0
python mesure_memoire.py measure --device cuda:0 --batch 2 --context 128 --width 1024 --dtype float32 --warmup 3 --repeats 5 --output mesures.json
10 /

Kart değiştirmeden önce bir arızayı yorumlama

Tamamlanmamış bir deneme yine de faydalı bir gözlemdir. Aşamayı, istenen boyutları, hata mesajını ve mevcut son değerleri saklayın. Doygunluktan önceki kısmi bir tepe, tam bir çalıştırmanın bellek ihtiyacını oluşturmaz. Sonuç veren bir vaka kurmak için tek bir boyutu azaltın, ardından başarı ile başarısızlık arasındaki sınırı arayın.

empty_cache, ayırıcı önbelleğindeki kullanılmayan blokları serbest bırakır, ancak hâlâ yaşayan tensörleri serbest bırakmaz. Çok büyük bir yük için evrensel bir çözüm değildir. Her tekrarda çağırmak koşulları değiştirir: bu seçimi belgeleyin, bu denemeleri önbelleği koruyanlarla karıştırmayın.

Basit sayaçlar durumu açıklamıyorsa, bir bellek izi zaman içindeki ayırmaları belirlemeye yardımcı olabilir. Kapsamı PyTorch tarafından görülebilen ayırmalarla sınırlıdır. Bu nedenle düşük bir allocated zirvesi, harici bir ayırmayı veya kartın başka bir kullanıcısını dışlamaz.

Belirtiyi otomatik bir teşhis olmadan bir sonraki kontrole bağlayın.
GözlemYararlı kontrolSonraki deneme
Yükleme sırasında başarısızlıkYüklü biçim, ağırlıkların yerleşimi ve hâlihazırda kullanılan bellek.Yüklemeyi tek başına yeni bir süreçte yeniden üretin.
Yükleme başarılı, geri yayılım imkânsızMikro batch, girişler, saklanan aktivasyonlar ve döngü durumu.Bir boyutu küçültüp ardından tam adımı yeniden yapın.
Tek başına değerlendirme başarısızDeğerlendirme batch'i, saklanan çıktılar ve hesaplama bağlamı.Değerlendirmeyi kendi sınırlarıyla ölçün.
Ayrılan bellek her tekrarda artıyorReferanslar listelerde, uygulama önbelleklerinde veya graflarda tutulur.Ayırıcıyı suçlamadan önce bunların yaşam süresini doğrulayın.
Hesaplamadan sonra Reserved yüksek kalırHâlâ canlı tensörler ve önbellek politikası.Sayaçları toplamadan güncel değerleri karşılaştırın.
Bir sistem aracı daha fazlasını gösterirAracın kapsamı, GPU bağlamı, diğer süreçler ve kütüphaneler.Yükü izole edin ve aynı anda alınan okumalarla karşılaştırın.

Teknik kaynaklar: PyTorch — empty_cache'in serbest bıraktıkları · PyTorch — bellek görünürlüğünün izleri ve sınırları

11 /

Karşılaştırılabilir yüklerden bir marj oluşturmak

Evrensel olarak sunulan bir marj yüzdesinden kaçının. Marj, tanımlanmış değişkenlikleri karşılamalıdır: daha uzun girdi, izin verilen batch, değerlendirme, dışa aktarma, kütüphane sürümü veya kartın diğer kullanımı. Beklenen sınır durumlarını test edin, ardından kapsam dışında kalanları kaydedin. Tek bir küçük girdi üzerinde başarılı bir çalıştırma, maksimum yükü doğrulamaz.

Her seferinde yalnızca bir değişkeni değiştirin: sabit bağlamda batch 1 sonra 2 veya sabit batch'te bağlam 2 048 sonra 4 096. Aynı içeriği ve aynı hazırlama kurallarını koruyun. Gerekli bir bilgiyi çıkaran bir kırpma, tepe değeri düşürse bile görevi farklı kılar.

Ağırlıklar baskınsa, kaliteyi kontrol ederek başka bir format inceleyin. Aktivasyonlar baskınsa, microbatch veya aktivasyon checkpointing olası yollar olabilir. Bu sonuncusu belleği yeniden hesaplama karşılığında değişir: süreyi de ölçün ve sonuçları doğrulayın. KV önbelleği baskınsa, bağlamı, eşzamanlılığı ve önbellek stratejisini inceleyin. Karşılaştırma dosyası bu yaklaşımı ortak bir kalite kuralıyla tamamlar.

Teknik kaynaklar: PyTorch — aktivasyon checkpointing ve yeniden hesaplama

12 /

İzden bir yapılandırma kararına geçmek

Beklenen çıktınız kısa bir kayıt formudur: ağırlık tahmini, test edilen maksimum yük, başarılı veya başarısız aşamalar, birimleriyle birlikte dört sayaç, ortam ve seçilen tercih. Ham sonucu bu forma ekleyin. Hesapladıklarınızı, gözlemlediklerinizi ve hâlâ varsaydıklarınızı birbirinden ayırın.

Ardından, yazılım kısıtlarını koruyarak ihtiyacı her kartın kapasitesiyle karşılaştırın. Birden fazla GPU, iş ve veri dağıtımı gerektirir; bunların varlığı uygulama için otomatik olarak tek bir bellek havuzu oluşturmaz. Bir karttaki hata, diğerinde boş bellek olsa bile devam edebilir.

PyTorch protokolü torch.cuda arayüzünü kullanır; PyTorch'un bir HIP/ROCm derlemesi bu adı yeniden kullanır. İki donanım ailesini karşılaştırmadan önce gerçekte kurulu olan arka ucu belirleyin. Aynı Python fonksiyonunun kullanılması, çekirdeklerin, hassasiyetlerin veya sonuçların eşdeğer olduğunu kanıtlamaz.

Boyutlandırıcı, başlangıç varsayımını yeniden ele almanızı sağlar; GPU kayıt formları ise kapasiteleri karşılaştırmanıza olanak tanır. Ardından seçimi doğrulamak için aynı iş durumuna geri dönün. İndirmedeki küçük ağ bir ölçümleme alıştırması olarak kalır: kendi marjınızı yalnızca, belgelenmiş ortamında iş yükünüzün çalıştırılması doğrulayabilir.

Teknik kaynaklar: NVIDIA — işin birden fazla GPU'ya dağıtımı · PyTorch — HIP/ROCm derlemelerinde torch.cuda arayüzü