GPU voor ML-onderzoek · Crypto-betaling zonder KYC
IteraGPU
Methode 01 · Van schatting naar meting

Waarom overtreft de geheugenpiek je schatting?

Een gewichtsformule beschrijft de opslag van de parameters; de piek beschrijft een uitvoering, met haar invoer en tijdelijke allocaties. Om het verschil te verklaren houd je dezelfde eenheden aan, meet je elke fase en scheid je toegewezen geheugen, gereserveerd geheugen en kaartgebruik. De map IteraGPU Lab v1 biedt een reproduceerbare berekening en een kleine geïnstrumenteerde oefening. De illustratieve cijfers hieronder zijn berekeningen, nooit gepubliceerde GPU-metingen.

01 /

De belasting definiëren voordat je de meter kiest

'Een model van 7B' vermeldt noch de representatie van de gewichten, noch het uit te voeren werk. Noteer de revisie, het framework, de versies van de extensies, het daadwerkelijk geladen formaat en de bewerking: training, fine-tuning of generatie. Noteer voor tekst de lengtes van invoer en uitvoer; voor vision de resolutie en het aantal afbeeldingen. Een multimodaal model vereist dat je beide dimensies aanhoudt.

Bereid een gebruikelijke invoer voor, een lange maar verwachte, en een dicht bij je functionele limiet. Bewaar ze tijdens de vergelijkingen. Controleer de vormen na tokenisatie, padding, groepering of herschaling: de waarde in de configuratie bewijst niet de vorm die daadwerkelijk wordt verwerkt.

Leg ook vast wat gelijktijdig in het geheugen blijft: één sequentie, een microbatch, meerdere verzoeken of een evaluatie die na de training wordt gestart. Je vraag wordt dan verifieerbaar: past deze volledige belasting op elk gebruikt apparaat, ook tijdens de meest veeleisende stap?

  • Identiteit van de proef: model of code, revisie, invoerset en seed indien van toepassing.
  • Dimensies: batch, context, gegenereerde tokens, resolutie of aantal gelijktijdige verzoeken.
  • Omgeving: geselecteerde GPU, driver, Python, PyTorch, CUDA- of HIP/ROCm-backend en allocator-instellingen.
  • Scope: laden, berekenen, overdragen, evalueren, exporteren; eerste pass of pass na opwarming.
02 /

Gewichten berekenen zonder GB en GiB te verwarren

Een GB komt overeen met 1 000 000 000 bytes; een GiB met 1 073 741 824 bytes. De hier gebruikte PyTorch-tellers geven bytes terug. Bewaar die ruwe waarde in het resultatenbestand en pas daarna één enkele conversie toe om de regels te vergelijken. Het commerciële label van een kaart vervangt niet de capaciteit die het apparaat daadwerkelijk aangeeft.

Voor een dense verzameling van zeven miljard parameters die elk op twee bytes worden opgeslagen, vertegenwoordigen de gewichten 14 000 000 000 bytes: 14 GB, of ongeveer 13,04 GiB. Deze berekening omvat geen activaties, geen gradiënten, geen KV-cache en geen optimizer-states. Een reserve van 4 GiB toevoegen geeft ongeveer 17,04 GiB als voorbereidingshypothese; dat bewijst niet dat een workload binnen dat budget past.

De theoretische deling naar vier bits veronderstelt een uniforme compacte opslag. Een echte gekwantiseerde lading kan scales en andere informatie toevoegen, en sommige modules in een andere precisie bewaren. Het opslagformaat van de gewichten en het rekenformaat moeten dus apart in je fiche staan.

Geschatte gewichten in GiB = parameters × bits per parameter ÷ 8 ÷ 1 073 741 824
Illustratieve berekening voor 7 000 000 000 parameters; geen uitvoeringsresultaat.
OpslaghypotheseBerekende bytesBij benadering GiB
32 bits uniform28 000 000 00026,08
16 bits uniform14 000 000 00013,04
4 bits compact, exclusief metadata3 500 000 0003,26

Technische bronnen: NIST — binaire prefixen en vergelijking GB/GiB · Hugging Face — gekwantiseerde formaten en modules met bitsandbytes

03 /

Bij training een volledige stap meten

