Naar inhoud springen
10/30Hoofdstuk 10 van 30

Een LLM pretrainen: data, compute, scaling laws en kosten

Twintig modellen op één laptop-GPU meten een scaling law, met de 6ND-compute-inschatting getoetst aan een echte FLOP-teller.

Op deze pagina

Hoofdstuk 9 eindigde met een transformer-blok dat traint. Stapel er een paar op elkaar, richt de next-token loss uit Hoofdstuk 8 op de output, en er valt niets meer uit te vinden. Alles wat overblijft, is een aankoop.

Dat is een grotere verschuiving dan het klinkt. Elk hoofdstuk tot nu toe vroeg leert het? — een ja-of-nee-vraag die een laptop in tien minuten beslecht. Dit hoofdstuk stelt een vraag waar geld in zit: gegeven een vaste hoeveelheid rekenwerk, wat is het beste model dat ik kan kopen? Het antwoord is een formule, en in 2018 was dat voor niemand vanzelfsprekend.

Hier is die vraag beantwoord door meting, op één laptop-GPU. Twintig modellen, van 98.624 tot 15 miljoen parameters, werden vanaf nul getraind op 174 miljoen tokens uit Wikipedia — een BPE-vocabulaire van 2.048 tokens, getraind zoals Hoofdstuk 7 er een traint, de transformer uit Hoofdstuk 9. Elke run kreeg exact één van drie compute-budgetten en geen bewerking meer, waardoor een groter model noodzakelijkerwijs minder tekst leest. De beste held-out loss die per budget werd bereikt:

TEXT
budget C (FLOPs)   best loss   reached by a model of
       1.00e13       5.3531           98,624 params
       3.16e13       4.8638           98,624 params
       1.00e14       4.3383          295,808 params

fitted:  L = (Cc / C)^0.0913     over one decade of compute

Tien keer zoveel rekenwerk haalt 19% van de loss af, en de drie punten liggen op een rechte lijn in log-log. Niets in de eerste negen hoofdstukken voorspelt dat. Er zit geen stelling achter — het is een empirische regelmaat, met een andere exponent geldig over de tien ordes van grootte tussen deze laptop en een datacenter, en het is de ene observatie die een industrie overtuigde om het bbp van een klein land aan GPU’s uit te geven.

Aan de doelstelling verandert niets. Het model voorspelt nog steeds het volgende token, de loss is nog steeds de cross-entropy uit Hoofdstuk 4 toegepast op de factorisatie van Hoofdstuk 8, de optimiser is nog steeds AdamW uit Hoofdstuk 6. Pretraining is geen nieuw algoritme; het is hetzelfde algoritme uitgevoerd op een corpus dat groot genoeg is om de run te moeten budgetteren. Twee dingen maken dat mogelijk: de labels zijn gratis, omdat het doel voor positie tt het token op t+1t+1 is en al in de tekst staat; en het laatste deel van Hoofdstuk 6 nam het bezwaar weg, omdat een model met veel meer parameters dan de klassieke regels toestaan niet instort, maar verbetert. Wat eruit komt is een base model — iets dat tekst voortzet in plaats van antwoordt.

De compute tellen vóór je hem uitgeeft: 6ND

Link naar de sectie: De compute tellen vóór je hem uitgeeft: 6ND

Voordat dit allemaal gebudgetteerd kan worden, moet het geteld worden, en het vakgebied telt het met één formule:

C6NDC \approx 6ND

waar NN het aantal parameters is, DD de training tokens en CC het totaal aantal floating-point operations. Kaplan et al. leiden dit in twee stappen af.1 Forward: 2 FLOPs per parameter per token, omdat elke parameter in een matrixvermenigvuldiging één keer per token wordt gebruikt, in één vermenigvuldiging en één optelling. Backward: twee keer de forward, omdat de backward pass uit Hoofdstuk 5 in elke layer twee gradienten berekent — ten opzichte van de inputs van de layer, zodat het signaal blijft doorreizen, en ten opzichte van de weights — elk een matrixvermenigvuldiging ter grootte van de forward, dus 4N4N.

Dat is de hele afleiding, en het is de moeite waard om die te controleren in plaats van te geloven. PyTorch levert een echte FLOP-teller mee, torch.utils.flop_counter.FlopCounterMode, die elke bewerking onderschept die een model uitvoert en het werkelijke werk optelt. Draai die over vier ordes van grootte, met de grootste op het meta-device, dat shapes toewijst en geen geheugen:

flops.pyPYTHON
from torch.utils.flop_counter import FlopCounterMode

counter = FlopCounterMode(display=False)
with counter:                       
    loss = model(x, targets)[1]     
    loss.backward()                 
measured = counter.get_total_flops()
print(measured / (6 * n_params * n_tokens))
configuratieNN zonder embeddingsNN totaalgemeten, fwd+bwd÷ 6ND6ND (totaal NN)÷ 6ND6ND (geen emb.)fwd+bwd ÷ fwd
dd 128, 4 layers, TT 256788.7367.254.4004,60e101,0319,4853,000
dd 512, 8 layers, TT 25625.183.23251.045.8883,26e111,0382,1043,000
dd 768, 12 layers, TT 102484.973.056124.356.8641,75e121,1451,6763,000
dd 1600, 48 layers, TT 10241.474.870.4001.556.920.0002,10e131,1001,1613,000
dd 4096, 32 layers, TT 20486.442.983.4246.582.444.0328,74e131,0801,1043,000
dd 8192, 80 layers, TT 819264.427.147.26465.544.929.2803,75e151,1631,1833,000

De verhouding forward+backward over forward is 3,000, exact, op elke schaal: geen benadering die toevallig goed uitpakt, maar de rekenkundige identiteit hierboven, als rond getal teruggegeven door een teller die niets weet van de afleiding.

Het gemeten totaal ligt vervolgens tussen 3% en 17% boven 6ND6ND, zodra NN de embedding-matrices meetelt — en die clausule doet ertoe, omdat de twee grondleggende papers NN anders tellen. Kaplan sluit “all vocabulary and positional embeddings” uit, omdat dat “produces significantly cleaner scaling laws” (§1.3); Chinchilla’s Appendix F zegt “we also count embeddings matrices in the total parameter count”.2 Voor een breed vocabulaire en een smalle hidden dimension verschillen de twee met een factor negen, zoals de eerste rij laat zien.

