Blog

Memastikan Giliran Ejen Berat Imej Kekal dalam Memori

Satu giliran ejen dalam pengeluaran kehabisan memori pada 952 MB semasa memotong produk daripada enam imbasan katalog dan meneliti hasil potongannya. Bukan satu kebocoran — tiga. Setiap panggilan ke model menghantar semula imej giliran itu pada saiz penuh; pustaka yang kami gunakan untuk memanggil model menyimpan setiap permintaan hidup sehingga giliran tamat; dan penjejakan rangka kerja ejen menyimpan input setiap panggilan, termasuk imej, sepanjang giliran. Kami membetulkan ketiga-tiganya: imej dikecilkan sebelum dihantar, dan imej setiap panggilan dilepaskan sebaik sahaja panggilan itu selesai.

Bagaimana ejen melihat imej

Apabila anda membina di Mythex, ejen bekerja di dalam kotak pasir awan projek anda. Ia boleh melihat imej — tangkapan skrin yang anda lampirkan, mockup, fail dalam projek anda, atau imej yang baru dihasilkannya sendiri — dengan menghantarnya kepada model bersama perbualan.

Giliran ialah segala yang dilakukan ejen sebagai tindak balas kepada satu mesej daripada anda. Dalam satu giliran, ejen memanggil model banyak kali: berfikir, jalankan alat, lihat hasilnya, berfikir semula. Setiap panggilan itu menghantar perbualan setakat ini, termasuk imej giliran tersebut, yang dikodkan sebagai teks (base64, yang menjadikannya kira-kira satu pertiga lebih besar).

Giliran yang ranap itu melakukan sesuatu yang munasabah. Ia mengambil enam imbasan katalog, kira-kira 2.4 MB setiap satu, memotong produk individu daripadanya, dan terus membaca semula hasil potongan untuk menyemaknya. Itu banyak panggilan model, setiap satu membawa beberapa imej besar.

Punca 1: setiap panggilan menghantar semula imej saiz penuh

Setiap panggilan model membina semula badan permintaannya dengan imej giliran pada saiz penuh — kira-kira 20 MB base64 setiap panggilan. Badan itu dibina sebagai satu rentetan dalam memori ejen, jadi setiap panggilan memperuntukkan lagi kira-kira 20 MB.

Menghantar saiz penuh pun tidak memberi apa-apa faedah. Model sendiri mengecilkan imej kepada kira-kira 1,300 piksel pada sisi panjang, jadi piksel tambahan hanya menambah penggunaan memori dan masa muat naik.

Pembetulan: kecilkan sekali, hantar kecil

  • Imej melebihi 400 KB kini ditukar kepada JPEG dengan paling banyak 1,568 piksel pada sisi panjang sebelum dihantar. Imej yang lebih kecil dihantar seadanya.
  • Penukaran menggunakan ImageMagick, yang terdapat dalam setiap kotak pasir Mythex, dan dijalankan sekali bagi setiap fail. Giliran yang menunjukkan imbasan yang sama pada setiap panggilan menggunakan semula salinan yang sudah dikecilkan. Cache itu dikunci mengikut laluan fail, saiz dan masa ubah suai, jadi fail yang disunting akan ditukar semula, dan ia mempunyai had saiznya sendiri supaya ia sendiri tidak menjadi punca yang memenuhi memori.
  • Bajet untuk imej dalam satu panggilan model turun daripada 16 MB kepada 6 MB.

Enam imbasan yang sama kini menelan 4.4 MB setiap panggilan berbanding 19.7 MB.

Punca 2: klien model tidak pernah melepaskan permintaan

Saiz setiap permintaan hanyalah sebahagian daripadanya. Memori juga meningkat dari panggilan ke panggilan. Di persekitaran staging kami, giliran jenis yang sama menahan 369 MB memori hidup walaupun selepas kutipan sampah penuh — titik di mana apa-apa yang tidak boleh dicapai sudah dibebaskan. Pensampelan timbunan meletakkan semua pertumbuhan itu dalam bahagian pustaka klien model yang mengekod badan permintaan.

Puncanya ialah pendengar abort. Apabila anda menekan Henti, isyarat abort giliran itu terpancar, dan setiap permintaan yang mendengarnya dibatalkan. Kami menghantar satu isyarat peringkat giliran itu kepada setiap permintaan. Pustaka klien menambah pendengar “abort” pada mana-mana isyarat yang diberikan kepadanya — dan tidak pernah membuangnya.

