Fəsil 05 · 8 dəq oxu

Pretraining və scaling

Pretraining və scaling

Əvvəlki fəsillərdə əsas parçalar hazırlandı. yeniləyir, arasında məlumat daşıyır, data pipeline isə trilyonlarla təmiz verir. bunların hamısını birləşdirir: eyni sadə tapşırıq aylarla, minlərlə GPU üzərində təkrarlanır. Bu fəsil üç suala cavab verir: model əslində nəyi optimallaşdırır, nə qədər compute lazımdır və bu compute model ölçüsü ilə data arasında necə bölünür. Ən azı birinə dəqiq cavab verməyi bacarmasanız, və ya model seçimi barədə qərarlarınız təxmin üzərində qurulacaq.

Məqsəd: növbəti token və cross-entropy

objective-i belədir: ardıcıllığın hər mövqeyində model növbəti üçün paylanma verir və həqiqi ehtimalının mənfi logaritmi cəzalandırılır. Bu, Fəsil 1-dəki loss-dur, sadəcə vocabulary üzərində tətbiq olunur.

loss = -(1/T) · Σ log p(x_t | x_<t)

Bir ardıcıllıqda T mövqe varsa, model T proqnoz verir və hamısı paralel hesablanır. Causal mask (Fəsil 3) hər mövqeyin yalnız keçmişə baxmasını təmin edir. Buna görə hər training nümunəsi bir yox, minlərlə öyrənmə siqnalı verir. lazım deyil, çünki data özü . Bu, self-supervised learning-dir və internet miqyasında data istifadə etməyi mümkün edən də elə budur.

Loss-u oxumağın rahat yolu perplexity-dir:

perplexity = exp(loss)

Loss 2.0-dırsa, perplexity təxminən 7.4 olur. Kobud desək, model hər addımda 7–8 bərabər ehtimallı variant arasında tərəddüd edir. Perplexity yalnız eyni və eyni eval dataset-i daxilində müqayisə oluna bilər, çünki ölçüsü dəyişəndə rəqəm də dəyişir. Fərqli iki modelin perplexity-sini yan-yana qoymaq ən çox yayılmış səhvlərdən biridir.

Compute-u hesablamaq: 6·N·D

training xərci təəccüblü dərəcədə sadə düsturla təxmin olunur:

C ≈ 6 · N · D
C – training FLOPs
N – parametr sayı
D – training token-lərinin sayı

Forward pass hər parametr və hər üçün təxminən 2 FLOP sərf edir: bir vurma, bir toplama. Backward pass bunun təxminən iki mislidir, çünki həm activation-lara, həm də görə gradient hesablanır. Cəmi 6 alınır. context uzunluğuna görə əlavə xərci var, amma adi context-lərdə və böyük modellərdə bu düzəliş kiçikdir. MoE modellərdə (Fəsil 3) N əvəzinə hər aktiv olan parametrlər götürülür.

Bu düstur infrastruktur qərarlarının əsasıdır. GPU-nun nominal sürəti heç vaxt tam istifadə olunmur. Faktiki istifadənin payına MFU (model FLOPs utilization) deyilir. Yaxşı tənzimlənmiş training-də MFU adətən 35–55% olur.

Scaling law-lar

2020-ci ildə Kaplan və həmkarları göstərdi ki, loss parametr sayı, data və compute ilə power law üzrə azalır: log-log qrafikdə düz xəttə yaxın gedir. Bu nəticənin praktik mənası böyükdür. Kiçik modellər üzərində bir neçə eksperiment aparıb böyük modelin loss-unu əvvəlcədən proqnozlaşdırmaq olur. Laboratoriyalar milyonlarla dollarlıq run-a başlamazdan əvvəl məhz belə edir.

Kaplan-ın ilk nəticəsinə görə, compute artanda onun böyük hissəsi parametrlərə verilməli idi. GPT-3 (175B parametr, ~300B ) bu məntiqlə qurulmuşdu. 2022-ci ildə DeepMind-ın Chinchilla işi bu tövsiyəni düzəltdi. Learning rate schedule-u hər run-ın uzunluğuna uyğunlaşdıranda məlum oldu ki, verilmiş compute büdcəsində parametr və sayı təxminən bərabər sürətlə böyüməlidir. Təcrübi qayda belədir:

compute-optimal: D ≈ 20 · N

Chinchilla (70B parametr, 1.4T ) özündən dörd dəfə böyük Gopher-i (280B) eyni compute ilə geridə qoydu. Deməli, o dövrün böyük modelləri "undertrained" idi.

Compute-optimal niyə hər şey deyil

