Блог

Агентски кругови со многу слики во рамките на меморијата

Агентски круг во продукција истроши меморија на 952 MB додека исекуваше производи од шест скенови на каталог и ги гледаше своите исечоци. Немаше еден проблем — имаше три. Секој повик до моделот ги праќаше сликите на кругот со полна големина; библиотеката што ја користиме за повикување на моделот ги чуваше сите барања живи до крајот на кругот; а трејсингот на агентската рамка ги чуваше влезовите на секој повик, вклучително и сликите, за цел круг. Ги поправивме сите три: сликите се намалуваат пред да се испратат, а сликите на секој повик се ослободуваат веднаш штом повикот ќе заврши.

Како агентот ги гледа сликите

Кога градите на Mythex, агентот работи во облак sandbox средина на вашиот проект. Може да гледа слики — снимка од екранот што ја прикачувате, макет, датотека во вашиот проект или слика што самиот ја произвел — така што ги праќа до моделот заедно со разговорот.

Круг е сè што агентот прави како одговор на една порака од вас. Во еден круг, агентот го повикува моделот многу пати: размислува, извршува алатка, го гледа резултатот, па пак размислува. Секој од тие повици го праќа разговорот до тој момент, а тоа ги вклучува сликите на кругот, кодирани како текст (base64, што ги прави околу една третина поголеми).

Кругот што падна работеше разумно. Земаше шест скенови на каталог, по околу 2,4 MB секој, исекуваше поединечни производи и повторно ги читаше исечоците за да ги провери. Тоа се многу повици до моделот, а секој носи неколку големи слики.

Причина 1: секој повик ги праќаше сликите со полна големина

Секој повик до моделот го градеше телото на барањето со сликите на кругот во полна големина — околу 20 MB base64 по повик. Телото се составуваше како една низа во меморијата на агентот, па секој повик алоцираше уште околу 20 MB.

Праќањето со полна големина ништо не донесуваше. Моделот сам ги намалува сликите на околу 1.300 пиксели по долгата страна, па дополнителните пиксели само трошат меморија и време за прикачување.

Поправката: намали еднаш, прати мало

  • Сликите поголеми од 400 KB се претвораат во JPEG со најмногу 1.568 пиксели по долгата страна пред да се испратат. Помалите слики се праќаат како што се.
  • Претворањето го користи ImageMagick, кој е во секоја Mythex sandbox средина, и се извршува еднаш по датотека. Круг што ги прикажува истите скенови на секој повик ја користи намалената копија. Кешот е клучен по патеката, големината и времето на промена на датотеката, па изменета датотека повторно се претвора, а има и сопствено ограничување на големината за да не стане самиот причина за полна меморија.
  • Буџетот за слики во еден повик до моделот се намалува од 16 MB на 6 MB.

Истите шест скенови сега чинат 4,4 MB по повик наместо 19,7 MB.

Причина 2: клиентот на моделот никогаш не ослободуваше барање

Големината на секое барање беше само дел од проблемот. Меморијата растеше и од повик до повик. На нашата staging средина, ист вид круг држеше 369 MB жива меморија и по целосно garbage collection — точката каде што сè што е недостижливо е ослободено. Heap мерењето ја покажа целата растење во делот од клиентската библиотека што ги кодира телата на барањата.

Причината беше слушател за прекин. Кога ќе притиснете Stop, сигналот за прекин на кругот се активира, и сите барања што слушаат се откажуваат. Ние му го дававме тој еден сигнал за целиот круг на секое барање. Клиентската библиотека додава „abort“ слушател на било кој сигнал што го добива — и никогаш не го отстранува.

Па секое барање на кругот остануваше достижливо од сигналот на кругот, за цело времетраење на кругот: слушателот, кој го држи контролерот, кој го држи барањето, кое го држи целото тело со неговите слики.

Поправката: по еден сигнал за барање

Секое барање сега добива свој сигнал. Се поврзува со сигналот на кругот само додека тоа барање работи — за стриман одговор, до последниот прочитан дел — и веднаш потоа се одврзува. Stop сепак стигнува до барањето што е во тек, но сигналот на кругот секогаш држи најмногу еден слушател во исто време.

Тестовите ги покриваат сите три дела:

  • По 12 повици, на сигналот на кругот не останува никој слушател. Пред поправката, имаше 12.
  • Преку 15 барања по 8 MB, меморијата останува рамна. Пред тоа растеше за 128 MB.
  • Притискањето Stop сè уште прекинува барање во средината на неговиот стрим.

Причина 3: трејсингот ги чуваше влезовите на секој повик

Heap снимката покажа трет држач: околу 6 MB по повик до моделот. Ова доаѓаше од стриминг на настани во агентската рамка. Таа го бележи секој повик до моделот во кругот како дете на кругот, со влезовите, сè до крајот на кругот. Секоја слика прикачена на секој повик остануваше во меморија заедно со него.

Поправката: испразни ги сликите откако повикот ќе заврши

Сликите се прикачени само на пораките составени за одреден повик до моделот. Никогаш не се чуваат во зачуваната состојба на разговорот. Затоа, откако повикот ќе заврши, безбедно е да се испразнат податоците од сликите во тие пораки. Трејсот го задржува текстуалниот запис за повикот; пикселите се бришат.

Една подробност беше важна: сликите мора да се испразнат на место. Трејсерот може да ги достигне истите податоци за слики преку повеќе од една референца на порака, па замена со нова, празна листа би го оставила оригиналот — со пиксели и сè — достижлив. Зачуваната состојба на разговорот никогаш не се менува.

Тест го извршува графот на агентот под истиот стриминг на настани со слика од 4 MB на секој повик. Без поправката, меморијата растеше за 77 MB преку 16 повици. Со неа, меморијата останува рамна.

Што научивме

  • Проблемите со меморија може да имаат слоеви. Три одделни причини држеа слики предолго, и сите три мораа да се отстранат за кругот да остане во меморијата.
  • Сè што му го дадете на библиотека може да се задржи. И сигналот и трејсот го надживеаја повикот на кој му беа дадени. Кога меморијата расте по повик, погледнете кои долгорочни објекти ги допира повикот.
  • Не праќајте она што другата страна го фрла. Пикселите што моделот и онака би ги отфрлил ни чинеа меморија на секој повик.
  • Тестирајте ја меморијата директно. Секоја поправка доаѓа со тест што мери раст на heap или број на слушатели, па регресијата се појавува како број, а не како рушење.

Ова е втората приказна за меморија од агентот за кратко време; првата беше етикета за напредок испратена 41.000 пати. Ако сакате да знаете повеќе за тоа што е агентот и како работи, погледнете го нашиот водич за AI агенти и документацијата за чатот.

Mythex · Pricing · Градете што било со AI · Шаблони за веб-страници и апликации · Mythex во споредба · Речник за градење апликации со AI · Бесплатни алатки за градење апликации со AI · 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 Íslenska 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 简体中文 繁體中文(香港) 繁體中文(台灣)