Blogg

Að halda myndaþungum lotum agentsins innan minnisins

Lota agentsins í framleiðslu keyrði út úr minni við 952 MB þegar hann klippti vörur út úr sex skönnuðum vörulistasíðum og skoðaði klippurnar sínar. Það var ekki einn leki — þeir voru þrír. Hvert kall í líkanið sendi myndir lotunnar aftur í fullri stærð; biðlarasafnið sem við notum til að kalla í líkanið hélt hverri beiðni á lífi þar til lotunni lauk; og rakning (tracing) í agentaramma geymdi inntak hvers kalls, myndir meðtaldar, alla lotuna. Við löguðum allt þrennt: myndir eru minnkaðar áður en þær eru sendar, og myndir hvers kalls eru látnar lausar um leið og kallinu lýkur.

Hvernig agentinn sér myndir

Þegar þú smíðar á Mythex vinnur agentinn inni í skýjasandkassa verkefnisins þíns. Hann getur skoðað myndir — skjámynd sem þú hengir við, hönnunarmynd, skrá í verkefninu þínu, eða mynd sem hann hefur sjálfur búið til — með því að senda þær í líkanið ásamt samtalinu.

Lota (turn) er allt sem agentinn gerir til að svara einum skilaboðum frá þér. Innan lotu kallar agentinn í líkanið oft: hugsar, keyrir verkfæri, skoðar niðurstöðuna og hugsar aftur. Hvert kall sendir samtalið hingað til, og þar eru myndir lotunnar, skráðar sem texti (base64, sem gerir þær um þriðjungi stærri).

Lotan sem hrundi var að gera eitthvað eðlilegt. Hún tók sex vörulistaskannanir, um 2,4 MB hver, klippti einstakar vörur úr þeim og las klippurnar aftur til að athuga þær. Það eru mörg kall í líkanið, hvert með nokkrar stórar myndir.

Orsök 1: hvert kall sendi myndir aftur í fullri stærð

Hvert kall í líkanið byggði beiðnina upp aftur með myndum lotunnar í fullri stærð — um 20 MB af base64 í hverju kalli. Beiðnin er byggð sem einn strengur í minni agentsins, svo hvert kall úthlutaði öðrum ~20 MB.

Að senda fulla stærð skilaði engu. Líkanið minnkar myndir sjálft í um 1.300 pixla lengstu hlið, svo auka pixlarnir kostuðu bara minni og upphleðslutíma.

Lagfæringin: minnka einu sinni, senda lítið

  • Myndir yfir 400 KB eru nú breyttar í JPEG með mest 1.568 pixla lengstu hlið áður en þær eru sendar. Smærri myndir fara óbreyttar.
  • Breytingin notar ImageMagick, sem fylgir öllum Mythex-sandkössum, og keyrir einu sinni fyrir hverja skrá. Lota sem sýnir sömu skannanir í hverju kalli notar minnkaða afritið aftur. Skyndiminnið er lykilað með slóð skráarinnar, stærð og breytingartíma, svo breytt skrá er breytt aftur, og það hefur sín eigin stærðarmörk svo það geti ekki orðið það sem fyllir minnið.
  • Myndabúnaður fyrir eitt kall í líkaninu fer úr 16 MB í 6 MB.

Sömu sex skannanir kosta nú 4,4 MB á kall í stað 19,7 MB.

Orsök 2: biðlarinn í líkaninu sleppti aldrei beiðni

Stærð hverrar beiðni var aðeins hluti vandans. Minnið óx líka kall af kalli. Á staging-umhverfinu okkar hélt sams konar lota 369 MB af lifandi minni jafnvel eftir fulla sorphreinsun — punktinn þar sem allt sem er óaðgengilegt hefur verið losað. Hauggreining setti allan vöxtinn í þann hluta biðlarasafns líkansins sem kóðar beiðnabúkana.

Orsökin var hlustandi á lokunarmerki (abort). Þegar þú ýtir á Stöðva fer lokunarmerki lotunnar af stað og hver beiðni sem hlustar á það hættir við. Við gáfum öllum beiðnum eitt merki fyrir alla lotuna. Biðlarasafnið bætir „abort“-hlustanda við hvaða merki sem það fær — og fjarlægir hann aldrei.

Svo hver beiðni lotunnar hélst aðgengileg frá merki lotunnar, meðan lotan stóð yfir: hlustandinn, sem hélt stýringunni, sem hélt beiðninni, sem hélt allan beiðnabúkinn með myndunum.

Lagfæringin: eitt merki á hverja beiðni