Chinchilla qaydası yalnız training xərcini minimallaşdırır. Model isə bir dəfə train edilir və milyardlarla dəfə işləyir. xərci N ilə mütənasibdir. Ona görə müasir open model-lər qəsdən overtrain edilir: kiçik model compute-optimal həddən çox-çox artıq öyrədilir. Llama 3 8B təxminən 15T görüb, bu da parametr başına ~1900 deməkdir və Chinchilla nisbətindən 90 dəfə çoxdur. Loss əyrisi yavaşlayır, amma dayanmır. Hər əlavə kiçik modeli bir az da yaxşılaşdırır.

Nəticə: "hansı model ölçüsü?" sualı "nə qədər training compute var?" sualından çox " nə qədər ödəyə bilərik?" sualından asılıdır. Part II-də open model seçəndə bu mülahizə birbaşa işə düşəcək. Overtrain edilmiş 8B model çox vaxt compute-optimal 30B modeldən ucuz və kifayət qədər yaxşıdır.

İşlənmiş nümunə: büdcəni hesablamaq

Fərz edək, komandanız sıfırdan domain modeli train etmək istəyir və iki variantı müqayisə edir. Fərziyyələr: H100 GPU-nun bf16 dense sürəti ~990 TFLOPS, MFU 40%. Deməli, faktiki sürət GPU başına təxminən 4·10¹⁴ FLOP/s-dir.

Variant A: 1B parametr, 20B token (Chinchilla)
C = 6 · 1e9 · 2e10 = 1.2e20 FLOPs
vaxt = 1.2e20 / 4e14 ≈ 3e5 s ≈ 83 GPU-saat

Variant B: 7B parametr, 2T token (overtrain)
C = 6 · 7e9 · 2e12 = 8.4e22 FLOPs
vaxt = 8.4e22 / 4e14 ≈ 2.1e8 s ≈ 58 000 GPU-saat

Variant A bir node-da (8 GPU) on saatdan az çəkir və eksperiment üçün idealdır. Variant B 256 GPU-da təxminən 10 gün deməkdir, xərci isə yüz minlərlə dollara çatır. Bu hesab bir dəqiqə çəkir və çox vaxt "sıfırdan train edək" ideyasını "mövcud open model-i adaptasiya edək" qərarına çevirir. Part II məhz bu qərarın üzərində qurulacaq.

Yaddaş: GPU-ya nə sığır

Compute vaxtı müəyyən edir, yaddaş isə ümumiyyətlə başlamağın mümkün olub-olmadığını. AdamW ilə mixed training-də hər parametr təxminən 16 byte tutur:

bf16 weight-lər           2 byte
bf16 gradient-lər         2 byte
fp32 master weight-lər    4 byte
AdamW m (momentum)        4 byte
AdamW v (variance)        4 byte
-------------------------------
cəmi                    ~16 byte / parametr

7B model üçün bu ~112 GB edir və 80 GB-lıq tək GPU-ya sığmır. Hələ activation-lar da var: backward pass üçün saxlanan aralıq nəticələr. Onların həcmi batch ölçüsü, sequence uzunluğu, hidden ölçü və layer sayı ilə böyüyür. Uzun context-lərdə activation-lar asanlıqla keçir.

Bunun üçün iki standart texnika var:

  • Gradient checkpointing. Bütün activation-lar saxlanmır, yalnız bəzi layer-lərin girişi saxlanır. Qalanları backward zamanı yenidən hesablanır. Təxminən 30% əlavə compute müqabilində activation yaddaşı kəskin azalır.
  • Gradient accumulation. Böyük effektiv batch bir neçə kiçik micro-batch-ə bölünür. Gradient-lər toplanır və addımı yalnız sonda atılır. Riyazi nəticə eynidir, yaddaş isə micro-batch ölçüsü ilə məhdudlaşır.

Mixed precision

Ədədin formatı həm yaddaşı, həm sürəti, həm də stabilliyi müəyyən edir.

  • fp32: dəqiqdir, amma yavaşdır və iki dəfə çox yer tutur.
  • fp16: yarı ölçüdədir, amma diapazonu dardır. Kiçik gradient-lər sıfıra düşür, ona görə loss scaling tələb olunur.
  • bf16: fp32 ilə eyni exponent diapazonuna, daha az dəqiqliyə malikdir. Bu gün training üçün standartdır, çünki loss scaling-ə ehtiyac qoymur.
  • fp8: H100 və sonrakı GPU-larda dəstəklənir. Matmul-ları təxminən iki dəfə sürətləndirir, amma diqqətli scaling tələb edir. DeepSeek-V3 kimi böyük modellər fp8 ilə train edilib. 2026-cı ildə bu artıq eksperiment deyil, böyük run-larda adi seçimdir.

Ümumi qayda belədir: ağır matmul-lar aşağı işləyir. Həssas əməliyyatlar (softmax, normalization, loss, state-ləri) isə yüksək saxlanır.

