CPU inferencija naspram GPU inferencije

Pitanje „može li ovo bez grafičke kartice" ima kratak odgovor: može, i to na svakom serveru koji imaš. Duži odgovor je da razlika u brzini nije nekoliko procenata nego red veličine, i da to menja spisak zadataka za koje je model upotrebljiv.

Ovaj tekst objašnjava odakle razlika dolazi, gde je granica upotrebljivosti i kako se prepoznaje najgori slučaj — postavka u kojoj model radi delom na kartici, a delom na procesoru, i to bez tvog znanja.

Odakle razlika

Uobičajeno objašnjenje je da kartica ima više jezgara. Tačno je, ali nije glavni razlog. Inferencija je ograničena propusnošću memorije, ne računom.

Da bi model izbacio jedan token, mora da pročita sve svoje težine iz memorije. Model od 16 GB znači šesnaest gigabajta pročitanih po tokenu. Sa dvadeset tokena u sekundi to je preko trista gigabajta u sekundi, samo za čitanje.

Tip memorije Okvirna propusnost
DDR4, dvokanalno 40 – 50 GB/s
DDR5, dvokanalno 70 – 90 GB/s
DDR5, serverski, osam kanala 300 – 400 GB/s
GDDR6X, potrošačka kartica 900 – 1000 GB/s
HBM, serverska kartica 2000 – 3000 GB/s

Odnos je dvadeset prema jedan i to je ceo odgovor. Brži procesor ti neće pomoći — usko grlo je magistrala, ne jezgra. Zato serverski procesor sa osam memorijskih kanala radi znatno bolje od jačeg desktop procesora sa dva.

Gruba procena brzine: propusnost podeljena veličinom modela.

Model 5 GB (8B, Q4_K_M)

DDR4 dvokanalno:   45 GB/s ÷ 5 GB = oko  9 t/s
DDR5 dvokanalno:   80 GB/s ÷ 5 GB = oko 16 t/s
RTX 3090:         936 GB/s ÷ 5 GB = oko 90 t/s (realno 50-70)

Realan broj je uvek niži od teorijskog, ali odnos ostaje.

Šta znači koja brzina

Tokena u sekundi Doživljaj Upotrebljivo za
ispod 3 Mučno Noćna obrada, ništa interaktivno
3 – 10 Sporije od čitanja Skripte, kratki odgovori, obrada u pozadini
10 – 20 Prati čitanje Razgovor, granica udobnosti
20 – 50 Brzo Sve, uključujući pomoć pri pisanju koda
preko 50 Brže nego što stižeš Agenti, paralelni korisnici

Petnaest tokena u sekundi je granica ispod koje čekaš mašinu. Iznad nje ona čeka tebe.

Prefill i decode se ponašaju različito

Ovo se lako previdi, a objašnjava zašto CPU nekad razočara više nego što tabela nagoveštava.

Decode — generisanje odgovora, token po token — ograničen je memorijom i tu je odnos onaj iz tabele iznad.

Prefill — čitanje celog prompta odjednom — ograničen je računom, jer se svi tokeni obrađuju paralelno. Tu kartica dobija dodatno, često i stostruko.

Posledica je konkretna: na procesoru je slanje dugačkog dokumenta modelu skuplje od dobijanja dugačkog odgovora. Sažimanje fajla od deset hiljada tokena ume da traje minutima pre nego što se pojavi prvi znak, iako je sam odgovor kratak. Na kartici je to nekoliko sekundi.

Delimični offloading

Između čistog CPU i čistog GPU rada postoji sredina: deo slojeva na kartici, ostatak u sistemskoj memoriji. Alati to rade automatski kada model ne staje, i to je najčešći uzrok pritužbe „model radi, ali užasno sporo".

Problem je što se brzina ne deli srazmerno. Onih dvadeset procenata slojeva koji su ostali na procesoru trošiće većinu vremena.

Model 27B, Q4_K_M (16 GB), kartica od 12 GB

Slojeva ukupno:        48
Na kartici:            34
Na procesoru:          14
Rezultat:              oko 4 t/s

Isti model, kartica od 24 GB:
Na kartici:            48
Rezultat:              oko 35 t/s

Provera:

$ ollama ps
NAME           ID          SIZE     PROCESSOR              UNTIL
qwen3:27b      a1b2c3d4    18 GB    58%/42% CPU/GPU        4 minutes from now

Ako kolona PROCESSOR ne pokazuje sto posto GPU, to je tvoj problem sa brzinom. Uzmi manji model ili nižu kvantizaciju — model koji ceo stane skoro uvek pobeđuje veći koji se preliva. Računicu daje tekst o proceni VRAM-a.

Kada je CPU sasvim dovoljan