Het resterende gat is wat 6ND6ND bewust weglaat: de attention scores. Kaplan’s Eq. (2.2) schrijft de forward-kosten als 2N+2nlayernctxdmodel2N + 2\,n_{\text{layer}} n_{\text{ctx}} d_{\text{model}} en laat de tweede term vallen omdat dmodelnctx/12d_{\text{model}} \gg n_{\text{ctx}}/12 — veilig in 2020, minder veilig nu, en de reden dat de verhouding omhoog drijft naarmate T/dT/d groeit — daarom delen twee rijen hier een TT van 1.024 en daalt de verhouding, van 1,145 naar 1,100, wanneer dd van 768 naar 1.600 gaat. Het is de O(T2)O(T^2)-kost die Hoofdstuk 9 introduceerde en die Hoofdstuk 16 in een prijs verandert.

Compute bepaalt hoe lang een run duurt; geheugen bepaalt of hij kan starten. Train met gewone fp32 AdamW en elke parameter draagt vier getallen: de weight, de gradient, en Adams lopende gemiddelde mm en variantie vv — de twee gemiddelden die in Hoofdstuk 6 met de hand zijn opgebouwd. Vier getallen van vier bytes elk is 16 bytes per parameter, vóór één enkele activation. Gemeten op een laptop-GPU van 8 GB, met de resident allocation op het punt in de stap waar geen graph meer leeft:

modelvocabulairebatchNN16N16N voorspeldresident gemetenpiek in een staphet verschil
dd 512, 8 layers50.257851.045.888779 MB801 MB2.500 MB1.699 MB
dd 512, 8 layers4.096827.411.456418 MB426 MB1.043 MB617 MB
dd 256, 6 layers4.09685.839.36089 MB89 MB382 MB293 MB
dd 256, 6 layers4.096325.839.36089 MB89 MB1.259 MB1.170 MB
dd 256, 6 layers4.0961285.839.36089 MB89 MB4.771 MB4.681 MB

Voorspelling en meting komen binnen 3% overeen. De verrassing zit in de laatste kolom: de activations zijn veel groter dan het model. Hetzelfde model met 5,8 miljoen parameters dat 89 MB persistente state nodig heeft, heeft bij een batch van 128 4.681 MB activations nodig — tweeënvijftig keer het model — en een groot deel daarvan is helemaal niet de transformer. Het zijn de logits, één vector van vocabulairegrootte per token met vier bytes per entry: 512 MB in de laatste rij, 393 MB in de eerste. De vocabulairegrootte werd gekozen in Hoofdstuk 7, en die bepaalt nog steeds wat er op de kaart past.

Welke term domineert hangt af van de vorm van de run, daarom zeggen Micikevicius et al. dat geheugen “is dominated by activations”3 terwijl ZeRO zegt dat een model met 1,5 miljard parameters “at least 24 GB” aan model states alleen nodig heeft.4 ZeRO komt via een andere route op dezelfde 16 bytes uit — 2Ψ2\Psi voor fp16 weights, 2Ψ2\Psi voor fp16 gradients, 4Ψ4\Psi elk voor de fp32 master weights en Adams twee moments — wat voor 70 miljard parameters 1,12 terabyte is, de waarde van veertien GPU’s van 80 GB vóór één enkele activation.

Parallelisme, in één alinea en één delegatie

Link naar de sectie: Parallelisme, in één alinea en één delegatie

Niets daarvan past op frontier-schaal op één device, dus de run wordt op vier manieren tegelijk gesplitst. Data parallelism zet een kopie van het model op elke GPU en middelt de gradienten — de standaard, en degene die ZeRO verbetert door te weigeren redundante kopieën van de optimiser state te bewaren. Tensor parallelism splitst individuele matrices over devices. Pipeline parallelism geeft elk device een aaneengesloten groep layers. Context parallelism splitst de sequence zelf, pas nodig zodra TT lang genoeg is dat de attention-term domineert. Tabel 4 van Llama 3 zet alle vier tegelijk neer: tensor 8, context tot 16, pipeline 16, data tot 128, over 16.384 H100-GPU’s.5 Dat is alles wat deze cursus erover zal zeggen; distributed training engineering is een eigen semester, en Stanford CS336 is dat semester, colleges 5 tot en met 8, met de code.6 Wat de delegatie overleeft is één getal, model FLOPs utilisation — de fractie van de piekrekenkracht van een GPU die een echte run haalt — en dat is wat de nette 6ND6ND omzet in wandkloktijd en dus in geld.

Kaplan, en de weddenschap die de industrie aanging

Link naar de sectie: Kaplan, en de weddenschap die de industrie aanging

In januari 2020 trainden Kaplan et al. een grid van transformers en vonden dat de test loss over meer dan zes ordes van grootte een power law volgt in elk van de drie resources.1 Hun §1.2 geeft drie gefitte wetten:

L(N)=(NcN)αN,αN0.076,Nc8.8×1013L(N) = \left(\frac{N_c}{N}\right)^{\alpha_N}, \qquad \alpha_N \approx 0.076, \qquad N_c \approx 8.8 \times 10^{13}

met begeleiders αD0.095\alpha_D \approx 0.095 voor data en αCmin0.050\alpha_C^{\min} \approx 0.050 voor optimaal toegewezen compute. De constanten zijn niet universeel, en de paper zegt dat ook: “the precise numerical values of NcN_c, CcminC_c^{\min} and DcD_c depend on the vocabulary size and tokenization and hence do not have a fundamental meaning.”

De exponenten zijn piepklein: tien keer zoveel parameters koopt een factor 100.0761.1910^{0.076} \approx 1.19 van de resterende loss af. Dat klinkt als niets, en dat is het belangrijkste feit hier — de opbrengsten zijn verschrikkelijk en ze stoppen nooit. Een power law met een kleine exponent belooft dat de volgende orde van grootte zal helpen, minder dan de vorige, voor altijd. Compute kopen houdt op een gok te zijn en wordt een aankoop met een gepubliceerde wisselkoers, en dat is precies het argument dat het kapitaal losmaakte.