Parallelism: işi GPU-lar arasında bölmək

Tək GPU nə model-i, nə də vaxt büdcəsini daşıya bilir. Paylamanın dörd əsas oxu var və böyük run-lar onları birləşdirir:

  • Data parallelism. Hər GPU modelin tam kopyasını saxlayır və fərqli batch hissəsini emal edir. Gradient-lər all-reduce ilə ortalanır. Bu üsul sadədir, amma model hər GPU-ya sığmalıdır.
  • ZeRO / FSDP. Data parallelism-in yaddaş israfını aradan qaldırır: state-ləri, gradient-lər və GPU-lar arasında bölünür ( edilir). Hər layer lazım olanda toplanır, sonra yenidən buraxılır. 7B–70B modelləri edərkən ən çox rast gələcəyiniz yanaşma budur.
  • Tensor parallelism. Tək bir matmul GPU-lar arasında bölünür, məsələn head-ləri və ya MLP sütunları. Çox sıx kommunikasiya tələb etdiyi üçün adətən bir node daxilində, sürətli NVLink üzərində işlədilir.
  • Pipeline parallelism. Layer-lər mərhələlərə bölünür və hər mərhələ ayrı GPU-dadır. Micro-batch-lər konveyer kimi axır. Əsas çətinlik GPU-ların boş gözlədiyi "bubble"-ları azaltmaqdır.

MoE modellərdə buna expert parallelism də əlavə olunur: fərqli expert-lər fərqli GPU-larda yerləşir.

Instabillik: loss spike-ları

Böyük training run-ı nadir hallarda hamar gedir. Ən tanış problem loss spike-dır: loss qəfildən sıçrayır, bəzən öz-özünə bərpa olunur, bəzən isə run-ı məhv edir. Tipik səbəblər bunlardır: çox yüksək learning rate, pis data batch-i (məsələn, təkrarlanan zibil mətn), logit-lərinin həddən artıq böyüməsi və aşağı overflow.

Tətbiq olunan müdafiələr: gradient clipping, learning rate warmup, QK-norm kimi normalization əlavələri, z-loss və müntəzəm checkpoint saxlamaq. Spike baş verəndə ən çox işlənən praktika son sağlam checkpoint-ə qayıdıb problemli data hissəsini keçməkdir. Böyük laboratoriyaların training log-larında bu cür "rewind" əməliyyatları onlarla dəfə görünür.

Base model nəyi bacarır, nəyi yox

bitəndə əlinizdə base model olur. Bu, internet mətnini yaxşı davam etdirən, amma heç kimə kömək etmək üçün öyrədilməmiş bir modeldir.

Bacardıqları:

  • dil, üslub, kod sintaksisi və faktlar barədə zəngin bilik;
  • öyrənmə: bir neçə nümunə qoyanda tapşırığı tutur;
  • in-context learning-in özü, yəni Fəsil 3-dəki mexanizminin nəticəsi.

Bacarmadıqları:

  • təlimata əməl etmək: "Fransanın paytaxtı nədir?" sualına cavab vermək əvəzinə daha üç sual yaza bilər, çünki internetdə suallar çox vaxt siyahı halında gəlir;
  • nə vaxt dayanmaq lazım olduğunu bilmək;
  • təhlükəli sorğulardan imtina etmək və ya öz qeyri-müəyyənliyini bildirmək.

Base model "xam material"dır. Onu faydalı assistant-a çevirən mərhələ növbəti fəslin mövzusudur. Domain adaptasiyası üçün bəzən məhz base model daha yaxşı başlanğıc nöqtəsi olur.

Tapşırıqlar

  1. Llama 3 8B (15T ) və Chinchilla-optimal 8B model (~160B ) üçün 6·N·D ilə training FLOPs-u hesablayın. 40% MFU ilə H100-də neçə GPU-saat çəkdiyini tapın. Overtrain-in qiymətini qənaəti ilə necə əsaslandırardınız?
  2. 3B parametrli modeli AdamW və bf16 mixed ilə tam etmək üçün activation-lardan əvvəl lazım olan yaddaşı hesablayın. Bu, 24 GB, 48 GB və 80 GB GPU-ya sığırmı? Sığmırsa, hansı texnikalar (FSDP, gradient checkpointing, 8-bit ) onu sığdırar?
  3. Kiçik bir (məsələn, 10M–50M parametr) üç fərqli ölçüdə eyni data üzərində train edin. Final loss-u compute-a qarşı log-log qrafikdə çəkin və düz xəttə nə qədər yaxın olduğunu yoxlayın. Bu xətti ekstrapolyasiya etsəniz, 10 dəfə böyük model üçün hansı loss gözlənilir?