Instagram robot készítése

Tartalomjegyzék

  1. Adat lenyelése
  2. Ismétlődő neurális hálózat
  3. GPT-2
  4. Automatizált feladás
  5. Web App

Adat lenyelése

Ezt a projektet homályos céllal indítottam, hogy python programot készítsek egy felhasználói tevékenység szimulálására a személyes Instagram-fiókomban, azzal a kezdeti céllal, hogy programokat képezhessek feliratokkal. Korábban együtt dolgoztam az Open AI GPT-2 modelljével, amely egy majom-lásd, majom-csin módszerrel működik, a képzés adatai alapján szöveget generál (a képaláíráshoz). Ezt szem előtt tartva, tudtam, hogy az első lépés egy megfelelő méretű edzési adatkészlet behúzása az Instagramból. Fogalmam sem volt, hogyan szerezhetem meg a GPT-2 feliratait, hogy azok valóban relevánsak legyenek a bejegyzésben található fotóval kapcsolatban.

Sajnos a projektemnél az Instagram API funkciói nagymértékben korlátozottak. A megoldás az volt, hogy egy szelén alapú webkaparót használtak a valódi Instagram hozzászólások lekaparására a „Felfedezés” fülről. Ezt a kiképzési adatot használták fel a robot képaláírást előállító részének kiképzéséhez, tehát hajlamosak arra, hogy az adatok felé torzuljanak. Feltételezem, hogy az Instagram hajlamos minden felhasználó Felfedezés lapjának testreszabására a böngészési viselkedésük alapján, ugyanakkor mivel nem használom az Instagram alkalmazást, a Felfedezés fület az alapértelmezetthez közel tartottam. Valamilyen okból ez magában foglalja a sok mikológiát és Harry Styles-t. Nem tudom miért. Ennek eredményeként a végsõ feliratok hajlamosak azok jellemzésére.

A webes böngésző működésben, ezúttal speciális címkéken

A kezdeti terv az volt, hogy feltöltsék a lekaparott adatokat a személyes S3 vödörbe, azonban úgy találtam, hogy 10 000 lekaparott üzenet után a tényleges fotók körülbelül 1,3 Gb-ra fordítják az adatokat és a kapcsolódó metaadatokat (feliratok, időbélyeg, felhasználónév, megjegyzések kiválasztása, stb.) kb. 25 MB-ig. A helyi számítógép könnyen kezelte ezt.

Ismétlődő neurális hálózat

Néhány kitartó Google-keresésen keresztül találtam ezt a cikket, amely egy visszatérő ideghálózatot használ a képaláírások automatikus létrehozásához. Megállapítottam, hogy az alapkódolás több cikkben is megtalálható az interneten, tehát nem vagyok biztos benne, hogy kinek számít a kezdeti munka, bár ezt a linket használtam. Azt is meg kell jegyeznem, hogy nem vagyok adattudós - gyakran kellett minden modellt alapvetően fekete dobozként kezelni, amely korlátozta a szóban forgó kódolás hatékonyságát.

Ezt a hálózatot a Flickr 8K adatkészlet képezi, amely 8000 fotóból áll, mindegyik öt képaláírással írja le, ami a képen található. Sajnos ezt az adatkészletet már nem az Illinoisi Egyetem tárolja, azonban nem nehéz a Google-n keresztül másutt megtalálni. Ezt a modellt saját számítógépemen képztem (rendkívül szórakoztató a Tensorflow és a kapcsolódó könyvtárak megfelelő verziójának felsorakoztatása és megfelelő telepítése) egy Nvidia RTX2070 Super GPU-val, amelynek kevesebb, mint fél órája futott.

Ez a bot azon része, amely felelős annak felkutatásáért, hogy mi van a képen, és ennek eredményeként pontosságát torzítja a mögöttes Flickr edzési adatok. Hajlandó jól azonosítani az embereket (nemük hajhossz alapján?), Kutyákat és motorkerékpárokat, de kissé véletlenszerűen elvégzi valami elvont képet vagy valami szöveget, amely magát a fényképet tartalmazza, mivel ezek nem voltak jelen az edzési adatokban. A móka részeként megpróbálom kitalálni, miért jelölte meg a modell valamit, amit tett, amikor a névértéknek nincs értelme.

Ez a modell kiküszöböli a mondat feliratát, megkísérelve leírni a fotó képeit. A valódi Instagram-bejegyzésekkel való futtatás pontossága a legjobban kétes, tehát néhány egyszerű NLP-munkát elvégeztem a főnév ebből a feliratból történő elemzéséhez, amelyet azután a GPT-2-be adtak, mint a tényleges képalkotó generáció kulcsszavait.

GPT-2

Az Open AI GPT-2 rendkívül jó abban a szövegben, amelyet a corpusra hangoltak, és amelyre finoman hangolod. Ebben az esetben a lekaparott 10 000 tényleges Instagram feliraton képztem, amelyeket az Instagram Kutatás lapjáról húztam. Mint már említettem, ez erősen ferde a Harry Styles és a mikológia felé.