Toen kwam het voorschrift, en hier zat de paper fout op een manier die de industrie heel veel geld kostte. Kaplan’s Tabel 6 geeft NoptC0.73N_{\text{opt}} \propto C^{0.73} en DoptC0.27D_{\text{opt}} \propto C^{0.27}: tien keer zoveel compute betekent een model dat 5,4 keer groter is en slechts 1,9 keer zoveel tekst krijgt. De abstract is expliciet — “optimally compute-efficient training involves training very large models on a relatively modest amount of data and stopping significantly before convergence.” Het veld deed precies dat: GPT-3 is 175 miljard parameters op 300 miljard tokens,7 Gopher 280 miljard op 300 miljard, Megatron-Turing NLG 530 miljard op 270 miljard.2 Een halve token tot twee tokens per parameter, over de hele linie.

In maart 2022 trainden Hoffmann et al. meer dan 400 modellen van 70 miljoen tot 16 miljard parameters en kwamen via drie onafhankelijke routes tot de tegenovergestelde conclusie.2 Hun Tabel 2 rapporteert de exponent aa in NoptCaN_{\text{opt}} \propto C^{a} als 0,50, 0,49 en 0,46, tegenover Kaplans 0,73. In gewone taal: modelgrootte en training data moeten in gelijke verhouding groeien.

Hun tweede aanpak is degene die de sweep bovenaan dit hoofdstuk reproduceert, op een miljoenste van de schaal: zet een budget vast, train veel groottes exact op dat budget, plot de eind-loss tegen de modelgrootte.

parametersC=1013C = 10^{13}C=3.16×1013C = 3.16 \times 10^{13}C=1014C = 10^{14}
98.6245,3531 (171)4,8638 (542)
150.3205,4636 (74)
194.2085,5041 (44)4,8730 (140)4,4040 (442)
295.8085,5550 (19)4,9029 (60)4,3383 (190)
665.2805,7849 (3,8)5,1254 (12)4,4192 (38)
1.280.7685,8174 (1,0)5,1751 (3,2)4,5003 (10)
3.101.5685,4686 (0,5)4,7768 (1,7)
5.315.0725,5894 (0,2)4,8514 (0,6)
15.053.5685,3534 (0,1)

Held-out loss in nats per token, tokens per parameter tussen haakjes, vet voor het beste model per budget; een streepje is een punt dat niet is gedraaid, omdat het budget meer tekst vroeg dan het corpus bevat of de grootte buiten de daar gesweepte reeks viel.

Lees een kolom omlaag: de loss daalt, bereikt een bodem en stijgt weer. Een model kan net zo makkelijk te groot zijn voor zijn budget als te klein — bij 101410^{14} is de straf voor 665.280 parameters kiezen in plaats van 295.808 gelijk aan 0,08 nats, wat op de hierboven gefitte enveloppe de loss is die een correct gedimensioneerd model met 18% minder compute haalt. De verkeerde vorm kiezen gooit een vijfde van het budget weg. Dat is Chinchilla’s Figure 3 in een middag op één GPU in plaats van met vierhonderd modellen.

Lees nu horizontaal. Bij 101310^{13} is het beste model het kleinste in de sweep; bij 101410^{14} is het 295.808 parameters, aan beide kanten ingesloten. Het optimum schuift naar rechts naarmate het budget groeit, en dat is de hele inhoud van de correctie. Fit de derde aanpak van de paper — het oppervlak L(N,D)=E+A/Nα+B/DβL(N,D) = E + A/N^{\alpha} + B/D^{\beta} over elke run — en minimaliseer onder de voorwaarde C=6NDC = 6ND:

TEXT
L(N, D) = 24.7 / N^0.195 + 46.8 / D^0.169       (E fits to ~0; see below)
implied   N_opt ∝ C^0.464
  compare   Chinchilla 0.46-0.50 · Besiroglu 0.513 · Kaplan 0.73

0,46, vanaf een laptop, tegenover Kaplans 0,73. Overeenstemming tot drie cijfers uit een fit met drie budgetten is geluk; overeenstemming tot het eerste cijfer is dat niet. De exponent reist — de constante niet, omdat de token-tot-parameterverhouding bij deze optima 170 tot 540 is, niet 20. Drie redenen, allemaal leerzaam. EE fit naar nul omdat de run bij een loss boven 4 nats nergens in de buurt is van de entropievloer die Chinchilla’s fit domineert. Batchgrootte en learning rate stonden vast in plaats van per punt getuned te worden, wat precies de runs benadeelt die de minste stappen krijgen — en dat zijn de grote modellen: bij 101310^{13} FLOPs krijgt een model met 1,28 miljoen parameters in totaal 159 optimiser-stappen, ver onder de paar duizend die Kaplans SminS_{\min}-term zegt dat elk model nodig heeft. Een scaling law wordt binnen een regime gefit, en deze zit zes ordes van grootte onder Chinchilla’s regime.

Vandaar de abstract van de paper: “current large language models are significantly undertrained”. Chinchilla is de demonstratie — 70 miljard parameters op 1,4 biljoen tokens, dezelfde totale compute als Gophers 280 miljard op 300 miljard, en beter op 51 van 57 MMLU-taken, 67,5% tegen 60%.2 Vier keer kleiner, vierënhalf keer meer tekst, hetzelfde geld, beter model.

Twee kanttekeningen bij die beroemde verhouding. “Twintig tokens per parameter” is geen zin in de paper, die alleen zegt dat “for every doubling of model size the number of training tokens should also be doubled”; de 20 is een gevolgtrekking uit Tabel 3 en uit Chinchilla’s eigen 70 B op 1,4 T. En de precisie is slechter dan gepubliceerd: Besiroglu et al. refitten vanaf een digitalisering van Figure 4, vonden dat de oorspronkelijke parameters “fit the reconstructed data poorly” met intervallen “implausibly tight given the number of data points”, en zetten het eerlijke bereik op “between 4 and 40” tokens per parameter.8

Eén detail van Chinchilla’s methode lost een belofte in die Hoofdstuk 1 deed over learning-rate schedules. De cosine schedule moet worden afgestemd op het token-budget. Een model dat 10 miljoen tokens zal zien, moet zijn learning rate naar nul laten vervallen bij 10 miljoen tokens; geef het een schedule voor 100 miljoen, stop het vroeg, en je leest een loss halverwege de daling bij een veel te hoge rate. Chinchilla traint elk model op vier cycle lengths om hier precies voor te controleren; de sweep hierboven zet om dezelfde reden zijn schedule vanuit het budget.

Ze zijn het nuttigste empirische resultaat in het vakgebied en ze worden routinematig oversold. Vier grenzen.

