చిత్రాలతో నిండిన ఏజెంట్ టర్న్లను మెమరీలో ఉంచడం
ఉత్పత్తిలో ఒక ఏజెంట్ టర్న్ ఆరు కేటలాగ్ స్కాన్ల నుండి ఉత్పత్తులను కత్తిరించి, కత్తిరించిన భాగాలను చూస్తున్నప్పుడు 952 MB వద్ద మెమరీ అయిపోయింది. అది ఒకే లీక్ కాదు — మూడు ఉన్నాయి. మోడల్కు ప్రతి కాల్ చిత్రాలను పూర్తి పరిమాణంలో మళ్లీ పంపింది; మోడల్ను కాల్ చేయడానికి మేము వాడే లైబ్రరీ ప్రతి అభ్యర్థనను టర్న్ ముగిసే వరకు సజీవంగా ఉంచింది; మరియు ఏజెంట్ ఫ్రేమ్వర్క్ యొక్క ట్రేసింగ్ ప్రతి కాల్ ఇన్పుట్లను, చిత్రాలతో సహా, టర్న్ మొత్తం వరకు ఉంచింది. మూడింటినీ సరిచేశాం: చిత్రాలను పంపే ముందు చిన్నవిగా చేస్తాం, మరియు ప్రతి కాల్ చిత్రాలు ఆ కాల్ పూర్తవగానే విడుదల చేయబడతాయి.
ఏజెంట్ చిత్రాలను ఎలా చూస్తుంది
Mythex పై నిర్మించినప్పుడు, ఏజెంట్ మీ ప్రాజెక్ట్ యొక్క క్లౌడ్ సాండ్బాక్స్ లోపల పనిచేస్తుంది. అది చిత్రాలను చూడగలదు — మీరు జత చేసిన స్క్రీన్షాట్, ఒక మాక్అప్, మీ ప్రాజెక్ట్లోని ఒక ఫైల్, లేదా అది స్వయంగా సృష్టించిన చిత్రం — వాటిని సంభాషణతో పాటు మోడల్కు పంపడం ద్వారా.
టర్న్ అంటే మీ ఒక సందేశానికి ప్రతిస్పందనగా ఏజెంట్ చేసే ప్రతిదీ. ఒక టర్న్ లోపల, ఏజెంట్ మోడల్ను అనేకసార్లు కాల్ చేస్తుంది: ఆలోచించడం, ఒక టూల్ నడపడం, ఫలితం చూడటం, మళ్లీ ఆలోచించడం. ప్రతి కాల్ ఇప్పటివరకు ఉన్న సంభాషణను పంపుతుంది, మరియు అందులో ఆ టర్న్ చిత్రాలు కూడా ఉంటాయి, టెక్స్ట్గా ఎన్కోడ్ చేయబడి (base64, అది దాదాపు మూడో వంతు పెద్దది చేస్తుంది).
ఆ క్రాష్ అయిన టర్న్ సహేతుకమైన పనే చేస్తోంది. ఆరు కేటలాగ్ స్కాన్లు, ఒక్కొక్కటి దాదాపు 2.4 MB, తీసుకుని, వాటి నుండి ఒక్కో ఉత్పత్తిని కత్తిరించి, కత్తిరించినవాటిని తనిఖీ చేయడానికి మళ్లీ మళ్లీ చదువుతోంది. అది అనేక మోడల్ కాల్స్, ప్రతి ఒక్కటి అనేక పెద్ద చిత్రాలను మోస్తూ.
కారణం 1: ప్రతి కాల్ పూర్తి పరిమాణ చిత్రాలను మళ్లీ పంపింది
ప్రతి మోడల్ కాల్ తన అభ్యర్థన బాడీని టర్న్ చిత్రాలను పూర్తి పరిమాణంలో ఉంచి తిరిగి నిర్మించింది — ప్రతి కాల్కు దాదాపు 20 MB base64. ఆ బాడీ ఏజెంట్ మెమరీలో ఒకే స్ట్రింగ్గా నిర్మించబడుతుంది, కాబట్టి ప్రతి కాల్ మరో ~20 MB కేటాయించింది.
పూర్తి పరిమాణంలో పంపడం వల్ల అసలు ఏ ప్రయోజనమూ లేదు. మోడల్ చిత్రాలను తనంతట తానే పొడవైన వైపు సుమారు 1,300 పిక్సెల్స్కు తగ్గిస్తుంది, కాబట్టి అదనపు పిక్సెల్స్ మెమరీ మరియు అప్లోడ్ సమయం మాత్రమే ఖర్చు చేస్తాయి.
పరిష్కారం: ఒకసారి తగ్గించి, చిన్నదిగా పంపడం
- 400 KB కంటే పెద్ద చిత్రాలను పంపే ముందు, పొడవైన వైపు గరిష్టంగా 1,568 పిక్సెల్స్ ఉన్న JPEG గా మారుస్తాం. చిన్న చిత్రాలు అలాగే వెళ్తాయి.
- మార్పిడికి ImageMagick ఉపయోగిస్తాం, ఇది ప్రతి Mythex సాండ్బాక్స్లో వస్తుంది, మరియు ప్రతి ఫైల్కు ఒకసారి మాత్రమే నడుస్తుంది. ప్రతి కాల్లో ఒకే స్కాన్లను చూపే టర్న్ తగ్గించిన కాపీని మళ్లీ వాడుతుంది. ఆ కాష్ ఫైల్ పాత్, పరిమాణం, మార్పు సమయం ద్వారా కీ చేయబడుతుంది, కాబట్టి సవరించిన ఫైల్ మళ్లీ మార్చబడుతుంది, మరియు దానికి స్వంత పరిమాణ పరిమితి ఉంది, తద్వారా అది మెమరీని నింపే వస్తువుగా మారదు.
- ఒక మోడల్ కాల్లో చిత్రాల బడ్జెట్ 16 MB నుండి 6 MB కు తగ్గింది.
అదే ఆరు స్కాన్లు ఇప్పుడు ప్రతి కాల్కు 19.7 MB కు బదులుగా 4.4 MB ఖర్చు చేస్తాయి.
కారణం 2: మోడల్ క్లయింట్ ఒక అభ్యర్థనను ఎప్పుడూ విడుదల చేయలేదు
ప్రతి అభ్యర్థన పరిమాణం ఒక భాగం మాత్రమే. కాల్ తర్వాత కాల్కు మెమరీ కూడా పెరిగింది. మా స్టేజింగ్ వాతావరణంలో, అదే రకమైన టర్న్ పూర్తి గార్బేజ్ కలెక్షన్ తర్వాత కూడా 369 MB సజీవ మెమరీని పట్టుకుంది — అంటే, చేరుకోలేని ప్రతిదీ విడుదలయ్యే స్థితి. హీప్ శాంప్లింగ్ మొత్తం పెరుగుదలను మోడల్ క్లయింట్ లైబ్రరీలోని అభ్యర్థన బాడీలను ఎన్కోడ్ చేసే భాగంలోనే ఉంచింది.
కారణం ఒక abort లిజనర్. మీరు Stop నొక్కినప్పుడు, టర్న్ యొక్క abort సిగ్నల్ కాల్ అవుతుంది, మరియు దానిని వింటున్న ప్రతి అభ్యర్థన రద్దవుతుంది. మేము ఆ ఒకే టర్న్-వ్యాప్తి సిగ్నల్ను ప్రతి అభ్యర్థనకు ఇచ్చాం. క్లయింట్ లైబ్రరీ ఇచ్చిన సిగ్నల్కు ఒక “abort” లిజనర్ను జోడిస్తుంది — మరియు దానిని ఎప్పుడూ తొలగించదు.
కాబట్టి టర్న్ యొక్క ప్రతి అభ్యర్థన ఆ టర్న్ ఉన్నంతవరకు ఆ సిగ్నల్ నుండి చేరుకోగలదిగా ఉంది: లిజనర్, అది కంట్రోలర్ను పట్టుకుంది, అది అభ్యర్థనను పట్టుకుంది, అది చిత్రాలతో సహా మొత్తం అభ్యర్థన బాడీని పట్టుకుంది.
పరిష్కారం: ప్రతి అభ్యర్థనకు ఒక సిగ్నల్
ఇప్పుడు ప్రతి అభ్యర్థనకు దాని స్వంత సిగ్నల్ వస్తుంది. అది అభ్యర్థన నడుస్తున్నంత వరకు మాత్రమే టర్న్ సిగ్నల్తో లింక్ చేయబడుతుంది — స్ట్రీమ్ చేయబడిన ప్రతిస్పందన కోసం, చివరి చంక్ చదివే వరకు — ఆ తర్వాత వెంటనే అన్లింక్ అవుతుంది. Stop ఇప్పటికీ ప్రవాహంలో ఉన్న ఏ అభ్యర్థనకైనా చేరుతుంది, కానీ టర్న్ సిగ్నల్ ఎప్పుడూ ఒకేసారి ఒక లిజనర్ను మాత్రమే పట్టుకుంటుంది.
పరీక్షలు ఈ మూడు భాగాలను కవర్ చేస్తాయి:
- 12 కాల్స్ తర్వాత, టర్న్ సిగ్నల్పై ఏ లిజనర్లూ మిగలవు. పరిష్కారానికి ముందు, 12 ఉండేవి.
- ప్రతి 8 MB ఉన్న 15 అభ్యర్థనల మీద, మెమరీ స్థిరంగా ఉంటుంది. ముందు, అది 128 MB పెరిగింది.
- స్ట్రీమ్ మధ్యలో ఉన్న అభ్యర్థనను Stop ఇంకా రద్దు చేస్తుంది.
కారణం 3: ట్రేసింగ్ ప్రతి కాల్ ఇన్పుట్లను ఉంచింది
హీప్ స్నాప్షాట్ మూడో హోల్డర్ను చూపింది: ప్రతి మోడల్ కాల్కు దాదాపు 6 MB. ఇది ఏజెంట్ ఫ్రేమ్వర్క్ యొక్క ఈవెంట్ స్ట్రీమింగ్ నుండి వచ్చింది. అది టర్న్లోని ప్రతి మోడల్ కాల్ను టర్న్ యొక్క చైల్డ్గా రికార్డ్ చేస్తుంది, ఇన్పుట్లతో సహా, టర్న్ ముగిసే వరకు. ప్రతి కాల్కు జత చేసిన ప్రతి చిత్రం దానితో పాటు మెమరీలో ఉండిపోయింది.
పరిష్కారం: కాల్ తిరిగి వచ్చాక చిత్రాలను ఖాళీ చేయడం
చిత్రాలు ఒక నిర్దిష్ట మోడల్ కాల్ కోసం నిర్మించిన సందేశాలకు మాత్రమే జోడించబడతాయి. అవి సంభాషణ యొక్క సేవ్ చేయబడిన స్థితిలో ఎప్పుడూ నిల్వ చేయబడవు. కాబట్టి ఒక కాల్ తిరిగి వచ్చాక, ఆ సందేశాలలోని చిత్ర డేటాను ఖాళీ చేయడం సురక్షితం. ట్రేస్ ఆ కాల్ యొక్క టెక్స్ట్ రికార్డ్ను ఉంచుతుంది; పిక్సెల్స్ పోతాయి.
ఒక వివరం ముఖ్యమైంది: చిత్రాలను స్థానంలోనే ఖాళీ చేయాలి. ట్రేసర్ ఒకే చిత్ర డేటాను ఒక సందేశంపై ఒకటికంటే ఎక్కువ రిఫరెన్స్ల ద్వారా చేరుకోగలదు, కాబట్టి కొత్త, ఖాళీ జాబితాతో మార్చేస్తే అసలు — పిక్సెల్స్తో సహా — ఇంకా చేరుకోగలిగేలా ఉంటుంది. సేవ్ చేయబడిన సంభాషణ స్థితి ఎప్పుడూ మార్చబడదు.
ఒక పరీక్ష ఏజెంట్ గ్రాఫ్ను ఆ ఈవెంట్ స్ట్రీమింగ్ కింద నడుపుతుంది, ప్రతి కాల్లో 4 MB చిత్రంతో. పరిష్కారం లేకుండా, 16 కాల్స్ మీద మెమరీ 77 MB పెరిగింది. దానితో, మెమరీ స్థిరంగా ఉంటుంది.
మేము నేర్చుకున్నది
- మెమరీ సమస్యలు పొరలుగా రావచ్చు. మూడు వేర్వేరు కారణాలు ప్రతిదీ చిత్రాలను ఎక్కువ సేపు పట్టుకున్నాయి, మరియు టర్న్ మెమరీలో ఉండాలంటే మూడూ తొలగించాలి.
- లైబ్రరీకి ఇచ్చిన ఏదైనా ఉంచబడవచ్చు. ఒక సిగ్నల్ మరియు ఒక ట్రేస్ రెండూ వాటికి ఇచ్చిన కాల్స్ కంటే ఎక్కువ కాలం జీవించాయి. మెమరీ ప్రతి కాల్కు పెరిగితే, ఆ కాల్ తాకే దీర్ఘకాలిక వస్తువులను చూడండి.
- అవతలి వైపు విసిరేసేది పంపకండి. మోడల్ ఎలాగూ విసిరేసే పిక్సెల్స్ ప్రతి కాల్లో మనకు మెమరీ ఖర్చు చేశాయి.
- మెమరీని నేరుగా పరీక్షించండి. ప్రతి పరిష్కారంతో హీప్ పెరుగుదల లేదా లిజనర్ సంఖ్యను కొలిచే పరీక్ష వచ్చింది, కాబట్టి రిగ్రెషన్ క్రాష్గా కాకుండా ఒక సంఖ్యగా కనిపిస్తుంది.
ఇది చిన్న కాలంలో ఏజెంట్ నుండి వచ్చిన రెండో మెమరీ కథ; మొదటిది ప్రోగ్రెస్ లేబుల్ 41,000 సార్లు తిరిగి పంపబడటం. ఏజెంట్ ఏమిటి, అది ఎలా పనిచేస్తుందో తెలుసుకోవాలంటే, AI ఏజెంట్లు అంటే ఏమిటి గైడ్ మరియు chat docs చూడండి.