De gewichten bestaan naast andere objecten: gradiënten, optimizer-states, activaties die nodig zijn voor de backward pass en tijdelijke tensors. Hun groottes hangen af van de loop, de precisie en de afmetingen van de workload. Een universele constante in bytes per parameter zou met name het effect van de microbatch en de inputs verbergen.

Instrumenteer de forward pass, de loss-berekening, de backpropagation en de update. Beperk je niet tot het laden van het model als je de states wilt observeren die je optimizer daadwerkelijk aanmaakt. Bewaar ook een meting van de eerste volledige stap: een geslaagde opwarming kan al een initialisatie hebben uitgevoerd die je bij het opstarten in het geheugen moet kunnen financieren.

Voeg de evaluatie en de export toe die je project nodig heeft. Als de fout optreedt tijdens de evaluatie, lost het enkel verkleinen van de trainingsbatch die fase niet op. Een aanpassing die weinig parameters traint, kan nog steeds een basismodel en omvangrijke activaties behouden.

Technische bronnen: Hugging Face — geheugencategorieën tijdens training

04 /

Bij inferentie context en gelijktijdigheid volgen

Bij een autoregressieve generatie met attention bewaart de KV-cache states die aan tokens gekoppeld zijn. Voor een uniforme dense cache hangt de grootte af van de lagen, de KV-heads, hun dimensie, de bewaarde tokens en de sequenties die samen aanwezig zijn. Gebruik de KV-heads van het model, niet automatisch zijn query-heads.

Rekenvoorbeeld: 32 lagen, 8 KV-heads, een dimensie van 128, 8 192 tokens, twee bytes per waarde en één sequentie geven 1 073 741 824 bytes, dus 1 GiB voor K en V samen. Vier identieke sequenties geven 4 GiB voor alleen deze post. Deze berekening meet noch de doorvoer, noch de volledige bezetting van de GPU.

Pas de formule aan op de cache die daadwerkelijk wordt gebruikt. Een sliding window bewaart niet noodzakelijk de volledige historiek; een statische cache kan zijn maximale capaciteit vooraf toewijzen. Gekwantiseerde en uitbestede caches veranderen het probleem ook. Meet de initiële verwerking van de input en de generatie afzonderlijk, zonder hun hele verschil automatisch aan de cache toe te schrijven.

Dense KV in bytes ≈ 2 × lagen × KV-heads × head-dimensie × bewaarde tokens × sequenties × bytes per waarde

Technische bronnen: Hugging Face — cachestrategieën, statische toewijzing en windows

05 /

Allocated en reserved: twee waarden die je niet optelt

memory_allocated beschrijft de bytes die door PyTorch gevolgde tensors op het apparaat innemen. memory_reserved beschrijft het geheugen dat zijn allocator met cache beheert, waaronder het geheugen dat al voor die tensors dient. Beide optellen telt een deel van het geheugen dubbel. Bewaar ze in twee afzonderlijke kolommen.

Hun max-varianten registreren elk een piek sinds het begin van de meting of sinds de laatste reset. Het zijn absolute pieken over de periode, die ook de allocaties bevatten die al bij het begin aanwezig waren. Het resultaat vertegenwoordigt dus niet automatisch alleen de objecten die tijdens de fase zijn aangemaakt.

Een systeemmeting kan een breder bereik hebben. Allocaties die rechtstreeks door een CUDA-bibliotheek worden gedaan, bijvoorbeeld bepaalde NCCL-communicatie, zijn niet allemaal zichtbaar in de PyTorch-allocator. Een verschil met een systeemtool bewijst dus op zichzelf geen lek.

Vier tellers, allemaal in bytes, op te nemen voor hetzelfde apparaat.
TellerVraag die hij beantwoordtFout om te vermijden
memory_allocatedHoeveel ruimte nemen de tensoren op dit meetpunt in?Hem aanzien voor het volledige geheugengebruik van de kaart.
memory_reservedHoeveel beheert de allocator op dit meetpunt?Dit optellen bij allocated.
max_memory_allocatedWelke piek van de tensoren is tijdens de periode gevolgd?Hem verwarren met de waarde aan het einde van de fase.
max_memory_reservedWelke reserveringspiek rapporteert de allocator?Aannemen dat die op hetzelfde moment optreedt als de andere piek.