Ze voorspellen loss, geen capability. De linkerkant is cross-entropy op held-out tekst. Niets in deze papers rechtvaardigt een claim over of een model correcte SQL zal schrijven, een schadelijk verzoek zal weigeren of een tool zal gebruiken. Dit is opnieuw de les van Hoofdstuk 5: een voorspelling van de loss is geen voorspelling van het gedrag waarvoor je betaalt.

Ze zijn gefit, niet afgeleid. Geen theorie produceert αN=0.076\alpha_N = 0.076. De constanten verschuiven met de tokenizer — daarom is een perplexity-vergelijking tussen twee tokenizers betekenisloos, zoals Hoofdstuk 8 uitlegde — en met de datamix, architectuur en optimiser. Elke gepubliceerde wet is een wet van de setup die haar voortbracht, en daarom fit Meta zijn eigen wet opnieuw vóór Llama 3.5

Ze veronderstellen een vers token voor elke stap, wat stilzwijgend een oneindig corpus veronderstelt. Muennighoff et al. maten wat er gebeurt wanneer dat opraakt: tot vier epochs van herhaalde data kosten bijna niets — een model met 8,7 miljard parameters op 44 miljard unieke tokens die vier keer gezien werden eindigde met “only 0.5 % higher validation loss” dan hetzelfde model op 178 miljard unieke tokens — terwijl na ongeveer zestien epochs extra compute niets meer koopt.9

En niemand traint nog compute-optimal. Chinchilla minimaliseert de kosten van training; een deployed model betaalt daarna grofweg 2N2N FLOPs per generated token, voor altijd. LLaMA 1 zei het ronduit: “given a target level of performance, the preferred model is not the fastest to train but the fastest at inference”.10 Sardana et al. formaliseerden dat door in plaats daarvan 6NDtrain+2NDinference6ND_{\text{train}} + 2ND_{\text{inference}} te minimaliseren, en vonden dat iedereen die een miljard requests verwacht “smaller and longer than Chinchilla-optimal” moet trainen.11 §9.1 van Llama 3 is het daarmee eens: de kleine modellen trainen “far beyond the point of compute optimal training, effectively trading training compute for inference efficiency”.5 De verhouding is niet verouderd; ze beantwoordt een vraag die niet meer de vraag is die wordt gesteld.

Emergent abilities, en het debat over of ze echt zijn

Link naar de sectie: Emergent abilities, en het debat over of ze echt zijn

Loss daalt soepel. Benchmark-scores doen dat soms niet. Wei et al. verzamelden gevallen waarin een taak over ordes van grootte aan training compute op kansniveau blijft en dan springt — driecijferige rekenkunde die in GPT-3 verschijnt rond 2×10222 \times 10^{22} FLOPs, MMLU dat boven gokken uitkomt tussen 33 en 5×10235 \times 10^{23} — en gaven het patroon een naam: “an ability is emergent if it is not present in smaller models but is present in larger models”.12 Als dat een echte eigenschap is, is extrapoleren vanuit goedkope experimenten onveilig, omdat de capability die je koopt misschien op geen enkele schaal bestaat die je kunt betalen om te testen.

Schaeffer, Miranda en Koyejo betoogden dat het meeste ervan een meetartefact is, en het mechanisme is rekenkunde.13 Per-token loss daalt soepel, dus de kans dat één token juist is, exp(L)\exp(-\mathcal{L}), verbetert geleidelijk. Score het model met exact string match over een antwoord van LL tokens en je verheft die kans tot de macht LL — een soepele curve tot een hoge macht verheven lijkt op een afgrond. Vervang de metric door één die tokens telt in plaats van te eisen dat ze allemaal kloppen, op dezelfde outputs, en “the family’s performance smoothly, continuously and predictably improves with increasing scale”.

Hun audit is het getal om te onthouden — “of the 39 preferred metrics in BIG-Bench, at most 5 display emergence”, waarbij twee discontinue metrics meer dan 92% van de geclaimde gevallen verklaren — en hun waarschuwing ook: “nothing in this paper should be interpreted as claiming that large language models cannot display emergent abilities”. Een sprong in een grafiek is bewijs over de metric totdat anders is aangetoond. Hoofdstuk 29 is waar dat jouw probleem wordt, omdat het kiezen van een hard-cutoff metric een beslissing is die je zult nemen zonder het te merken.

Het corpus is het deel van een pretraining-run waar geen vergelijking aan vastzit, en waar de meeste beslissingen met gevolgen zitten. Het ruwe materiaal is een webcrawl: Common Crawl’s archief van augustus 2026 bevat “2.14 billion web pages or 360 TiB of uncompressed content”, één maand ervan, gratis te downloaden.14 Bijna niets is bruikbaar zoals het is. De T5-paper zegt dat de crawl “largely comprises gibberish or boiler-plate text like menus, error messages, or duplicate text”, en de C4-pipeline die hij introduceerde is een lijst botte heuristieken — behoud alleen regels die eindigen op zinsafsluitende interpunctie, verwijder pagina’s met minder dan drie zinnen, verwijder elke pagina met een accolade of een woord uit een publieke lijst met obsceniteiten — en verandert twintig terabyte maandelijkse tekst in ongeveer 750 GB.15

Bot is het woord. Dodge et al. auditten wat die filters verwijderen en vonden dat de obsceniteiten-blocklist 42% van documenten in African-American English en 32% in Hispanic-aligned English verwijdert, tegenover 6,2% van White-aligned English, waardoor een corpus overblijft dat voor 97,8% uit de laatste categorie bestaat.16 Een regel zonder mening over dialect had er toch één.

Daarna deduplication, en dat is geen huishoudelijk werk: Lee et al. vonden een zin van 61 woorden die 61.036 keer werd herhaald in C4, en lieten zien dat dedupliceren de snelheid waarmee modellen “emit memorized text” tienvoudig verlaagt, van 1,9% van generated tokens naar 0,19%.17 Meer is echter niet beter — het FineWeb-team dedupliceerde globaal over 96 crawls, kreeg 4 biljoen tokens en geen meetbare winst, dedupliceerde daarna elke crawl afzonderlijk, kreeg 20 biljoen, en evenaarde het beste bestaande corpus.18

Daarna contamination. Llama 3 mat zijn eigen contamination en publiceerde die: 98% van AGIEval, 95% van BIG-Bench Hard en 85% van HellaSwag overlapte met de trainingsset via 8-grams, en voor MMLU was de overlap zo hoog dat “it is impossible to get a good performance gain estimate”.5 §4 van GPT-3 rapporteert een filterbug waardoor benchmarks in de data achterbleven zonder weg terug: “because of cost considerations it was infeasible to retrain the model”.7

