GPT-OSS prvog dana
Podrška za GPT-OSS na H200 nultog dana prilagodbom ROSE-a s FP8, ponorom pažnje i MoE optimizacijama
Perplexity je posvećen stavljanju najboljih AI modela na raspolaganje znatiželjnim korisnicima koji zahtijevaju točne i pouzdane odgovore te radnje agenata. OpenAI je nedavno najavio svoje modele s otvorenim težinama (gpt-oss-20b i gpt-oss-120b). Kao i s mnogim vodećim modelima, Perplexity je među prvim organizacijama koje procjenjuju gpt-oss-20b i gpt-oss-120b.
U ovom postu dijelimo odluke o infrastrukturi našeg vlastitog stoga za inferenciju koji je omogućio podršku za nulti dan (Day-0). Fokusiramo se na posluživanje ovih modela na NVIDIA H200 GPU-ovima, detaljno opisujući promjene jezgri (kernel), izbore primjene i kompromise između brzine i cijene.
GPT-OSS na Hopperu
Modeli s otvorenim težinama isporučuju se s MXFP4 kvantizacijom, što im pomaže da stanu u memoriju na hardveru potrošačke klase ili ostvare vršnu propusnost na NVIDIA Blackwellu. Međutim, za početnu procjenu htjeli smo ih pokrenuti na postojećim H200 Hopper klasterima uz minimalne promjene mehanizma za inferenciju. Hopper nema namjenske FP4 tenzorske jezgre, koje je uveo Blackwell. Posljedično, odlučili smo posluživati modele s FP8 preciznošću umjesto toga kako bismo smanjili potrebu za prilagođenim jezgrama i najbolje iskoristili dostupni hardver.
Na visokoj razini, transformerski jezični modeli (LLM) strukturno su jednostavni:
Ulazno ugrađivanje (embedding)
Slijed transformerskih slojeva. Svaki sadrži blok pažnje i gusti MLP ili rijetki MoE blok.
Projekcija izlaznih logita
Kada pokrećemo novi transformerski model, prvenstveno nas zanima u kojoj mjeri odgovaraju postojećim modelima kako bismo identificirali potrebne promjene. OpenAI je ljubazno unaprijed podijelio pregled svojih modela, omogućujući nam da u skladu s tim prilagodimo našu postavku inferencije. Utvrdili smo da model doista zahtijeva priličan broj malih promjena.
Pažnja: GQA s ponorima pažnje (Attention Sinks)
Svaka glava pažnje ima unaprijed istrenirani parametar ponora (sink) koji se uzima u obzir u Softmaxu
YaRN pozicijsko kodiranje, slično kao kod DeepSeek-V3
QKV projekcije imaju pomake (biases), slično kao Qwen 2
Izlazna projekcija ima pomak
MLP: rijetka mješavina stručnjaka (Sparse Mixture-of-Expert - MoE)
SwiGLU aktivacijska funkcija, drugačija od većine modela s otvorenim težinama
Softmax nakon Top-K za stručne težine
Stručnjaci imaju pomake
Očekujući da će broj parametara biti oko 100B-200B, odlučili smo:
Proširiti FlashInfer za podršku ponorima pažnje
Ponovno upotrijebiti MoE implementaciju već izrađenu za obitelj modela DeepSeek-V3
Odabrati FP8 128x128 blok skaliranje kao shemu kvantizacije, proširujući DeepGEMM jezgre kako bi podržale izraz s pomakom.
Vlastiti mehanizam za inferenciju
Naše napore oko inferencije podržava naš vlastiti mehanizam za inferenciju, ROSE. Razvijamo ROSE u fleksibilan okvir koji omogućuje brzo pokretanje novih modela. Osim toga, jednom kada se obvežemo na posluživanje modela u velikom mjerilu, pruža platformu za optimizaciju i povećanje performansi kako bi se dosegnula vrhunska razina.
ROSE izlaže LLM mehanizam koji može učitati model i generirati dekodirane tokene za njega putem višestrukih dekodera, uključujući spekulativne i MTP dekodere. Sami se modeli sastoje od prilagođenog skupa slojeva koji podržavaju različite postavke konfiguracije za kvantizaciju i paralelizam. Ispod slojeva, on objedinjuje i Triton i CUDA jezgre koje učinkovito implementiraju i stapaju izračune koje izvode pojedinačni slojevi.
ROSE je prvenstveno izrađen u Pythonu i oslanja se na PyTorch za definicije modela. Iako nam Python omogućuje fleksibilnost i prilagodbu novim modelima, većinu komponenti osjetljivih na performanse, poput posluživanja i raspoređivanja serija, migriramo na Rust.
Da bismo pokrenuli novi model, najprije definiramo hijerarhiju modela i gradimo pretvarač težina za njega. Nakon što se obuhvate sve težine, definiramo prosljeđivanje unaprijed (forward pass) za najjednostavniji slučaj upotrebe TP=1 i osiguravamo da radi od kraja do kraja. Konačno, implementiramo i testiramo podršku za različite oblike paralelizma prije nego što izdamo novi kontejner i primijenimo model na klasteru za procjenu. Zatim ponavljamo poboljšanja performansi, oslanjajući se na povratne informacije s nadzornih ploča i detaljnijih računalnih mjerenja (benchmarka).
ROSE radi s numeričkim tokenima, uz malo poznavanja formata za chat izvan integracijskih testova. U isto vrijeme, morali smo istražiti prilagodbu okolne infrastrukture kako bismo podržali Harmony tokenizator i ispravno preslikali zahtjeve na ulazne nizove tokena.
S GPT OSS modelom otkrili smo da nisu potrebne nikakve promjene na našim dekoderima, CUDA grafnim alatima ili okolnoj infrastrukturi, što nam je omogućilo da usredotočimo svoje napore na prilagođavanje jezgara koje podržavaju model.
Jezgre za GPT-OSS
Pažnja s ponorom (Sink Attention)
Pažnja s ponorom uvodi dodatni faktor pomaka prije Softmaxa, akumuliran s produktom Q i K:
attn = softmax(q @ k^T * sm_scale + sink) * VIako je naivna implementacija prilično trivijalna, učinkovite implementacije pažnje, kao što je FlashInfer, paraleliziraju izračun pažnje preko neovisnih glava i preko duljine KV niza. Dodatno, radi numeričke stabilnosti, Softmax se izračunava online uz istovremeno oduzimanje maksimalnog elementa radi numeričke stabilnosti:
softmax(x) = e^x / sum(e^x) = e ^ (x - max(x)) / sum(e ^ (x - max(x))Online implementacija pratila je tekući maksimum m inicijaliziran na -inf i skalu d na 1. Inicijalizacijom maksimuma na vrijednost ponora trenutne glave, osigurali bismo da se ispravno akumulira u Softmax. Morali smo voditi računa o tome da se ovaj maksimum uključi samo u prvi dio ako je pažnja bila podijeljena na više blokova duž duljine niza.
Prilagodili smo predložak FlashInfer FA2 jezgre, koji se koristi i za prethodno popunjavanje (prefill) i za dekodiranje, tako da uključuje parametre ponora.
MoE
Glavna razlika između MoE sloja različitih modela obično je shema usmjeravanja. Očekujući značajnu varijabilnost, ROSE implementira ovu jezgru u Tritonu, što nam omogućuje jednostavnu prilagodbu novim modelima. U slučaju GPT-OSS-a, morali smo prilagoditi bodovanje težina kako bismo izvršili Softmax samo preko Top-K odabranih stručnjaka, za razliku od nekih modela u stilu DeepSeek-a koji izračunavaju Softmax preko svih stručnjaka. Utvrdili smo da je za točnost ključno izračunati težine stručnjaka u bfloat16 preciznosti.
Izazov s MoE slojem bio je zbog naše odluke da ponovno upotrijebimo postojeće DeepGEMM jezgre, kojima je nedostajala podrška za izraze s pomakom. Srećom, s vremenom smo se duboko integrirali s njima, izvršivši promjene kako bismo ih bolje povezali s našim prilagođenim all-to-all dispečerskim jezgrama. Dodali smo podršku za pomake u DeepGEMM inicijalizacijom WGMMA akumulatorskih registara na vrijednosti pomaka učitane iz memorije. Ovo je jednokratni postupak tijekom obrade MN bloka, stoga je trošak vjerojatno zanemariv, a L2 predmemorija osigurava učinkovit pristup tim vrijednostima.
Budući da ovi modeli nemaju izravne koristi od paralelizma podataka, ponovno smo upotrijebili dispečerske i kombinirajuće jezgre koje koriste samo TP. Ulazi u dispečer replicirani su preko svih rangova, stoga dispečer odabire tokene za lokalno dostupne stručnjake. Kombiniranje (Combine) obavlja ponderiranu akumulaciju preko NVLink-a.
Poboljšanja performansi
Iako nam je cilj bio brzo pokrenuti modele, željeli smo osigurati da je izvedba i dalje razumna. Nakon što smo provjerili ispravnost prema referentnoj implementaciji koju je pružio OpenAI, profilirali smo našu implementaciju koristeći zadani PyTorch profiler, pazeći na dodjele blokova i niti kroz kernelle. Funkcionalnost koju smo ponovno upotrijebili bila je izrađena za modele koji su imali veću skrivenu dimenziju od 7168, znatno veću od 2880 u modelima GPT-OSS. Specijalizirali smo pokretače kernela kako bismo odabrali bolje dimenzije grida, čime smo znatno povećali propusnost.
Tokenizacija i kanali
Harmonyjev format chata ima nekoliko važnih koncepata za strukturiranje razgovora, sadržaja rasuđivanja i poziva funkcija. U ovom formatu svaka poruka se sastoji od zaglavlja i sadržaja:
<|start|>{header}<|message|>{content}<|end|>Zaglavlje nosi metapodatke — najvažnije ulogu (sustav, programer, korisnik, pomoćnik, alat), kanal i primatelja kao što je to=functions.<function-name> prilikom pozivanja alata.
Kanali (kao što su analiza, komentari i konačni odgovor) čine izlaze modela transparentnijima i segmentiranijima. Budući da format nameće ovu odvojenost, model može transparentno razmišljati (i biti pregledan radi otklanjanja pogrešaka) bez curenja lanca misli u produkciju. Oznake primatelja (to= zaglavlja) točno govore izvođenju koji bi glumac trebao primiti sljedeći teret — bilo da je to funkcija, sam model ili krajnji korisnik.
Naš mehanizam za inferenciju ROSE je neovisan o formatu. On prima seriju ulaznih tokena i vraća izlazne tokene strujanjem. U našem stogu za inferenciju, zadatak formatiranja ulaza u tokenizirani upit i raščlanjivanja rezultata LLM-a natrag u strukturirane poruke rješava namjenska prednja uslužna usluga JSON API-ja. Integrirali smo Harmony dodavanjem novog priključivog formatera/parsera u ovo sučelje, dopuštajući pozadinskom sustavu da ostane nepromijenjen dok prednje sučelje uredno upravlja pravilima formata chata, pozivima alata i strujanjem. Ova odvojenost briga održava arhitekturu modularnom, omogućujući brzo usvajanje novih formata i značajki odgovora uz minimalne promjene u pozadini.
Troškovi i performanse
S obzirom na relativno malu veličinu GPT-OSS modela, ograničavamo primjenu replike na jedan čvor kako bismo izbjegli režijske troškove komunikacije između čvorova. Naša implementacija podržava fleksibilne kombinacije paralelizma stručnjaka (EP), paralelizma podataka (DP) i tenzorskog paralelizma (TP). Kako bismo utvrdili optimalnu postavku primjene, izmjerili smo sve kombinacije strategija dijeljenja (sharding) u rasponu veličina serija od 1 do 128. Zahvaljujući razdvajanju prethodnog popunjavanja i dekodiranja (Prefill-Decode Disaggregation), u mogućnosti smo zasebno raspravljati o kompromisu između performansi i troškova za prethodno popunjavanje i dekodiranje.
Za procjene troškova pretpostavljamo nominalnu tržišnu cijenu H200 od 3,00 USD/sat (napomena: ovo nije naša stvarna cijena GPU-a).
Otkrili smo da postavljanje batch_size=1 i DP=1 daje najbolje performanse prethodnog popunjavanja. Različite TP konfiguracije tada pružaju različite kompromise između latencije prvog tokena i cijene. Tablice u nastavku prikazuju latenciju prethodnog popunjavanja i trošak po milijunu ulaznih tokena za različite konfiguracije i ulazne duljine.
GPT-OSS 120B:
Ulazna duljina | 8192 | 32768 | 65536 | 128000 |
EP1 DP1 TP1 | 0,364 s, 0,037 USD | 2,421 s, 0,062 USD | 7,375 s, 0,094 USD | 23,902 s, 0,156 USD |
EP2 DP1 TP2 | 0,190 s, 0,039 USD | 1,245 s, 0,063 USD | 3,786 s, 0,096 USD | 12,116 s, 0,158 USD |
EP4 DP1 TP4 | 0,165 s, 0,067 USD | 0,900 s, 0,092 USD | 2,449 s, 0,125 USD | 7,165 s, 0,187 USD |
EP8 DP1 TP8 | 0,179 s, 0,145 USD | 0,839 s, 0,171 USD | 2,003 s, 0,204 USD | 5,119 s, 0,267 USD |
GPT-OSS 120B latencija prefilla i cijena po milijunu ulaznih tokena prema konfiguraciji paralelizma i duljini ulaza.
GPT-OSS 20B:
Ulazna duljina | 8192 | 32768 | 65536 | 128000 |
EP1 DP1 TP1 | 0,239 s, 0,024 USD | 1,610 s, 0,041 USD | 4,895 s, 0,062 USD | 16,037 s, 0,104 USD |
EP2 DP1 TP2 | 0,127 s, 0,026 USD | 0,833 s, 0,042 USD | 2,522 s, 0,064 USD | 8,143 s, 0,106 USD |
EP4 DP1 TP4 | 0,108 s, 0,044 USD | 0,593 s, 0,060 USD | 1,616 s, 0,082 USD | 4,766 s, 0,124 USD |
EP8 DP1 TP8 | 0,116 s, 0,094 USD | 0,547 s, 0,111 USD | 1,310 s, 0,133 USD | 3,365 s, 0,175 USD |
GPT-OSS 20B latencija prefilla i cijena po milijunu ulaznih tokena prema konfiguraciji paralelizma i duljini ulaza.
Za dekodiranje otkrili smo da je EP4 DP1 TP4 najbolja konfiguracija za većinu slučajeva. Četiri grafikona u nastavku prikazuju kompromis između brzine dekodiranja i troška po milijunu izlaznih tokena za modele od 120B i 20B pri duljinama nizova od 8192 i 32768.
Također smo razmotrili korištenje manjeg modela od 20B kao nacrta modela za spekulativno dekodiranje za veći model od 120B. Međutim, budući da je broj aktiviranih parametara sličan (3B naspram 5B), rezultirajuća ubrzanja bila su zanemariva.
Reference
Razdvojeno prethodno popunjavanje i dekodiranje (Disaggregated Prefill and Decode)
Ubrzavanje Sonara kroz spekulaciju
Manja latencija i veća propusnost s višekôvnom primjenom DeepSeek-a
Učinkovita i prenosiva komunikacija mješavine stručnjaka (Mixture-of-Experts)
FlashInfer: Učinkovit i prilagodljiv mehanizam pažnje za posluživanje LLM inferencije
Učinkoviti modeli protočnih jezika s ponorima pažnje (Attention Sinks)
Tehničko izvješće za DeepSeek-V3
Format odgovora OpenAI Harmony | OpenAI Cookbook
Citiranje
@online{perplexity2025GptOssOnDay0,
author = {{Perplexity} and Nandor Licker and Lequn Chen and Vladimir Zaytsev and Kevin Hu and Lauren Kolm and Jesse Dwyer},
title = {{GPT-OSS on day 0}},
date = {2025-08-08},
url = {https://www.perplexity.ai/hub/blog/gpt-oss-on-day-0}
}