# Cunoaste aripile dragonului tau: M3 Ultra 96 GB vs RTX 4090

Marimea unui dragon este limitata de anvergura aripilor; marimea modelului tau este limitata de memorie. Aceasta lectie iti da matematica exacta a memoriei pentru antrenare, apoi compara cele doua masini ale cursului — **Mac Studio M3 Ultra cu 96 GB memorie unificata** si **PC-ul cu i9 si RTX 4090 (24 GB VRAM)** — ca sa stii precis ce modele poate antrena fiecare si care castiga la ce capitol.

## Matematica memoriei care decide totul

Memoria de antrenare este dominata de patru lucruri: **ponderile** modelului, **gradientii**, **starea optimizatorului** si **activarile**. Cat de mult ai nevoie depinde in intregime de metoda de antrenare:

<div class="concept-box">
<h4>Concept</h4>
Reguli empirice per miliard de parametri:<br>
<strong>Fine-tune complet (16-bit + AdamW):</strong> ~16–20 GB per 1B parametri — ponderi (2) + gradienti (2) + optimizator (8–12) + activari.<br>
<strong>LoRA (baza inghetata pe 16-bit):</strong> ~2–2.5 GB per 1B parametri — baza doar sta in memorie; se antreneaza doar adapterele minuscule.<br>
<strong>QLoRA (baza inghetata pe 4-bit):</strong> ~0.6–0.8 GB per 1B parametri — baza e comprimata la 4 biti, adapterele se antreneaza tot pe 16-bit.
</div>

Fa calculele si imaginea devine instantanee:

| Marime model | Fine-tune complet | LoRA (16-bit) | QLoRA (4-bit) |
|---|---|---|---|
| 1B | ~18 GB | ~3 GB | ~1.5 GB |
| 4B | ~70 GB | ~10 GB | ~4 GB |
| 8B | ~140 GB | ~18 GB | ~7 GB |
| 14B | ~250 GB | ~32 GB | ~12 GB |
| 32B | ~550 GB | ~70 GB | ~24 GB |
| 70B | ~1.2 TB | ~150 GB | ~48 GB |

Acum suprapune plafoanele de memorie ale celor doua masini:

<svg viewBox="0 0 720 400" width="100%" xmlns="http://www.w3.org/2000/svg" role="img" aria-label="Necesarul de memorie QLoRA pe marimi de model vs plafoanele de 24 GB (RTX 4090) si 96 GB (M3 Ultra)">
    <text x="360" y="24" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="14px">Memoria de antrenare QLoRA pe marime de model (GB)</text>
  <line x1="70" y1="330" x2="690" y2="330" stroke="#3a4356" stroke-width="1"/>
  <!-- scale: 3px per GB, baseline y=330 -->
  <rect x="100" y="325.5" width="70" height="4.5" fill="rgba(123,140,255,0.55)"/>
  <text x="135" y="350" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="14px">1B</text>
  <text x="135" y="318" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="12px">1.5</text>
  <rect x="200" y="318" width="70" height="12" fill="rgba(123,140,255,0.55)"/>
  <text x="235" y="350" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="14px">4B</text>
  <text x="235" y="310" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="12px">4</text>
  <rect x="300" y="309" width="70" height="21" fill="rgba(123,140,255,0.55)"/>
  <text x="335" y="350" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="14px">8B</text>
  <text x="335" y="301" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="12px">7</text>
  <rect x="400" y="294" width="70" height="36" fill="rgba(123,140,255,0.55)"/>
  <text x="435" y="350" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="14px">14B</text>
  <text x="435" y="286" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="12px">12</text>
  <rect x="500" y="258" width="70" height="72" fill="rgba(251,191,36,0.6)"/>
  <text x="535" y="350" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="14px">32B</text>
  <text x="535" y="250" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="12px">24</text>
  <rect x="600" y="186" width="70" height="144" fill="rgba(239,68,68,0.55)"/>
  <text x="635" y="350" text-anchor="middle" fill="#e6e9f0" font-family="-apple-system, sans-serif" font-size="14px">70B</text>
  <text x="635" y="178" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="12px">48</text>
  <line x1="70" y1="258" x2="690" y2="258" stroke="#4fffb0" stroke-width="2" stroke-dasharray="6 4"/>
  <text x="76" y="250" fill="#4fffb0" font-family="monospace" font-size="12px">Plafon RTX 4090 — 24 GB</text>
  <line x1="70" y1="42" x2="690" y2="42" stroke="#7b8cff" stroke-width="2" stroke-dasharray="6 4"/>
  <text x="76" y="60" fill="#7b8cff" font-family="monospace" font-size="12px">Plafon M3 Ultra — 96 GB (~75 GB utilizabili pentru antrenare)</text>
  <text x="360" y="382" text-anchor="middle" fill="#9aa3b5" font-family="-apple-system, sans-serif" font-size="12px">Mov = incape pe ambele · Chihlimbar = la limita pe 4090 · Rosu = teritoriu exclusiv Mac</text>
</svg>

## Masina 1: Mac Studio M3 Ultra, 96 GB memorie unificata