Provenance is het onopgeloste deel. The Pile bevatte een component van 100,96 GiB genaamd Books3 — 12% van het corpus en, volgens de eigen consent-tabel van de paper, boeken uit een private torrent tracker;19 die ging in augustus 2023 offline na een auteursrechtklacht. De juridische positie per september 2026 is onzeker, en de drie Amerikaanse uitspraken die als trend worden aangehaald spreken elkaar tegen. Alsup vond training op rechtmatig verkregen boeken “exceedingly transformative”, maar oordeelde dat een library gebouwd uit gepirate kopieën dat niet was, en Anthropic schikte die helft voor $1,5 miljard voor 482.460 werken, ongeveer $3.000 per stuk, goedgekeurd op 20 juli 2026.20 Chhabria wees Meta summary judgment toe terwijl hij schreef dat zijn uitspraak “does not stand for the proposition that Meta’s use of copyrighted materials to train its language models is lawful”, maar alleen dat “these plaintiffs made the wrong arguments”.21 Bibas, in een uitspraak tegen Ross Intelligence, merkte op dat “only non-generative AI is before me today”.22 Geen Amerikaans hof van beroep heeft over de vraag geoordeeld.

Mensen doen de delen die de loss niet kan. TIME meldde in januari 2023 dat werknemers die toxische tekst labelden voor OpenAI via het bedrijf Sama “between around $1.32 and $2 per hour” mee naar huis namen voor het lezen van passages over seksueel misbruik van kinderen, marteling en zelfbeschadiging, terwijl OpenAI Sama $12,50 per uur voor het werk betaalde; Sama betwist zowel de loonrange als het quotum.23 Dat is de filtering rond pretraining en niet pretraining zelf — maar het staat op dezelfde factuur, en daar zit een mens.

De elektriciteit is echt en wordt meestal verkeerd geciteerd. Het zorgvuldigste gepubliceerde cijfer is dat van BLOOM: 1.082.990 GPU-uren, 433 MWh en 24,7 ton CO₂-equivalent voor de run, 50,5 inclusief productie en idle nodes;24 Patterson et al. zetten GPT-3 op 1.287 MWh en 552 ton.25 Twee waarschuwingen. BLOOMs voordeel is het Franse kernenergienet van 57 g CO₂ per kWh in plaats van efficiëntie — het gebruikte meer energie dan OPT-175B. En het meest geciteerde emissiecijfer van het veld, Strubell et al.’s 626.155 lb voor een neural architecture search, bleek later 88 keer te hoog, omdat was aangenomen dat de search op volledige modelgrootte draaide terwijl hij op een proxy draaide.26 LBNL’s framing is de verdedigbare: Amerikaanse datacenters gebruikten in 2024 192 TWh, 4,7% van de nationale elektriciteit — een getal dat aan een industrie hangt, niet aan één run.27

De rode draad is wat Bender et al. documentation debt noemden: “putting ourselves in a situation where the datasets are both undocumented and too large to document post hoc”.28 Elk feit hierboven bestaat omdat iemand keek. Voor de corpora achter de modellen die de meeste mensen gebruiken, kan niemand dat.

Nu de rekenkunde die iedereen wil, uit vier geciteerde inputs, zodat wanneer ze verouderen duidelijk is welke vervangen moet worden.

NVIDIA’s H100-pagina vermeldt 1.979 teraFLOPS aan BF16 tensor-core-throughput onder een voetnoot “with sparsity”.29 Geen pretraining-run gebruikt structured sparsity, dus het dense cijfer is de helft: 989,5 TFLOP/s.

Tabel 4 van Llama 3 rapporteert 38–43% BF16 model FLOPs utilisation. Neem 40%: 395,8 TFLOP/s aan nuttig rekenwerk per GPU.5

Lambda’s on-demand prijs voor een 8×H100 SXM-node, geraadpleegd op 2026-09-06: $3,99 per GPU-uur, dus $31,92 per uur voor de node.30

Chinchilla’s verhouding, D=20ND = 20N, geeft C=6ND=120N2C = 6ND = 120N^2 en dus N=C/120N = \sqrt{C/120}.

budgetH100-urenFLOPscompute-optimal parameterstokensop één 8×H100-nodeGPU’s om binnen 90 dagen klaar te zijn
$100253,6e19546 M10,9 B3,1 u1
$1.0002513,6e201,73 B34,5 B31,3 u1
$10.0002.5063,6e215,46 B109 B13 dagen2
$100.00025.0633,6e2217,3 B345 B131 dagen12
$1.000.000250.6273,6e2354,6 B1,09 T4 jaar116
$10.000.0002.506.2663,6e24173 B3,45 T36 jaar1.160
$100.000.00025.062.6573,6e25546 B10,9 T358 jaar11.603

Lees de laatste twee kolommen samen. Voor $10.000 krijg je in twee weken een model met 5 miljard parameters op één gehuurde node. Bij $100.000.000 zegt de rekenkunde 546 miljard parameters — en twaalfduizend H100’s die drie maanden lang aan elkaar zijn gekoppeld, wat je niet met een creditcard huurt. Na ongeveer $100.000 houdt de bindende beperking op geld te zijn en wordt het de cluster.

Voordat je zo’n tabel vertrouwt, test je hem tegen runs waarvan de echte kosten gepubliceerd zijn — llm.c reproduceert GPT-2 124M in “~90 minutes” op een 8×A100-node “for about $20”, en GPT-2 1.6B in 24 uur op een 8×H100-node voor $672.31

TEXT
$672, against what $672 actually bought (llm.c GPT-2 1.6B, one 8xH100 node, 24 h)
  this table predicts:      168 H100-hours   N = 1.41 B params   D = 28.3 B tokens
  what was actually run:    192 H100-hours   N = 1.558 B params  D = 33.6 B tokens

Llama 3 405B, against Meta's own published GPU-hours
  from the paper's 3.8e25 FLOPs at 40 % MFU:   26.67 M H100-hours
  published in Meta's Llama 3.1 model card:    30.84 M H100-hours    ratio 0.86

Beide binnen ongeveer 15%, wat grofweg de nauwkeurigheid is die dit soort schatting verdient en aanzienlijk beter dan de nauwkeurigheid waarmee ze meestal wordt geciteerd.