Technische bronnen: PyTorch — memory_allocated · PyTorch — memory_reserved · PyTorch — max_memory_allocated · PyTorch — allocaties buiten zijn allocator

06 /

Waarom het verschil tussen de twee pieken niet de cache meet

Laten we alleen de twee fictieve momenten uit de tabel bekijken. De allocated-piek is 8 GiB en de reserved-piek 12 GiB. Hun verschil, 4 GiB, is op geen van die twee momenten het waargenomen verschil: dat bedraagt respectievelijk 2 en 6 GiB. Twee maxima beschrijven niet noodzakelijk dezelfde toestand.

Om hun onderlinge afstand op een gegeven moment te onderzoeken, lees je allocated en reserved op hetzelfde controlepunt, na synchronisatie en zonder nieuwe bewuste bewerking tussen de metingen. Je krijgt dan een verschil tussen tellers op dat moment, geen meting van de KV-cache van het model, en ook geen garantie dat dat hele verschil de volgende allocatie kan vervullen.

Neem ook de backend van de allocator op in het rapport. De documentatie van PyTorch 2.14 vermeldt dat max_memory_reserved met cudaMallocAsync de hoogste niveaus van twee pools kan combineren en zo een bovengrens van de gelijktijdige piek kan geven. Dat versterkt de noodzaak om de naam en het bereik van de teller te bewaren.

Twee verzonnen toestanden om de berekening uit te leggen; deze tabel is geen GPU-trace.
Illustratief momentAllocatedReservedReserved − allocated op dat moment
A8 GiB10 GiB2 GiB
B6 GiB12 GiB6 GiB

Technische bronnen: PyTorch — definitie en beperking van max_memory_reserved

07 /

Elke fase afbakenen voordat je zijn piek afleest

GPU-bewerkingen kunnen in de wachtrij staan voordat ze klaar zijn. Voor een meting per fase maak je de voorgaande taken af voordat je de pieken op nul zet, en daarna wacht je op het einde van de fase voor de meting. torch.cuda.synchronize wacht op de kernels van alle streams van het geselecteerde apparaat; die keuze vormt een expliciete grens voor dit protocol.

reset_peak_memory_stats herstart het volgen van de pieken vanaf de huidige toestand; het geeft de tensoren van het programma niet vrij. Lees eerst de beginniveaus af. Bewaar aan het einde de twee absolute pieken en de twee huidige niveaus. Presenteer het aftrekken van een beginniveau niet als het exacte volume van alle tijdelijke tensoren: ook eerdere objecten kunnen tijdens de fase zijn vrijgegeven.

Deze instrumentatie kan de gebruikelijke overlap van de fasen veranderen. Gebruik haar om het probleem te lokaliseren en verifieer daarna ook de volledige lus met zijn werkelijke ordening. Herhaal bij meerdere kaarten de metingen voor elk apparaat; een meting op cuda:0 beschrijft de andere GPU's niet.

  • 1. Geef de fase een naam en noteer de exacte invoer ervan.
  • 2. Synchroniseer het apparaat en lees daarna de beginwaarden van allocated en reserved af.
  • 3. Roep reset_peak_memory_stats aan op datzelfde apparaat.
  • 4. Voer de gedefinieerde fase uit en bewaar de uitvoer die je daarna nodig hebt.
  • 5. Synchroniseer, lees de pieken en de eindniveaus af en noteer succes of fout.
  • 6. Bewaar het ruwe resultaat, de dimensies en de configuratie; vul geen ontbrekende meting aan met nul.

Technische bronnen: PyTorch — synchronisatie van een apparaat · PyTorch — reset van de piekstatistieken

08 /

Eerste doorgang en doorgangen na opwarmen onderscheiden

De eerste test en een al voorbereide lus beantwoorden niet dezelfde vraag. Bewaar een spoor van het laden en de eerste doorgang, en documenteer daarna het aantal opwarmiteraties vóór de herhalingen. Verwijder een initialisatiefout niet omdat de volgende doorgangen lichter zouden zijn geweest.