A projektnek ez a része Max Woolf munkája nélkül nem lett volna lehetséges, akinek a gpt-2-egyszerű könyvtárat széles körben használtam. A Vanilla GPT-2 egy kulcsszót felvehet egy ugrópontként a szöveg generálása során, bár ezt szó szerint elsőként használja a létrehozott szövegben, és az RNN kulcsszavai alapján nagyban korlátozná a visszaadott feliratot.

A GPT-2 és az RNN összekapcsolásának kulcsa volt Max Woolf szkriptje, amely az edzési adatokat kódolja, mielőtt azokat a GPT-2-be betáplálnák. Automatikusan elemzi az edzési adatokat a kulcsszavak címkézéséhez, amely lehetővé teszi a GPT-2 számára, hogy később olyan formátumban adagolják őket, amely hasonló a regex mintázat illesztéshez (az RNN főnevei).

Ezt a modellt ismét a saját hardveremmel képztem, amely megközelítőleg 45 perctől egy óráig tartott.

Automatizált feladás

A rejtvény utolsó darabja az volt, hogy mindegyik modellt összefűzzük, és az Instagramba küldjük (ismét nagyon szórakoztató, ha az összes függő könyvtárat telepítjük kompatibilis verziójukba. Csak azt szeretném hangsúlyozni, milyen szórakoztató volt ez). A szelén felhasználásával krómmeghajtóval szimuláltam egy mobiltelefonomat az asztalomon, hogy áttörjek a feladási folyamatot. Sajnos nagy probléma merült fel a képaláírás tényleges szövegének Instagram szövegbeviteli mezőbe történő beillesztésével.

Automatizált posta

A GPT-2 elég jó, hogy a hangulatjeleket a létrehozott kimenetbe beépítse. Nagyon értékelem ezt, mivel a hangulatjelek az Instagram feliratok egyik legfontosabb jellemzője, azonban a send_keys módszer krómozott illesztőprogramjai csak a billentyűzet literális gombjait támogatják, és mint ilyenek, nem tudnak hangulatjeleket küldeni. Sokat próbáltam itt. A Javascript használatával próbáltam beinjektálni a szöveget a beviteli mezőbe. Kipróbáltam a Firefox szimulációját (a mobil eszközöket nem lehet szimulálni). Az utolsó, janky megoldás, amelyet szó szerint másolok és beillesztesz a szövegbe (a pythonon keresztül) a CTRL-C, a CTRL-V szimulációjával. Azok számára, akik otthont követnek, ez azt jelenti, hogy ha valami másra kattintom, miközben a program ezen részét futtatom, akkor ez megszakad. De ha nem, akkor működik. Szóval nem.

Web App

Nagyon jó érzés volt az első üzenet kitöltése, de gondoltam, hogy egy lépéssel tovább megyek egy webes alkalmazás létrehozásához, hogy más emberek is kipróbálhassák. Ez azt jelentette, hogy újra kell konfigurálni az adatgyűjtési folyamatot az egyetlen üzenetfeltöltés érdekében. Van itt egy rengeteg részlet, amelybe belemehetnék, de belefáradok a cikk írásához, így egyszerűen megtartom.

Az első lépés a modell becsomagolása egy Flask alkalmazásba, amelyet helyileg tudtam futtatni, a mellső végével együtt. Bárki, aki azt használja, valószínűleg elmondhatja, hogy hátulnézetben dolgozom, és először dolgozom fronton. Nagyon sok másolt HTML, CSS, Javascript funkció van beillesztve, és meg kellett tanulnom az ügyféloldali és a szerveroldali érvényesítésről, a bemeneti szennyvízkezelésről stb. Az rendetlen, de működik.

A webalkalmazás. Nem gpu EC2-en fut, tehát egy kicsit lassú ...

A második lépés az volt, hogy csomagoljuk egy gyárthatóbb Gunicorn alkalmazásba, majd csomagoljuk őket és függőségüket egy Docker tartályba. Itt tanultak el a python virtuális környezet használatának elfelejtéséről.

A második lépés (vagy 3, vagy 4, vagy bármi más) egy újabb dokkoló tároló létrehozása volt, amely az NGINX-t fordított proxyként futtatja, majd a dokkoló összeállítja mindkét tárolót, hogy együtt futhassanak, ismét helyileg. Megszerezve ezt, a teljes csomagot az AWS-fiókomon futó EC2-re telepíttem. Kezdetben azt terveztem, hogy telepítek egy ECS-fürtbe, ahol a helyén van a terheléselosztó mechanizmus, de lusta lettem, és azt is meg akartam csökkenteni a költségeimet (elkerülve, hogy egyszerre több, nem ingyenes EC2-példány futjon). A megvásárolt domain névvel kombinálva, az et-voila, a webalkalmazás verziója bárki számára.

Még mindig megpróbálom beszerezni az SSL-titkosítást az alkalmazáshoz vagy a Google Ad Sense-hez, így remélhetőleg megtéríthetem a szerver üzemeltetésének költségeit, de az idk-t.

A fiókot létrehozó hozzászólásokat követheti a @notdavidyu webhelyen. A webes alkalmazás elérhető, bár még mindig érzem magam, ha fizetnek érte a www.thegram9000.com webhelyen