De headline-vergelijking, met beide definities op tafel

Link naar de sectie: De headline-vergelijking, met beide definities op tafel

Het vaakst herhaalde cijfer in dit onderwerp is dat een GPT-2-klasse model dat in 2019 ongeveer $43.000 kostte vandaag voor een paar tientjes kan worden gereproduceerd. De moderne helft is goed gedocumenteerd; de historische helft niet.

Vandaag. Karpathy’s nanochat README: “you can train your own GPT-2 capability LLM ... for only $48 (~2 hours of 8XH100 GPU node) ... On a spot instance, the total cost can be closer to ~$15.”32 “GPT-2 capability” is hier precies en gepubliceerd — beter dan GPT-2’s CORE-score van 0,256525 — op een leaderboard waarvan de beste entry per 14 maart 2026 1,65 uur is. De $48 veronderstelt $3 per GPU-uur, onder Lambda’s lijstprijs van $3,99; op lijstprijs is het dichter bij $64.

In 2019. Er is geen primaire bron: OpenAI publiceerde nooit een duur of kosten. De keten loopt via The Register, februari 2019, dat “256 Google TPU3 cores” rapporteerde zonder prijs en zonder duur; daarna Synced, juni 2019, dat opmerkte dat de hardware $256 per uur kostte op Google Cloud en expliciet stelde dat “OpenAI didn’t specify the training duration”. $43.008 is $256 per uur maal een aangenomen 168 uur waarvoor niemand ooit een bron heeft gegeven.

De eerlijke headline is dus: een model dat GPT-2’s gepubliceerde benchmarkscore evenaart, kan vandaag voor ruim onder de $100 op gehuurde hardware worden getraind, tegenover een kostenpost uit 2019 die nooit is gepubliceerd en waarvan de beroemde schatting rust op een ongefundeerde gok over de duur. De ineenstorting is echt en de moderne helft is reproduceerbaar door iedereen met een creditcard; de ratio is rekenkunde op een getal dat niet bestaat. Dat is de staat van gepubliceerde trainingskosten in het algemeen. De GPT-3-paper bevat helemaal geen dollarbedrag, alleen 3.14×10233.14 \times 10^{23} FLOPs in Tabel D.1;7 de Llama 3-paper bevat er ook geen.5 Elke trainingskost die je hebt gelezen is een schatting uit een FLOP-count, een hardware-aanname en een prijsaanname — altijd de moeite waard om te vragen van wie.

Wat een base model weet, en wanneer het ophield dat te weten

Link naar de sectie: Wat een base model weet, en wanneer het ophield dat te weten

Wat eruit komt heeft een vast corpus gezien dat op een vast moment is samengesteld, en daaruit volgen twee eigenschappen.

De eerste is de knowledge cutoff. Na de verzamelingsdatum weet het model niets — niet “is onzeker”, maar niets — en het zal vloeiend confabuleren in plaats van dat te zeggen, omdat dat nooit een gedrag was waarop het getraind werd. Llama 3.1’s model card geeft december 2023;33 elk model heeft er een, en het is een eigenschap van de training data, niet van de deployment. Eromheen werken is een retrieval-probleem, en dat is Hoofdstuk 19.

De tweede is dat een base model aanvult in plaats van antwoordt. Geef het “What is the capital of France?” en een plausibel vervolg is nog een vraag, omdat die string in het corpus het vaakst in een lijst met oefeningen voorkomt.

Een tekstaanvuller is geen assistant. Hij volgt geen instructies, omdat niets in het corpus hem vertelde dat een verzoek moest worden opgevolgd in plaats van voortgezet. Hij heeft geen begrip van een gesprek met twee deelnemers. Hij produceert zonder moeite de waarschijnlijkste voortzetting van een schadelijke prompt, omdat waarschijnlijk het enige is waarvoor hij ooit geoptimaliseerd werd.

Er iets van maken dat antwoordt, vraagt een tweede fase die een fractie van een procent van de eerste kost, en bijna volledig bestaat uit het tonen van voorbeelden van het gedrag dat je wilt en daarna paren van zijn eigen outputs vergelijken. Uit die fase komen instruction following, chat templates, refusals en — dit verrast mensen — het vermogen om een tool aan te roepen. Hoofdstuk 11 is die fase: supervised fine-tuning, RLHF, DPO en GRPO, en de vraag wat “aligned” betekent en wie dat bepaalt.


