Artikkelin sisältö
Koodausagentti muokkaa tiedostoa ja käynnistää testin. Sen seuraava viesti voi olla yhden rivin mittainen. Viestin taustalla oleva historia on paljon suurempi — ja sen käsittelyyn jo käytetty työ on yhä arvokasta.
Testin aikana GPU palvelee muita. Agentti kuitenkin palaa lähes saman historian kanssa: ohjeet, koodi, päätökset, työkalukutsut ja tulokset. Palvelun täytyy säilyttää historiaa edustava tila, siirtää se toiselle muistitasolle tai laskea se uudelleen.
Kun sama valinta toistuu suuren agenttijoukon kohdalla, muistipula alkaa näyttää erilaiselta. Muisti säilyttää jotakin itseään kalliimpaa: jo tehtyä laskentaa.
Unohtamisen kallis puoli
Transformerin KV-välimuisti sisältää aiempien tokenien avaimet ja arvot, joita attention-mekanismi tarvitsee. Niiden uudelleenkäyttö antaa mallin jatkaa aiemmin tehdystä työstä. Kehotteen välimuistitus ulottaa säästön myös saman alkuosan sisältävien API-kutsujen välille, kuten OpenAI:n dokumentaatio kuvaa.
Tila, joka säilyy tokenien välillä
KUVA 01Kontekstin kasvaessa eri asiat kasvavat eri tahtiin. KV-muistin määrä kasvaa lineaarisesti. Myös esitäytön projektiot ja feed-forward-operaatiot kasvavat lineaarisesti tokenimäärän mukana. Täydessä kausaalisessa attention-mekanismissa tokenit kuitenkin käsittelevät aiempia tokeneita: n tokenin kehote sisältää n(n + 1)/2 kysely–avainparia. Pituuden kaksinkertaistuessa tämän attention-laskennan määrä lähestyy nelinkertaista.
Tämä selittää myös, miksi uudet syötetokenit voivat maksaa vähemmän kuin tuotetut tokenit. Esitäytössä eli prefill-vaiheessa syöte tunnetaan jo, joten GPU voi käsitellä monia tokeneita yhdessä ja käyttää mallipainoja tehokkaasti uudelleen. Generoinnissa jokainen uusi token riippuu aiemmista: malli täytyy suorittaa uudelleen lukien painoja ja kasvavaa KV-välimuistia. Eri käyttäjien pyyntöjen eräkäsittely auttaa, mutta muistikapasiteetti ja vasteaika rajoittavat yhdistettävän työn määrää.
Seurataan nyt agenttia, jonka historia pitenee jatkuvasti. Lisätään aluksi yksi token kutsua kohti, jotta lasku näkyy selvästi. Ilman uudelleenkäyttöä jokainen kutsu laskee koko alkuosansa uudelleen. T kutsun aikana attention-parien määrä on:
Neliöllinen attention-laskenta kasautuu kuutiollisesti, kun kasvava historia lasketaan toistuvasti uudelleen.
KV-välimuistia käytettäessä aiemmat rivit on jo laskettu. Kutsussa t vain uuden tokenin täytyy käsitellä t sijaintia. Saman työnkulun aikana:
Sadan kutsun kohdalla uudelleenlaskenta käyttää 171 700 paria ja uudelleenkäyttö 5 050: 34-kertainen määrä attention-laskentaa. Myös vakiokokoisten tokenilohkojen lisääminen säilyttää kuutiollisen ja neliöllisen kasautuvan kasvun eron. Harva attention ja pakatut arkkitehtuurit voivat muuttaa käyrää; tämä on täyden attention-mekanismin vertailutapaus.
Välimuistista huolimatta yhden tuotetun tokenin attention-kustannus kasvaa lineaarisesti aiemman historian mukana. Välimuisti säästää kaiken vanhan työn toistamiselta. Lineaarisesti kasvava muistimäärä suojaa yhä suurempaa määrää laskentaa.
Unohtaminen muuttaa kasvukäyrän
KUVA 02Pidennä työnkulkua liukusäätimellä. Akselit pysyvät samoina; vaaleat viivat näyttävät koko 200 askeleen vertailun. Uudelleenkäytön käyrä pysyy lähellä nollaa tällä yhteisellä lineaarisella asteikolla.
Pidennä työnkulku 100 askeleesta 200:aan: uudelleenlaskenta vaatii 7,88-kertaisen ja uudelleenkäyttö 3,98-kertaisen attention-laskennan.
Välimuisti, joka katoaa ennen seuraavaa käyttöä
Yhden kontekstin säilyttäminen on suoraviivaista. Kokonaisen joukon pitäminen muistissa on vaikeampaa. Kun agentti A odottaa testiä, B lukee tiedostoa ja C saa selaimen tuloksen. Jokainen tarvitsee oman tilansa uudelleen.
Välimuisti voi tallentaa A:n tilan, poistaa sen B:n ja C:n tieltä ja havaita sitten A:n palanneen. Palvelu joutuu toistamaan juuri hylkäämänsä työn. EfficientAgentin rinnakkaisten koodausagenttien kokeet tutkivat tätä työjoukko-ongelmaa: isäntämuistin välimuistin täytyy kattaa tila, jota agentit käyttävät uudelleen työkalujen odotusaikojen yli.
Toimiva hierarkia käyttää GPU-muistia aktiiviseen attention-laskentaan, isäntämuistia äskettäin käytettyihin konteksteihin ja NVMe-levyjä harvemmin käytettyyn tilaan. NVIDIA Dynamo tukee tällaista porrastusta. Kopio voi olla alemmalla tasolla jo ennen ylemmän kopion poistamista, jolloin GPU-tilan vapauttaminen ei odota uutta kopiointia.
Siirtokustannuksen mittakaavaksi sopii 288 Gt, yhden GPU:n muistikapasiteetti NVIDIAn GB300-vertailualustassa. Sen täyttö kestää oletuksillamme täydestä, tasan jaetusta kaistasta noin 1,5 sekuntia RAM-muistista tai 20 sekuntia NVMe-levyltä. Kapasiteetti ja kaistanleveys voivat palvella yhtä agenttia tai monia.
Isäntämuisti antaa palvelun vapauttaa GPU-muistia hylkäämättä hyödyllistä työtä. Monien lomittain toimivien agenttien joukossa seuraavaa kutsua odottava tila muodostaa itsessään merkittävän resurssin.
Vertaamalla OpenAI:n välimuistisyötteen hinnoittelua laitteiston vuokrakuluihin, joiden vertailukohtana on Verda, edullinen suomalainen hyperskaalaaja, saimme arvioksi noin 2 Mt KV-tilaa tokenia kohti, kun säilytysaika GPU-muistissa on 30 sekuntia ja RAM-muistissa kaksi minuuttia. Pidemmästä säilytysajasta huolimatta välimuistin säilyttäminen RAM-muistissa maksaa vain noin 30 % GPU-muistissa säilyttämisen hinnasta.
Yhden agentin odottaessa muut jatkavat
KUVA 03Säilytä tila seuraavaa kutsua varten
KUVA 04Vähemmän muistitilaa, enemmän päättelyä
KV-tilan pakkaaminen tekee muistamisesta tehokkaampaa. DeepSeekin V4.1-Flash-mallin tekninen raportti kuvaa pakattua globaalia tilaa, kerrosten välistä uudelleenkäyttöä ja alemman tarkkuuden KV-tallennusta sekä menetelmiä, jotka pienentävät isäntämuistissa ja tallennuslaitteilla säilytettävää tilaa. Nämä edistysaskeleet vähentävät sekä hyödyllisen työn säilyttämiseen tarvittavaa tilaa että siirrettävän tilan määrää.
Päättelymallit muuttavat yhtälön toista puolta. Malli voi käsitellä kysymyksen kerran ja käyttää sen jälkeen paljon enemmän aikaa sen ratkaisemiseen ennen vastaamista. Tämä lisätyö tapahtuu prefill-vaiheen jälkeen. Sama syöte voi siis johtaa laskennallisesti paljon kalliimpaan vastaukseen.
Latentti päättelyketju tutkii välivaiheiden suorittamista sisäisten esitysten avulla sen sijaan, että jokainen vaihe ilmaistaisiin tekstinä. Lyhyttä vastausta voi edeltää huomattava määrä sisäistä laskentaa, jolloin näkyvien tokenien määrä kertoo tehdystä työstä entistä vähemmän.
Nämä kehityssuunnat muuttavat muistin ja laskennan välistä tasapainoa. KV-pakkaus vähentää hyödyllisen tilan säilyttämiseen tarvittavaa RAM-muistia, kun taas pidempi päättely kasvattaa tiettyyn kysymykseen vastaamisen laskentakustannusta. Latentti päättely voi muuttaa tätä suhdetta edelleen.
RAM-hintojen noustessa säilytettävän tilan pienentämisestä tulee arvokkaampaa. Kun mallit käyttävät enemmän aikaa päättelyyn, suurempi osa palvelun kustannuksista voi siirtyä laskentaan.
Tasapaino riippuu sekä arkkitehtuurista että muistin ja laskennan suhteellisista hinnoista.