Trucul Apple este **memoria unificata**: CPU si GPU impart un singur bazin urias. Nu exista "copiere in VRAM" — GPU-ul vede toti cei 96 GB (macOS iti lasa implicit sa impingi cam 75% din ea catre GPU, mai mult daca ajustezi). Antrenarea ruleaza pe **MLX**, framework-ul ML al Apple, folosind pachetul `mlx-lm`.

**Puncte forte:**
- **Capacitatea e regina.** QLoRA pe un model 32B e confortabil. LoRA pe 14B merge. Chiar si un QLoRA pe 70B e *posibil* — lent, dar posibil. Pe o placa de 24 GB, acestea sunt pur si simplu inaccesibile.
- Silentios, consum minuscul (~160 W sub sarcina), sta pe un birou.
- Aceeasi masina apoi *ruleaza* rapid modele mari la inferenta — ~800 GB/s latime de banda a memoriei este excelenta pentru generarea de tokeni.

**Puncte slabe:**
- **Puterea bruta de antrenare.** GPU-ul din M3 Ultra e puternic, dar ecosistemul CUDA e cu un deceniu inainte la optimizari de antrenare. Asteapta-te la antrenari de 2–4× mai lente decat pe un 4090 *pentru modelele care incap pe ambele*.
- Unele trucuri de antrenare de ultima ora (kernel-uri sofisticate, unele scheme de cuantizare) ajung intai pe CUDA, pe MLX mai tarziu sau niciodata.

## Masina 2: PC cu i9 + RTX 4090, 24 GB VRAM

4090 este un monstru: ~1000 GB/s latime de banda a memoriei, tensor cores dedicate si intregul stack CUDA — **Unsloth**, Hugging Face `transformers` + `peft` + `trl`, Flash Attention, `bitsandbytes`. i9-ul si RAM-ul de sistem conteaza mai ales pentru preprocesarea datelor; GPU-ul face treaba adevarata.

**Puncte forte:**
- **Viteza e regina.** Pentru orice ≤ 8B, 4090 devoreaza antrenarea. Un run LoRA care dureaza o ora pe Mac se termina in ~15–20 de minute.
- Kernel-urile Unsloth cam dubleaza viteza de antrenare si injumatatesc memoria fata de Hugging Face standard — un 2× gratuit exact pe aceasta placa.
- Fiecare tutorial, fiecare tehnica noua, fiecare optimizare apare intai pe CUDA.

**Puncte slabe:**
- **24 GB este un zid dur.** LoRA pe 14B in 16-bit nu incape; QLoRA pe 32B abia se strecoara cu un batch mic si context scurt. Cand nu incape, pur si simplu crapa — nu exista "lent dar merge" ca pe memoria unificata.
- Consum si zgomot: 450 W doar pe GPU sub sarcina.

## Deci care ar trebui sa antreneze ce?

| Scenariu | Castigator | De ce |
|---|---|---|
| LoRA/QLoRA pe 1B–8B (proiectul cursului) | **RTX 4090** | De 2–4× mai rapid, oricum incape tot |
| QLoRA pe 14B–32B | **M3 Ultra** | Incape cu spatiu de respiratie; 4090 se sufoca |
| Orice atinge 70B | **M3 Ultra** | Singura masina cu memoria necesara, rabdare obligatorie |
| Servirea modelului antrenat dupa aceea | **Egalitate** | 4090 mai rapid pentru modele mici, Mac-ul duce pe cele mai mari |
| Experimente cu tehnici nou-noute | **RTX 4090** | Ecosistem CUDA-first |

<div class="honest-note">
<h4>Nota sincera</h4>
Internetul adora sa declare o masina "castigatoare". Adevarul e plictisitor si util: <strong>4090 e o masina de curse, M3 Ultra e un camion.</strong> Proiectul cursului nostru — un model 4B cu QLoRA — incape pe ambele cu spatiu de rezerva, exact motivul pentru care l-am ales.
</div>

<div class="pro-tip">
<h4>Pro Tip</h4>
Oricare ar fi masina ta, lasa-ti margine de siguranta. Daca matematica spune 22 GB si tu ai 24 GB, un singur exemplu lung de antrenare poate face activarile sa sara si sa omoare run-ul la pasul 900 din 1000. Lungimea maxima de secventa mai scurta si gradient checkpointing sunt cele doua butoane care te salveaza — lectia 5 iti arata unde se afla.
</div>

<div class="try-it">
<h4>Incearca</h4>
Calculeaza-ti propriul plafon. Ia memoria GPU/unificata, inmulteste cu 0.8 pentru siguranta si verifica tabelul: care e cel mai mare model pe care <em>tu</em> il poti antrena cu QLoRA? Noteaza-l langa cardul tau de obiectiv. Acel numar iti alege modelul de baza in lectia 5.
</div>

<div class="checkpoint">
<h4>Checkpoint</h4>
Poti estima din cap memoria de antrenare pentru orice model (complet ≈ 18×, LoRA ≈ 2.5×, QLoRA ≈ 0.7× GB per miliard de parametri) si cunosti plafonul realist al masinii tale. Urmeaza: partea peste care toata lumea sare si apoi regreta — dataset-ul.
</div>