Ook de moeite waard om naast dit hoofdstuk te lezen: Karpathy’s build-nanogpt en de bijbehorende video, die een volledige GPT-2-reproductie end-to-end doorlopen in een tempo dat dit hoofdstuk niet kan; en Stanford CS324, Large Language Models, waarvan de colleges over data en environmental impact dieper ingaan op materiaal dat deze cursus één keer behandelt en daarna delegeert.

  1. Kaplan, J., McCandlish, S., Henighan, T., Brown, T. B., Chess, B., Child, R., Gray, S., Radford, A., Wu, J. and Amodei, D. Scaling Laws for Neural Language Models. arXiv:2001.08361 (2020). De drie power laws zijn Eq. (1.1)–(1.3) in §1.2 en de volledige constanten staan in Appendix A, Tabel 5; de 6N6N-afleiding is §2.1; de compute-allocation-exponenten staan in Tabel 6. Let op dat er twee compute-wetten zijn, αC=0.057\alpha_C = 0.057 bij vaste batchgrootte en αCmin=0.050\alpha_C^{\min} = 0.050 bij optimale batchgrootte; de paper zegt dat de laatste “should be used to make predictions”. 2

  2. Hoffmann, J., Borgeaud, S., Mensch, A., Buchatskaya, E., Cai, T., Rutherford, E. et al. Training Compute-Optimal Large Language Models. arXiv:2203.15556 (2022). Exponenten in Tabel 2, geprojecteerde budgetten in Tabel 3, de Gopher-vergelijking in §4, de conventie voor parameter-telling in Appendix F. De tekst onder Tabel 3 spreekt Tabel 3 zelf tegen voor de rijen 175 B en 280 B; de tabel is de versie om te citeren. 2 3 4

  3. Micikevicius, P., Narang, S., Alben, J., Diamos, G., Elsen, E., Garcia, D. et al. Mixed Precision Training. arXiv:1710.03740 (2017), ICLR 2018. FP32 master weights in §3.1, loss scaling in §3.2. 2

  4. Rajbhandari, S., Rajbhandari, S., Ruwase, O. and He, Y. ZeRO: Memory Optimizations Toward Training Trillion Parameter Models. arXiv:1910.02054 (2019), SC20. De 16Ψ16\Psi-boekhouding staat in §3.1; de residual-state-cijfers voor activations staan in §3.2.

  5. Grattafiori, A. et al. (Llama Team, AI @ Meta). The Llama 3 Herd of Models. arXiv:2407.21783 (2024). Compute-budget en token-count in §1, de opnieuw gefitte scaling law in §3.2.1, de parallelism-configuratie en MFU in Tabel 4, de contamination-analyse in §5.1.4, de over-training-uitspraak in §9.1. De paper bevat geen dollarcijfers en geen emissietabel. 2 3 4 5 6

  6. Stanford CS336, Language Modeling from Scratch. College 2 behandelt resource accounting, colleges 5–8 GPU’s, kernels en parallelism, colleges 9 en 11 scaling, colleges 13–14 data. Het is de cursus waaraan dit hoofdstuk zijn engineering delegeert, en hij is publiek.

  7. Brown, T. B. et al. Language Models are Few-Shot Learners. arXiv:2005.14165 (2020). Compute in Appendix D, Tabel D.1 — die een kolom heeft die letterlijk “flops per param per token” heet, waarvan de waarde voor elke GPT-3-rij 6 is. Contamination-analyse in §4. 2 3

  8. Besiroglu, T., Erdil, E., Barnett, M. and You, J. Chinchilla Scaling: A replication attempt. arXiv:2404.10102 (2024). Reconstrueert Chinchilla’s data door Figure 4 te digitaliseren, refit, en rapporteert de gecorrigeerde exponenten en veel bredere intervallen.

  9. Muennighoff, N., Rush, A. M., Barak, B., Le Scao, T., Piktus, A., Tazi, N., Pyysalo, S., Wolf, T. and Raffel, C. Scaling Data-Constrained Language Models. arXiv:2305.16264 (2023), NeurIPS 2023. Het resultaat met vier epochs staat in §6; de halfwaardetijd van zestien epochs is de gefitte RD15R_D^* \approx 15.

  10. Touvron, H., Lavril, T., Izacard, G., Martinet, X., Lachaux, M.-A., Lacroix, T. et al. LLaMA: Open and Efficient Foundation Language Models. arXiv:2302.13971 (2023). §1 noemt het inference-cost-argument tegen Chinchilla-optimal training.

  11. Sardana, N., Portes, J., Doubov, S. and Frankle, J. Beyond Chinchilla-Optimal: Accounting for Inference in Language Model Scaling Laws. arXiv:2401.00448 (2023), ICML 2024. Hun §5 bevat ook het tegengewicht: modellen getraind op extreme token-ratio’s blijven verbeteren, maar “more slowly than scaling laws predict”.

  12. Wei, J., Tay, Y., Bommasani, R., Raffel, C., Zoph, B., Borgeaud, S. et al. Emergent Abilities of Large Language Models. arXiv:2206.07682 (2022), TMLR. Definitie in §2, voorbeelden en compute-drempels in §3–4 en Tabel 1.

  13. Schaeffer, R., Miranda, B. and Koyejo, S. Are Emergent Abilities of Large Language Models a Mirage? arXiv:2304.15004 (2023), NeurIPS 2023 outstanding paper. Het metric-argument is §2, de BIG-Bench-meta-analyse §4, het geconstrueerde vision-voorbeeld §5.

  14. Common Crawl, August 2026 Crawl Archive Now Available (CC-MAIN-2026-34), gepubliceerd 24 augustus 2026, geraadpleegd 2026-09-06. De eigen voorpagina claimt “over 300 billion pages spanning 15 years”, “totalling more than 10 petabytes” — een cijfer voor het hele archief, niet voor de maandelijkse crawl die hier wordt geprijsd.

  15. Raffel, C., Shazeer, N., Roberts, A., Lee, K., Narang, S., Matena, M., Zhou, Y., Li, W. and Liu, P. J. Exploring the Limits of Transfer Learning with a Unified Text-to-Text Transformer. arXiv:1910.10683 (2019), JMLR 21(140). De C4-filters staan in §2.2. De paper geeft groottes in bytes, niet tokens; het cijfer van 156 miljard tokens dat er vaak aan wordt toegeschreven komt van Dodge et al. hieronder.

  16. Dodge, J., Sap, M., Marasović, A., Agnew, W., Ilharco, G., Groeneveld, D., Mitchell, M. and Gardner, M. Documenting Large Webtext Corpora: A Case Study on the Colossal Clean Crawled Corpus. arXiv:2104.08758 (2021), EMNLP 2021. Verwijderingspercentages per dialect staan in §5.3; benchmark contamination in C4 staat in §4.2.

  17. Lee, K., Ippolito, D., Nystrom, A., Zhang, C., Eck, D., Callison-Burch, C. and Carlini, N. Deduplicating Training Data Makes Language Models Better. arXiv:2107.06499 (2021), ACL 2022. De 61.036 herhalingen staan in voetnoot 1; de memorisation-cijfers staan in §6.2, Tabel 4, en zijn percentages van generated tokens onder een exact-match-criterium van 50 tokens.

  18. Penedo, G., Kydlíček, H., Ben Allal, L., Lozhkov, A., Mitchell, M., Raffel, C., Von Werra, L. and Wolf, T. The FineWeb Datasets: Decanting the Web for the Finest Text Data at Scale. arXiv:2406.17557 (2024), NeurIPS 2024 Datasets and Benchmarks. Het deduplication-resultaat staat in §3.4. De uitgebrachte dataset is sindsdien voorbij de 15 biljoen tokens van de paper gegroeid.

  19. Gao, L., Biderman, S., Black, S. et al. The Pile: An 800GB Dataset of Diverse Text for Language Modeling. arXiv:2101.00027 (2020). Books3 staat in §2.3 en Tabel 1; de consent-tabel is Tabel 5. Het corpus is 825,18 GiB, dus zelfs de titel is naar beneden afgerond.

  20. Bartz v. Anthropic, No. 4:24-cv-05417 (N.D. Cal.). Fair-use order 23 juni 2025 (Dkt. 231); class certification 17 juli 2025; final approval and judgment 20 juli 2026 (Dkt. 680). De schikking ontslaat alleen inputs uit het verleden, niet outputs en niet toekomstig gedrag.

  21. Kadrey v. Meta, No. 3:23-cv-03417-VC (N.D. Cal.), summary judgment 25 juni 2025 (Dkt. 598). Let op dat de distributieclaim over torrenting niet is beslist en nog loopt.

  22. Thomson Reuters v. ROSS Intelligence, No. 1:20-cv-00613-SB (D. Del.), herziene opinie 11 februari 2025 (Dkt. 770), Bibas J. In interlocutory appeal bij het Third Circuit (No. 25-2153), bepleit op 11 juni 2026, onbeslist op het moment van schrijven.

  23. Perrigo, B. Exclusive: OpenAI Used Kenyan Workers on Less Than $2 Per Hour to Make ChatGPT Less Toxic. TIME, 18 januari 2023. De $2 is een bovengrens voor senior reviewers die elk target haalden; junior labellers, de meerderheid, namen $1,32 mee naar huis. Sama’s weerwoord, geciteerd in hetzelfde artikel, geeft $1,46–$3,74 en een lager quotum.

  24. Luccioni, A. S., Viguier, S. and Ligozat, A.-L. Estimating the Carbon Footprint of BLOOM, a 176B Parameter Language Model. arXiv:2211.02001 (2022), JMLR 24(253). Tabellen 1 en 3.

  25. Patterson, D., Gonzalez, J., Le, Q., Liang, C., Munguia, L.-M., Rothchild, D., So, D., Texier, M. and Dean, J. Carbon Emissions and Large Neural Network Training. arXiv:2104.10350 (2021). GPT-3’s cijfers staan in Tabel 4; de correctie van de NAS-schatting staat in §4.1.

  26. Strubell, E., Ganesh, A. and McCallum, A. Energy and Policy Considerations for Deep Learning in NLP. arXiv:1906.02243 (2019), ACL 2019. Juist de moeite waard om precies te lezen vanwege wat er met het meest geciteerde getal gebeurde: de paper is zorgvuldig, noemt zijn extrapolatie, en zat toch twee ordes van grootte fout op de ene regel die iedereen herhaalde.

  27. Smith, S. J., Hubbard, A., Newkirk, A., Ganeshalingam, M., Holecek, B., Sartor, D., Mills, M. and Shehabi, A. United States Data Center Energy Usage Report: 2025 Update. LBNL-2001758 (18 juni 2026). Dit herziet het vaak geciteerde rapport van 2024 naar beneden voor de historische reeks; als je het cijfer van 176 TWh voor 2023 citeert, citeer je de vervangen editie.

  28. Bender, E. M., Gebru, T., McMillan-Major, A. and Shmitchell, S. On the Dangers of Stochastic Parrots: Can Language Models Be Too Big? FAccT ’21, pp. 610–623. DOI 10.1145/3442188.3445922. “Documentation debt” staat in §4.4. Let op dat de eigen koolstofcijfers van de paper uit Strubell et al. worden geciteerd en de correctie hierboven erven — wat een illustratie van het argument is, geen weerlegging ervan.

  29. NVIDIA. NVIDIA H100 Tensor Core GPU productpagina, nvidia.com/en-us/data-center/h100/ (geraadpleegd 2026-09-06). Elke tensor-core-rij op die pagina behalve FP64 draagt de voetnoot “with sparsity”; het dense BF16-cijfer dat hier wordt gebruikt is de helft van de gepubliceerde 1.979 TFLOPS.

  30. Lambda. GPU Cloud pricing, lambda.ai/pricing (geraadpleegd 2026-09-06). On-demand, per GPU per uur, vóór belasting. Prijzen in deze sectie zullen sneller verouderen dan wat dan ook in deze cursus; de rekenkunde eromheen niet.

  31. Karpathy, A. karpathy/llm.c, discussie #481, Reproducing GPT-2 (124M) in llm.c in 90 minutes for $20 (28 mei 2024), en discussie #677, Let's reproduce GPT-2 (1.6B): one 8XH100 node, 24 hours, $672, in llm.c (11 juli 2024).

  32. Karpathy, A. karpathy/nanochat, README en “time to GPT-2”-leaderboard (geraadpleegd 2026-09-06). Het cijfer van $48 en de CORE-score-definitie van “GPT-2 capability” staan allebei in de README; de eigen speedrun.sh van de repository zegt “approximately 1.5 hours”, dus behandel het cijfer van twee uur als afgerond.

  33. Meta. Llama 3.1 model card, models/llama3_1/MODEL_CARD.md in meta-llama/llama-models (geraadpleegd 2026-09-06). Bron van de 30,84 M H100-uren voor het 405 B-model, de 39,3 M in totaal, het location-based cijfer van 11.390 tCO2eq, en de data cutoff van december 2023.