Hver beiðni fær nú sitt eigið merki. Það er tengt við merki lotunnar aðeins meðan sú beiðni er í gangi — fyrir streymt svar, þar til síðasti hluti hefur verið lesinn — og aftengt strax á eftir. Stöðva nær enn til beiðninnar sem er í gangi, en merki lotunnar heldur aðeins einum hlustanda í einu.

Prófin ná yfir alla þrjá hlutana:

  • Eftir 12 köll eru engir hlustendur eftir á merki lotunnar. Fyrir lagfæringuna voru þeir 12.
  • Yfir 15 beiðnir með 8 MB hver er minnið stöðugt. Áður óx það um 128 MB.
  • Að ýta á Stöðva lokar enn beiðni sem er mitt í streymi sínu.

Orsök 3: rakning geymdi inntak hvers kalls

Haugmynd (heap snapshot) sýndi þriðja haldarann: um 6 MB haldið fyrir hvert líkankall. Þetta kom úr straumun atburða í agentaramma. Hún skráir hvert líkankall í lotu sem barn lotunnar, inntök meðtalin, þar til lotunni lýkur. Hver mynd sem var hengd við hvert kall hélst í minni með því.

Lagfæringin: tæma myndirnar um leið og kallið skilar

Myndir eru aðeins festar við skilaboðin sem eru smíðuð fyrir ákveðið líkankall. Þær eru aldrei geymdar í vistuðu ástandi samtalsins. Þegar kall hefur skilað er því óhætt að tæma myndagögnin í þessum skilaboðum. Rakningin geymir textaskrá af kallinu; pixlarnir fara.

Eitt atriði skipti máli: myndirnar þarf að tæma á sínum stað. Rakningin getur náð í sömu myndagögnin í gegnum fleiri en eina tilvísun á skilaboðunum, svo ef við skiptum út fyrir nýjan, tóman lista væri upprunalega — pixlar og allt — enn aðgengileg. Vistað ástand samtalsins er aldrei breytt.

Prófið keyrir graf agentsins undir sömu atburðastraumun með 4 MB mynd á hverju kalli. Án lagfæringarinnar óx minnið um 77 MB yfir 16 köll. Með henni er minnið stöðugt.

Það sem við lærðum

  • Minnisvandamál geta komið í lögum. Þrjár aðskildar orsakir héldu myndum of lengi, og allar þrjár þurftu að fara til að lotan héldi sig innan minnisins.
  • Allt sem þú afhendir bókasafni getur verið geymt. Merki og rakning lifðu báðar lengur en köllin sem þeim var afhent. Þegar minnið vex fyrir hvert kall, skoðaðu hvaða langlífu hluti kallið snertir.
  • Ekki senda það sem hinum aðilanum er sama um. Pixlar sem líkanið hefði hent hvort sem er kostuðu okkur minni í hverju kalli.
  • Prófaðu minnið beint. Hver lagfæring fylgdi með prófi sem mælir vöxt haugsins eða fjölda hlustenda, svo afturför birtist sem tala, ekki hrun.

Þetta er önnur minnissagan frá agentinum á stuttum tíma; sú fyrsta var framvindumerki sem var sent aftur 41.000 sinnum. Ef þú vilt vita meira um hvað agentinn er og hvernig hann virkar, sjáðu leiðbeininguna okkar um gervigreindarfulltrúa og spjallskjölin.

Mythex · Pricing · Smíðaðu hvað sem er með gervigreind · Sniðmát fyrir vefsíður og forrit · Mythex í samanburði · Orðasafn um forritasmíði með gervigreind · Ókeypis verkfæri fyrir forritasmíði með gervigreind · English

English አማርኛ العربية Български বাংলা Bosanski Català Čeština Dansk Deutsch Ελληνικά Español Español (España) Eesti فارسی Suomi Français Français (Canada) ગુજરાતી हिन्दी Hrvatski Magyar Հայերեն Bahasa Indonesia Italiano 日本語 ქართული Қазақ тілі ಕನ್ನಡ 한국어 Lietuvių Latviešu Македонски മലയാളം Монгол मराठी Bahasa Melayu မြန်မာ Norsk bokmål Nederlands ਪੰਜਾਬੀ Polski Português (Brasil) Português (Portugal) Română Русский Slovenčina Slovenščina Soomaali Shqip Srpski Svenska Kiswahili தமிழ் తెలుగు ไทย Tagalog Türkçe Українська اردو Tiếng Việt 简体中文 繁體中文(香港) 繁體中文(台灣)