Pretraining və scaling
Pretraining və scaling
Əvvəlki fəsillərdə əsas parçalar hazırlandı. Optimizer weight-ləri yeniləyir, transformer token-lər arasında məlumat daşıyır, data pipeline isə trilyonlarla təmiz token verir. Pretraining 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, fine-tuning 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
Pretraining-in objective-i belədir: ardıcıllığın hər mövqeyində model növbəti token üçün paylanma verir və həqiqi token-in ehtimalının mənfi logaritmi cəzalandırılır. Bu, Fəsil 1-dəki cross-entropy 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. Label lazım deyil, çünki data özü label-dir. 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 tokenizer və eyni eval dataset-i daxilində müqayisə oluna bilər, çünki token-lərin ölçüsü dəyişəndə rəqəm də dəyişir. Fərqli tokenizer-li iki modelin perplexity-sini yan-yana qoymaq ən çox yayılmış səhvlərdən biridir.
Compute-u hesablamaq: 6·N·D
Transformer-in 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 token üçü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ə weight-lərə görə gradient hesablanır. Cəmi 6 alınır. Attention-un 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 token-də 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 token) 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ə token 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 token) ö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ə inference-da işləyir. Inference 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 token-lə öyrədilir. Llama 3 8B təxminən 15T token görüb, bu da parametr başına ~1900 token deməkdir və Chinchilla nisbətindən 90 dəfə çoxdur. Loss əyrisi yavaşlayır, amma dayanmır. Hər əlavə token 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 "inference-da 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 precision 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 weight-ləri 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ə optimizer 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ğı precision-da işləyir. Həssas əməliyyatlar (softmax, normalization, loss, optimizer state-ləri) isə yüksək precision-da 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: optimizer state-ləri, gradient-lər və weight-lər GPU-lar arasında bölünür (shard edilir). Hər layer lazım olanda toplanır, sonra yenidən buraxılır. 7B–70B modelləri fine-tune 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 attention 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), attention logit-lərinin həddən artıq böyüməsi və aşağı precision-da 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
Pretraining 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;
- few-shot öyrənmə: prompt-a bir neçə nümunə qoyanda tapşırığı tutur;
- in-context learning-in özü, yəni Fəsil 3-dəki attention 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
- Llama 3 8B (15T token) və Chinchilla-optimal 8B model (~160B token) üçü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 inference qənaəti ilə necə əsaslandırardınız?
- 3B parametrli modeli AdamW və bf16 mixed precision ilə tam fine-tune 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 optimizer) onu sığdırar?
- Kiçik bir transformer-i (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?