Ne treba svaki zadatak da bude interaktivan.

  • Obrada u pozadini. Cron koji noću klasifikuje tikete ili sažima dnevne logove ne mari da li mu treba minut ili deset.
  • Kratki, strukturirani odgovori. Klasifikacija, izvlačenje podataka iz teksta, prevođenje jedne rečenice — odgovor od trideset tokena je gotov i na osam t/s.
  • Mali modeli. Klasa 1B do 4B na pristojnom procesoru daje petnaest do trideset t/s. To je upotrebljivo i za razgovor.
  • Retki upiti. Nekoliko poziva dnevno ne opravdava karticu.
  • Serverski procesor sa mnogo kanala. Osmokanalni sistem dostiže propusnost slabije kartice, uz mnogo više memorije za veće modele.

Ta poslednja stavka je zanimljiva za MoE modele. Pošto oni po tokenu čitaju samo aktivni deo težina, model označen kao 122B-A10B na procesoru sa mnogo memorije radi iznenađujuće pristojno — u memoriju mora ceo, ali se po tokenu čita desetina.

Podešavanje CPU inferencije

Ako ostaješ na procesoru, dve stvari donose najviše.

Broj niti. Podrazumevana vrednost je često pogrešna. Postavi na broj fizičkih jezgara, ne logičkih:

$ lscpu | grep -E '^CPU\(s\)|Core|Socket|Thread'
CPU(s):                  16
Thread(s) per core:      2
Core(s) per socket:      8
Socket(s):               1

$ OLLAMA_NUM_THREAD=8 ollama serve

Hyper-threading ovde ne pomaže jer niti dele istu memorijsku magistralu. Podizanje broja niti iznad broja jezgara zna i da uspori.

Memorija u svim kanalima. Dva modula u pravilnim slotovima daju dvokanalni rad; jedan modul iste ukupne veličine daje polovinu propusnosti, a time i polovinu brzine.

$ sudo dmidecode -t memory | grep -E 'Size|Locator|Speed' | head -20

Ovo je najjeftinije ubrzanje koje postoji — često je dovoljno prerasporediti module koje već imaš.

Praktični scenariji

Scenario 1: VPS bez kartice, treba klasifikacija tiketa

Model klase 4B na procesoru, kratki odgovori, obrada u paketima. Radi sasvim dobro i ne treba ti ništa više.

Scenario 2: kartica postoji, ali je sve i dalje sporo

Prvo ollama ps. Ako nije sto posto GPU, uzrok je offloading, ne kartica.

Scenario 3: odgovor kreće tek posle dva minuta

Dugačak prompt na procesoru. Prefill je faza koja tu boli. Skrati ulaz ili prebaci na karticu.

Scenario 4: biranje između boljeg procesora i kartice

Kartica, bez razmišljanja, ako je interaktivan rad cilj. Procesor od šest stotina evra ne dostiže polovnu karticu od tri stotine.

Scenario 5: model od 70B, a kartice nema

Na dvokanalnom sistemu računaj oko jedan token u sekundi. Tehnički radi, praktično ne. Uzmi manji model ili idi na API.

Kratka referenca

  • Usko grlo — propusnost memorije, ne broj jezgara
  • Gruba procena — propusnost podeljena veličinom modela
  • DDR5 dvokanalno — oko 80 GB/s
  • Potrošačka kartica — oko 900 GB/s
  • 15 t/s — granica udobnosti za razgovor
  • Prefill — ograničen računom, na procesoru posebno spor
  • Decode — ograničen memorijom, prati odnos propusnosti
  • Offloading — mali deo na procesoru uzima najveći deo vremena
  • ollama ps — kolona PROCESSOR mora pokazati 100% GPU
  • OLLAMA_NUM_THREAD — broj fizičkih jezgara, ne logičkih
  • Memorijski kanali — popunjeni slotovi udvostručuju brzinu
  • MoE na procesoru — bolji nego što veličina nagoveštava

Vežba

  1. Utvrdi tip i broj kanala svoje memorije, pa proceni propusnost sistema.
  2. Za model klase 8B u Q4_K_M izračunaj očekivanu brzinu na procesoru po formuli iz teksta.
  3. Pokreni isti model na procesoru i na kartici i uporedi izmerene vrednosti sa procenom.
  4. Postavi OLLAMA_NUM_THREAD na broj fizičkih jezgara, pa na dvostruko više. Izmeri obe vrednosti.
  5. Nabroj tri zadatka sa svog posla koja bi radila i na osam tokena u sekundi.

Sledeći tekst u serijalu: Instalacija NVIDIA drajvera i CUDA toolkit-a na Linux serveru

Povezano:

Comments

Popular posts from this blog

Početak u Linuxu — šta je i zašto se uči

Konverzija tipova podataka u Pythonu

groupadd