Gemaakt door

David Vicente Campos

Oprichter van NeuraLIA Labs en medeoprichter van MyRealFood

Ik ben informatica-ingenieur, afgestudeerd aan de Universiteit van León. Ik was medeoprichter van MyRealFood, waar ik als CTO de app bouwde die miljoenen mensen hebben gebruikt om beter te eten, en ik heb NeuraLIA Labs opgericht, waar ik AI-producten bouw. Hier schrijf ik over wat ik onderweg heb moeten begrijpen, zoals ik wou dat iemand het mij had uitgelegd.

Meer over de auteur

Gepubliceerd door NeuraLIA Labs.

Ontvang nieuwe posts in je inbox

AI-nieuws, gidsen en productupdates — een korte mail wanneer we iets publiceren dat je tijd waard is.

Cursusindex

Abstract software decision engine with branching paths, probability nodes, and glowing gates.
jev12 min leestijd

Jev AI-model is gebouwd voor beslissingen, niet voor proza

TypeSafe AI’s Jev trekt aandacht omdat het software-intelligentie benadert als een waarschijnlijkheidsprobleem: kies de juiste vertakking, voeg vertrouwen toe en betaal geen LLM om tekst te schrijven wanneer code een beslissing nodig heeft.

Abstract agent runtime sorting documents, memory blocks and pointer nodes inside a bounded context frame.
context-engineering11 min leestijd

Context-engineering voor langlopende AI-agenten

Langlopende agenten falen niet alleen omdat het venster klein is. Ze falen wanneer bestanden, tool-outputs en verouderde geschiedenis de taak verdringen die de agent moest afronden.

Klaar om LIA te laten kiezen?

Bouw met elk AI-model op één plek — begin vandaag nog gratis.