Het script van IteraGPU onderscheidt model_load, inputs, cold_forward, warmup en warm_forward. De cold_forward is de eerste doorgang van het kleine model nadat het apparaat is geïnitialiseerd. Hij meet niet de volledige opstart van een server, een driver of een service. De warm_forward-herhalingen blijven in hetzelfde proces en profiteren van de bestaande toestand.

Begin voor je model een nieuwe reeks in een nieuw proces wanneer je een voorwaarde wijzigt die eerdere objecten of reserveringen kan achterlaten. Noteer de volgorde van de tests en het opwarmbeleid. Vijf keer dezelfde lus opnieuw uitvoeren en vijf processen starten vormen niet hetzelfde protocol.

09 /

De notebook en het script van IteraGPU Lab v1 gebruiken

Begin met de README en download daarna de zelfstandige notebook of het Python-script. De berekening estimate gebruikt de standaardbibliotheek. De meting vereist een geïnstalleerde PyTorch met een compatibele GPU-backend en een toegankelijk apparaat; ze downloadt geen model of pakket. De notebook vereist een omgeving die ipynb-bestanden kan lezen.

De meetoefening gebruikt een klein, origineel dicht netwerk en synthetische invoer. De opties batch, context en width beschrijven de tensors; context is hier niet de lengte van een echt LLM met KV-cache. Dit hulpmiddel dient om de meetmethode te onderzoeken en één dimensie te variëren. Het toont niet de capaciteit van een kaart voor jouw onderzoeksmodel aan.

Voer de onderstaande opdrachten uit vanuit de map met het script. Bekijk eerst het rapport environment. Als PyTorch of de GPU ontbreekt, moet measure expliciet stoppen met code 2; geen enkel CPU-resultaat mag als GPU-meting worden geïnterpreteerd. De JSON-uitvoer van een geslaagde meting wordt in jouw omgeving geproduceerd. Kies een nieuwe bestandsnaam voor elke reeks: het script weigert een bestaand resultaat te overschrijven.

De eerste opdracht herberekent de gewichten en de hypothetische reserve van 4 GiB. Gebruik voor de volgende opdrachten een apparaat dat je mag belasten en houd de dimensies in het begin bescheiden. Noteer de PyTorch-versie die daadwerkelijk wordt gebruikt: de technische referenties op deze pagina beschrijven onder meer versie 2.14, zonder te eisen dat die bij jou is geïnstalleerd.

De werking van het script is gecontroleerd op een klein geval: een lokale RTX 5070 buiten de catalogus, driver 610.62, Python 3.14.6 en PyTorch 2.11.0+cu128. De test gebruikte batch 1, context 16, width 64, float32, één opwarming en twee herhalingen. Hij valideert dit uitvoeringspad, zonder een LLM, een training of de te huur aangeboden GPU's te kwalificeren. De notebook wordt zonder uitvoer geleverd en de vergelijkingstabel zonder resultaten; de controle op het ontbreken van PyTorch is ook in een aparte omgeving geverifieerd.

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 /

Een storing interpreteren voordat je van kaart wisselt

Een onvolledige test blijft een nuttige observatie. Bewaar de fase, de gevraagde dimensies, de foutmelding en de laatst beschikbare waarden. Een gedeeltelijke piek vóór een verzadiging vormt niet het geheugenverbruik van een volledige uitvoering. Verklein één enkele dimensie om een geval te construeren dat slaagt, en zoek dan de grens tussen slagen en falen.

empty_cache geeft ongebruikte blokken uit de cache van de allocator vrij, zonder nog levende tensors vrij te geven. Het is geen universele oplossing voor een te grote belasting. Het aanroepen tussen elke herhaling verandert de omstandigheden: documenteer die keuze in plaats van deze proeven te mengen met proeven die de cache behouden.

Als eenvoudige tellers de situatie niet verklaren, kan een geheugentrace helpen om toewijzingen in de tijd te identificeren. Het bereik blijft beperkt tot de toewijzingen die PyTorch ziet. Een lage allocated-piek sluit dus een externe toewijzing of een andere gebruiker van de kaart niet uit.