Jadi setiap permintaan dalam satu giliran kekal boleh dicapai daripada isyarat giliran itu, selagi giliran berlangsung: pendengar itu, yang memegang pengawal permintaan, yang memegang permintaan, yang memegang seluruh badan permintaan dengan imejnya.

Pembetulan: satu isyarat bagi setiap permintaan

Setiap permintaan kini mendapat isyarat sendiri. Ia dipautkan kepada isyarat giliran hanya semasa permintaan itu berjalan — bagi respons yang distrim, sehingga bahagian terakhir dibaca — dan dinyahpautkan sejurus selepas itu. Henti masih sampai kepada mana-mana permintaan yang sedang berjalan, tetapi isyarat giliran hanya memegang satu pendengar pada satu masa.

Ujian meliputi ketiga-tiga bahagian itu:

  • Selepas 12 panggilan, tiada pendengar yang tinggal pada isyarat giliran. Sebelum pembetulan, terdapat 12.
  • Sepanjang 15 permintaan masing-masing 8 MB, memori kekal rata. Sebelum ini, ia meningkat sebanyak 128 MB.
  • Menekan Henti masih membatalkan permintaan di tengah-tengah strimnya.

Punca 3: penjejakan menyimpan input setiap panggilan

Snapshot timbunan menunjukkan pemegang ketiga: kira-kira 6 MB disimpan bagi setiap panggilan model. Ini datang daripada penstriman peristiwa rangka kerja ejen. Ia merekod setiap panggilan model dalam satu giliran sebagai anak kepada giliran itu, termasuk inputnya, sehingga giliran tamat. Setiap imej yang dilampirkan pada setiap panggilan kekal dalam memori bersamanya.

Pembetulan: kosongkan imej sebaik panggilan kembali

Imej hanya pernah dilampirkan kepada mesej yang dibina untuk satu panggilan model tertentu. Ia tidak pernah disimpan dalam keadaan tersimpan perbualan. Jadi sebaik sahaja satu panggilan kembali, adalah selamat untuk mengosongkan data imej dalam mesej tersebut. Penjejak menyimpan rekod teks bagi panggilan itu; piksel dibuang.

Satu butiran penting: imej mesti dikosongkan di tempat asal. Penjejak boleh mencapai data imej yang sama melalui lebih daripada satu rujukan pada mesej, jadi menggantikannya dengan senarai kosong yang baharu akan meninggalkan yang asal — dengan piksel dan semuanya — masih boleh dicapai. Keadaan perbualan yang tersimpan tidak pernah diubah.

Satu ujian menjalankan graf ejen di bawah penstriman peristiwa yang sama dengan imej 4 MB pada setiap panggilan. Tanpa pembetulan, memori meningkat 77 MB sepanjang 16 panggilan. Dengan pembetulan, memori kekal rata.

Apa yang kami pelajari

  • Masalah memori boleh datang berlapis. Tiga punca berasingan menahan imej terlalu lama, dan ketiga-tiganya perlu dibuang sebelum giliran kekal dalam memori.
  • Apa sahaja yang anda serahkan kepada pustaka mungkin disimpan. Isyarat dan penjejakan kedua-duanya hidup lebih lama daripada panggilan yang diberikan kepadanya. Apabila memori meningkat setiap panggilan, lihat objek berjangka panjang yang disentuh oleh panggilan itu.
  • Jangan hantar apa yang pihak lain akan buang. Piksel yang model akan abaikan juga menelan memori kami pada setiap panggilan.
  • Uji memori secara langsung. Setiap pembetulan disertai ujian yang mengukur pertumbuhan timbunan atau bilangan pendengar, supaya regresi muncul sebagai nombor, bukan ranap.

Ini ialah cerita memori kedua daripada ejen dalam tempoh yang singkat; yang pertama ialah label kemajuan yang dihantar semula 41,000 kali. Jika anda mahu tahu lebih lanjut tentang apa itu ejen dan cara ia berfungsi, lihat panduan kami tentang ejen AI dan dokumentasi chat.

Mythex · Pricing · Bina apa sahaja dengan AI · Templat laman web dan aplikasi · Mythex dibandingkan · Glosari pembinaan aplikasi AI · Alat percuma untuk membina aplikasi dengan 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 Македонски മലയാളം Монгол मराठी မြန်မာ 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 简体中文 繁體中文(香港) 繁體中文(台灣)