Pildirohkete agendikäikude hoidmine mälu piires
Üks agendikäik tootmises jooksis mälust välja 952 MB juures, kui lõikas kuue kataloogi skaneeringu pealt välja tooteid ja vaatas oma väljalõikeid üle. Ühte lekkekohta ei olnud — neid oli kolm. Iga mudelikutse saatis käigu pildid täissuuruses kaasa; teek, mida kasutame mudeli kutsumiseks, hoidis iga päringu elus kuni käigu lõpuni; ja agendiraamistiku jälgimine hoidis iga kutse sisendeid, sealhulgas pilte, terve käigu jooksul. Parandasime kõik kolm: pilte vähendatakse enne saatmist ja iga kutse pilte vabastatakse kohe, kui kutse on lõppenud.
Kuidas agent pilte näeb
Mythexis töötab agent sinu projekti pilvesandboxis. Ta saab vaadata pilte — sinu manustatud ekraanipilti, mudelit, failit projektis või pilti, mille ta ise just tootis — saates need mudelile koos vestlusega.
Käik on kõik, mida agent teeb ühe sinu sõnumi peale. Käigu jooksul kutsub agent mudelit mitu korda: mõtleb, käivitab tööriista, vaatab tulemust ja mõtleb uuesti. Iga kutse saadab senise vestluse, sealhulgas käigu pildid tekstina kodeeritult (base64, mis teeb need umbes kolmandiku võrra suuremaks).
Käik, mis kokku jooksis, tegi midagi mõistlikku. See võttis kuus kataloogi skaneeringut, umbes 2,4 MB tükk, lõikas neist välja üksikud tooted ja luges oma väljalõikeid tagasi, et neid kontrollida. See oli palju mudelikutseid, millest igaüks kandis mitut suurt pilti.
Põhjus 1: iga kutse saatis pilte täissuuruses
Iga mudelikutse ehitas oma päringu keha uuesti, pildid täissuuruses — umbes 20 MB base64 igas kutses. Päringu keha koostati agendi mälus ühe stringina, nii et iga kutse eraldas veel ~20 MB.
Täissuuruses saatmisest ei olnud isegi kasu. Mudel vähendab pildid ise umbes 1300 pikslini pika külje järgi, nii et lisapikslid kulutasid ainult mälu ja üleslaadimisaega.
Parandus: vähenda üks kord, saada väikesena
- Üle 400 KB pilte teisendatakse JPEG-iks, mille pikim külg on kuni 1568 pikslit, enne saatmist. Väiksemad pildid lähevad nagu on.
- Teisendus kasutab ImageMagick-i, mis on igas Mythexi sandboxis, ja jookseb üks kord faili kohta. Käik, mis näitab samu skaneeringuid igal kutsel, kasutab ära juba vähendatud koopiat. Vahemälu võtmeks on faili tee, suurus ja muutmisaeg, nii et muudetud fail teisendatakse uuesti, ning sellel on oma suuruspiir, et see ei saaks ise mälu täita.
- Ühe mudelikutse piltide eelarve langeb 16 MB-lt 6 MB-le.
Samad kuus skaneeringut maksavad nüüd 4,4 MB kutse kohta, mitte 19,7 MB.
Põhjus 2: mudeliklient ei lasknud päringut kunagi lahti
Iga päringu suurus oli vaid osa probleemist. Mälu kasvas ka kutse kaupa. Meie staging-keskkonnas hoidis sama tüüpi käik 369 MB elavat mälu isegi pärast täielikku prügikoristust — punkti, kus kõik kättesaamatu on vabastatud. Heap-proovid näitasid, et kogu kasv oli mudeliklienditeegi osas, mis kodeerib päringukehi.
Põhjuseks oli katkestuskuulaja. Kui vajutad Stop, käivitub käigu katkestussignaal ja iga päring, mis sellele kuulab, tühistub. Me andsime iga päringule edasi ühe, kogu käigu hõlmava signaali. Mudeliklienditeek lisab signaalile „abort“-kuulaja ja ei eemalda seda kunagi.
Nii jäi iga käigu päring kättesaadavaks käigu signaalist, kogu aeg kuni käik kestis: kuulaja, mis hoidis kontrollerit, mis hoidis päringut, mis hoidis kogu päringukeha koos piltidega.
Parandus: üks signaal päringu kohta
Iga päring saab nüüd oma signaali. See seotakse käigu signaaliga ainult siis, kui päring käib — voogedastatud vastuse puhul kuni viimase tüki lugemiseni — ja seotus eemaldatakse kohe pärast. Stop jõuab ikka veel igasse töös olevasse päringusse, aga käigu signaalil on korraga ainult üks kuulaja.
Testid katavad kõiki kolme osa:
- Pärast 12 kutset ei jää käigu signaalile ühtegi kuulajat alles. Enne parandust oli neid 12.
- 8 MB suuruste päringute 15 kutse jooksul jääb mälu lamedaks. Enne kasvas see 128 MB võrra.
- Stop katkestab endiselt päringu, mis on voo keskel.
Põhjus 3: jälgimine hoidis iga kutse sisendeid
Heap-pilt näitas kolmandat hoidjat: umbes 6 MB kutse kohta. See tuli agendiraamistiku sündmuste voogedastusest. See salvestab iga mudelikutse käigus lapseks käigule, sisendid kaasa arvatud, kuni käik lõpeb. Iga kutse iga pilt jäi koos sellega mällu.
Parandus: tühjenda pildid pärast kutse lõppu
Pilte kasutatakse ainult konkreetse mudelikutse jaoks koostatud sõnumites. Neid ei salvestata vestluse olekusse. Seega, kui kutse on tagasi tulnud, on ohutu tühjendada piltide andmed nendes sõnumites. Jälg hoiab tekstilist kirjet kutsest; pikslid lähevad.
Üks detail oli oluline: pilte tuleb tühjendada kohapeal. Jälgija võib jõuda samade pildiandmeteni sõnumi mitme viite kaudu, seega uue, tühja listi asendamine jätaks originaali — koos pikslitega — ikka kättesaadavaks. Vestluse salvestatud olekut ei muudeta kunagi.
Test käivitab agendi graafi samas sündmuste voogedastuses, kus igal kutsel on 4 MB pilt. Ilma parandusega kasvas mälu 16 kutse jooksul 77 MB võrra. Parandusega jääb mälu lamedaks.
Mida sellest õppisime
- Mälu probleemid võivad tulla kihtidena. Kolm eraldi põhjust hoidsid pilte liiga kaua ja kõik kolm tuli kõrvaldada, enne kui käik mälu piires püsis.
- Kõike, mida annad teeki, võidakse hoida. Signaal ja jälg elasid kauem kui kutsed, millele nad anti. Kui mälu kasvab kutse kaupa, vaata, milliseid pikaealisi objekte kutse puudutab.
- Ära saada seda, mida teine pool niikuinii ära viskab. Pikslid, mida mudel niikuinii eemaldaks, maksid meile mälu igal kutsel.
- Testi mälu otse. Iga parandus tuli testiga, mis mõõdab heap-kasvu või kuulajate arvu, nii et regressioon ilmub numbrina, mitte krahhina.
See on teine mälu lugu agendi kohta lühikese aja jooksul; esimene oli edenemisolekut, mis saatis 41 000 korda uuesti. Kui tahad teada, mis agent on ja kuidas ta töötab, vaata meie juhendit tehisintellekti agentidest ja vestluse dokumentatsiooni.