Het symptoom koppelen aan een volgende controle, zonder automatische diagnose.
ObservatieNuttige controleVolgende proef
Fout tijdens het ladenFormaat geladen, plaatsing van de gewichten en geheugen dat al bezet is.Het laden opnieuw uitvoeren, alleen, in een nieuw proces.
Laden gelukt, achterwaartse doorgang onmogelijkMicrobatch, invoer, bewaarde activaties en toestand van de lus.Eén dimensie verkleinen en dan de volledige stap opnieuw doen.
Alleen de evaluatie misluktEvaluatiebatch, bewaarde uitvoer en berekeningscontext.De evaluatie meten met haar eigen limieten.
Allocated stijgt van de ene herhaling naar de andereReferenties die bewaard blijven in lijsten, applicatiecaches of grafen.Hun levensduur controleren voordat je de allocator de schuld geeft.
Reserved blijft hoog na de berekeningNog levende tensors en cachebeleid.De huidige waarden vergelijken, zonder de tellers op te tellen.
Een systeemtool geeft meer aanBereik van de tool, GPU-context, andere processen en bibliotheken.De belasting isoleren en metingen samenbrengen die op hetzelfde moment zijn genomen.

Technische bronnen: PyTorch — wat empty_cache vrijgeeft · PyTorch — traces en grenzen van geheugenzichtbaarheid

11 /

Een marge opbouwen op basis van vergelijkbare belastingen

Vermijd een margepercentage dat als universeel wordt voorgesteld. De marge moet geïdentificeerde variaties opvangen: langere invoer, toegestane batch, evaluatie, export, bibliotheekversie of ander gebruik van de kaart. Test de verwachte grensgevallen en noteer wat buiten het bereik blijft. Een geslaagde uitvoering op één kleine invoer valideert de maximale belasting niet.

Verander één variabele tegelijk: batch 1 en dan 2 bij constante context, of contexten 2.048 en dan 4.096 bij constante batch. Behoud dezelfde inhoud en dezelfde voorbereidingsregels. Een truncatie die noodzakelijke informatie verwijdert, maakt de taak anders, ook al verlaagt ze de piek.

Als de gewichten domineren, bestudeer dan een ander formaat met controle van de kwaliteit. Als de activaties domineren, kunnen microbatch of activation checkpointing mogelijke pistes zijn. Dat laatste ruilt geheugen voor herberekening: meet ook de duur en controleer de resultaten. Als de KV-cache domineert, onderzoek dan context, gelijktijdigheid en cachestrategie. Het vergelijkingsdossier vult deze aanpak aan met een gemeenschappelijke kwaliteitsregel.

Technische bronnen: PyTorch — activation checkpointing en herberekening

12 /

Van de trace naar een configuratiebeslissing

Je verwachte output is een korte fiche: schatting van de gewichten, maximaal geteste belasting, geslaagde of mislukte fasen, vier tellers met eenheden, omgeving en gemaakte keuze. Voeg het ruwe resultaat aan deze fiche toe. Scheid wat je hebt berekend, wat je hebt geobserveerd en wat je nog veronderstelt.

Vergelijk daarna de behoefte met de capaciteit van elke kaart, met behoud van de softwarebeperkingen. Meerdere GPU's vereisen een verdeling van het werk en de gegevens; hun aanwezigheid creëert niet automatisch één enkel geheugenreservoir voor de applicatie. Een fout op de ene kaart kan blijven bestaan ondanks vrije geheugenruimte op een andere.

Het PyTorch-protocol gebruikt de interface torch.cuda; een HIP/ROCm-build van PyTorch hergebruikt die naam. Identificeer de werkelijk geïnstalleerde backend voordat je twee hardwarefamilies vergelijkt. Het gebruik van dezelfde Python-functie bewijst niet dat de kernels, de precisies of de resultaten gelijkwaardig zijn.

Met de dimensioner kun je de oorspronkelijke hypothese hernemen; met de GPU-fiches kun je de capaciteiten vergelijken. Keer daarna terug naar hetzelfde werkgeval om de keuze te controleren. Het kleine netwerk uit de download blijft een instrumentatieoefening: alleen de uitvoering van jouw belasting, in haar gedocumenteerde omgeving, kan jouw eigen marge valideren.

Technische bronnen: NVIDIA — werk verdelen over meerdere GPU's · PyTorch — interface torch.cuda in HIP/ROCm-builds