Írta: Selcuk Kopru és Jingjing Jiang
Egy nemrégiben megjelent eBay Tech Blog cikk¹ bemutatta a Krylov nevű egyesített mesterséges intelligencia platformot. Ebben a cikkben bemutatjuk, hogyan lépnek kapcsolatba a Krylov-felhasználók a platformmal, hogy hatékony munkafolyamatokat építsenek fel és kezeljenek pitonikus és hatékony módon.
Az AI platform elérése és a gépi tanulási (ML) képzési kód futtatása közben a kutatók számára zökkenőmentesnek és egyszerűnek kell lennie. Bármilyen ML-kód áttelepítése helyi környezetből a platformra, egyáltalán nem igényelheti a kód átalakítását. Az infrastruktúra-konfiguráció többletköltségének minimálisnak kell lennie. A PyKrylov fejlesztése során az volt a küldetésünk, hogy a lehető legnagyobb mértékben elvonjuk az ML logikát az infrastruktúrától és a Krylov alapkomponensektől (1. ábra), hogy a platform felhasználóinak a legjobb élményt nyújtsuk.
A PyKrylov a Krylov pythonic interfésze, amelyet kutatók és mérnökök vállalat egészében használnak az eBay mesterséges intelligencia platformjának eléréséhez. A PyKrylovot kutatók építették kutatók számára, és növelte a Krylov hatékony számítási erőforrásait használni kívánó kutatók termelékenységét. Az új és a meglévő kód beépítése a platformra olyan egyszerű, mint néhány sor további kód beírása az ML logikába a meglévő megvalósítás megváltoztatása nélkül. A PyKrylovval járó rezsi minimális, amint azt az alábbi Hello World! példa. A felhasználó fejlesztheti és elindíthatja a kódot a helyi környezetében, de a hello_world
függvény a Krylov platformon fog végrehajtódni, nem pedig a felhasználók helyi környezetében.
def hello_world(): print('Hello World!') if __name__ == '__main__': import pykrylov session = pykrylov.Session() task = pykrylov.Task(hello_world) run_id = session.submit(task)
A PyKrylov ML keretrendszer-agnosztikus, és minden, a piacon elérhető gépi tanulási könyvtárral működik, beleértve, de nem kizárólagosan a PyTorch-ot és a Tensorflow-t. Még a Hadoop és a Spark rendszeren is futtathat feladatokat. A felhasználó az egyes feladatokat különböző módokon konfigurálhatja, például megadhat egy egyéni Docker-képet, megadhat számítási erőforrásokat, végrehajtási paramétereket stb. Az alábbi példában a feladat úgy van beállítva, hogy PyTorch docker-lemezkép használatával V100-as GPU-erőforráson fusson. A felhasználók a konfigurációt egyszerű Python-kóddal végzik el, és nem kell további JSON- vagy YAML-fájlokkal foglalkozniuk.
task.run_on_gpu(model='v100') task.add_execution_parameter('docker', 'pytorch_image:latest')
Munkafolyamatok
A modelltanítás általában egy többlépéses munkafolyamat, amelyet irányított aciklikus gráfként (DAG) megadott feladatok és függőségek gyűjteményével ábrázolnak. A PyKrylov-ban munkafolyamatok létrehozása nagyon természetes módon valósítható meg. A 2. ábra egy egyszerű szekvenciális munkafolyamatot mutat, ahol a végrehajtás data_prep
-vel kezdődik és finish
feladattal végződik.
A PyKrylov programban a fenti munkafolyamat egyszerűen létrehozható a Pythonhoz tartozó OrderedDict
osztály használatával. Az alábbi kódrészletben az Session.submit()
függvény ezúttal egyetlen feladat elküldése helyett elküldi a munkafolyamatot az AI platformnak.
def data_prep(): print('do some data prepping') def train(): print('train a cool model') def test(): print('test your model') def finish(): print('do some closing work') task_data = pykrylov.Task(data_prep) task_train = pykrylov.Task(train) task_test = pykrylov.Task(test) task_finish = pykrylov.Task(finish) seq_workflow = OrderedDict({ task_data: [task_train], task_train: [task_test], task_test: [task_finish] }) run_id = session.submit(seq_workflow)
Lehetőség van olyan feladatok beküldésére is, amelyek nem Python programozási nyelven vannak megvalósítva. Egy bash szkripten keresztül a PyKrylov ShellTask
osztálya lehetővé teszi a felhasználó számára, hogy a felhasználó által preferált bármely programozási nyelven futtasson kódot.
Ezenkívül a szekvenciális munkafolyamatot párhuzamos munkafolyamattá alakíthatja a PyKrylovhoz mellékelt parallelize()
függvény segítségével.
parallel_wf = pykrylov.parallelize( workflow=seq_workflow, start=train, end=test, parameter='lr', value_list=[0.1, 0.3, 0.5] )
A fenti kódrészlet után generált parallel_wf
DAG reprezentációja a 3. ábrán látható. A munkafolyamat a data_prep
feladattal kezdődik, és a feladat befejezése után három párhuzamos folyam indul a train
függvénnyel. A finish
függvény csak akkor kerül végrehajtásra, ha a test
függvény mindhárom példánya befejeződött.
Lehetőség van párhuzamos munkafolyamatok definiálására is a nulláról OrderedDict
definíciókkal. A PyKrylov-felhasználók azonban inkább a munkafolyamat-módosítási funkciókat használják párhuzamos munkafolyamatok létrehozására. Nagyobb munkafolyamatok hozhatók létre a parallelize()
függvény láncolásával minden hiperparaméterhez (pl. kötegméret és méret). A hiperparaméter-hangolási munkafolyamatok egyszerű létrehozásának másik módja a grid_search()
, random_search()
és parameter_grid()
függvények használata, amelyek a PyKrylov-ban a scikit learning csomaghoz hasonlóan implementálva vannak.
parallel_wf = pykrylov.grid_search( workflow=seq_workflow, parameters_list = pykrylov.parameter_grid({ 'lr' = [0.1, 0.3, 0.5], 'dim' = [100, 200, 300], }), start=train, end=test )
A végső munkafolyamat úgy néz ki, mint a 4. ábrán látható DAG.
Munkafolyamat állapotának kezelése
A PyKrylovban a munkafolyamat állapotának nyomon követése és kezelése a benyújtás után egyszerű. A Session.job_show() megmutatja az egyes feladatok állapotát és a futás általános állapotát. A Session.job_pause()
, Session.job_stop()
és Session.job_resume()
lehetővé teszik a felhasználók számára a futások szüneteltetését, leállítását vagy folytatását. Ha egy feladat függőben van, a Session.job_info()
nagyon hasznos, hogy megnézze, mi történik, pl. ha forrásokra vár.
session = pykrylov.Session() response = session.job_show(run_id) session.job_stop(run_id) session.job_resume(run_id)
Elosztott képzés
A Distributed Training több gépet is igénybe vesz az edzési idő csökkentése érdekében. A Krylov támogatja az olyan népszerű keretrendszereket, mint a TensorFlow, PyTorch, Keras vagy Horovod, amelyek natívan támogatják az elosztott képzést. Krylov stabil IP-címeket biztosít a podoknak egy elosztott képzési munkában, és ha egy pod leesik a képzés során, Krylov visszahozza, és ugyanazt az IP-t adja meg, hogy a képzés folytatódhasson.
A pykrylov.distributed
csomag lehetővé teszi a felhasználók számára, hogy elosztott képzési munkafolyamatokat indítsanak el a Krylovon az elosztott képzési kódjukkal a nekik tetsző keretrendszerben. A tapasztalat hasonló a nem elosztott képzési munkafolyamatok elindításához, de a PyKrylov automatikusan generálja a párhuzamossághoz szükséges konfigurációs fájlokat és a stabil pod IP-kkel járó szolgáltatásokat. A DistributedTask osztály lehetővé teszi a felhasználók számára a Pythonban megvalósított elosztott képzések futtatását, a DistShellTask
osztály pedig lehetővé teszi a felhasználók számára más nyelveken megvalósított elosztott képzések futtatását, mindaddig, amíg az elindítható egy shellben. Az alábbiakban két mintakódrészletet mutatunk be, az egyik a Python által megvalósított mnist_train
függvényből DT-futást küld be, az utóbbi pedig egy DT-futást hoz létre a run_chief.sh
és worker.sh
shell-szkriptekből.
from mnist import train as mnist_train parallelism = 2 task = pykrylov.distributed.DistributedTask(mnist_train, name='mnist_task_name', parallelism=parallelism) task.add_service(name=master_service_name, port=2020) task.run_on_gpu(quantity=1, model='m40') session = pykrylov.Session() run_id = session.submit(task) from collections import OrderedDict chief_task = pykrylov.distributed.DistShellTask('run_chief.sh', name='chief_task_name', parallelism=1, service_name='chiefSVC', service_port=22) # Another way to specify service chief_task.run_on_gpu(quantity=1, model='p100') worker_task = pykrylov.distributed.DistShellTask('worker.sh', name='worker_task_name', parallelism=3, service_name='workerSVC', service_port=22) worker_task.run_on_gpu(quantity=1, model='p100') session = pykrylov.Session() workflow = OrderedDict({chief_task:[], worker_task:[]}) run_id = session.submit(workflow)
Kísérletkezelő rendszer (EMS)
A legjobb modell keresése magában foglalja a hiperparaméter-hangolás többszörös iterációját és több kísérlet párhuzamos futtatását, valamint az ezekben kapott eredmények összehasonlítását. A Kísérletkezelő Rendszer (EMS) előtt a Krylov-felhasználóknak manuálisan kellett könyvelniük a hiperparamétereket, a munkafolyamat-információkat és a képzéssel kapcsolatos egyéb metaadatokat. Az EMS lehetővé teszi a kísérletek nyomon követését, a naplók kezelését és a generált modellek kezelését – függetlenül attól, hogy a modellt termelésre választják-e vagy sem –, valamint megjelenítheti a képzési állapotot és a naplókat a Krylov irányítópulton. Ezen túlmenően a felhasználók rögzíthetik és megjeleníthetik a kiszámított mérőszámokat, például a veszteség- és precíziós értékeket időbélyegekkel.
A pykrylov.ems
egyszerű pitonikus módot kínál kísérletek létrehozására és frissítésére, valamint a felhasználók által létrehozott metaadatok, naplók, modellek, metrikák vagy egyéb fájlok társítására a kísérletekhez.
config = { 'lr': 0.0001, 'model': 'CNN', 'dataset': 'mnist', 'epochs': 100 } def train(config, model, optimizer, mnist_dataset): exp_id = pykrylov.ems.create_experiment('my_project', 'my_experiment', configurations=config) step = 0 for epoch in range(config['epochs']): for batch in mnist_dataset.train: output = model(batch.data) loss = calc_loss(output, batch.target) pykrylov.ems.write_metric(exp_id, name='loss', value=loss, dimension={'step': step}) loss.backward() optimizer.step() step += 1 precision = calc_precision(mnist_dataset.dev) pykrylov.ems.write_metric(exp_id, name='dev_precision', value=precision)
Modellkezelő rendszer (MMS)
A betanított modelleknek hozzáférhetőnek kell lenniük a termelési környezetben való következtetésekhez. Szükséges a modellek verziószáma és címkézése, valamint a modellhez kapcsolódó metaadatok (pl. pontosság, betanítási adatkészlet, hiperparaméterek) rögzítése. Modellkezelő rendszer (MMS) nélkül ez a feladat ijesztő lehet az adatkutatók számára, mivel kézi és bonyolult megoldásokat igényel. Erre a célra a Krylov MMS rendszert úgy fejlesztették ki, hogy központosított megoldást nyújtson a modellek tárolására, ahol a modellek verziószáma és a könyvelési metaadatok támogatottak, és zökkenőmentesen integrálva vannak a képzéssel és a következtetésekkel. A PyKrylov pykrylov.mms
moduljával az adattudósok könnyedén továbbíthatják a modelleket MMS-be a képzés során. A pykrylov.mms
modul helyileg is használható modellek MMS-be és onnan történő feltöltésére és letöltésére. A modul modellfelderítési képességet is biztosít a felhasználók számára.
revision = pykrylov.mms.create_model('my_project', 'my_model_name', model_file_list, 'my_tag') print(pykrylov.mms.show_model('my_project', 'my_model_name', 'my_tag', revision=revision) pykrylov.mms.download_revision('my_project', 'my_model_name', 'my_tag','save_to_dir', latest=True)
Következtetések
Bemutattuk a PyKrylovot, és megmutattuk, hogyan gyorsítja fel a gépi tanulási kutatást az eBay-en. Az ML feladatok elküldése leegyszerűsödik, és a konfigurációs többletköltség csökken. A felhasználó néhány sor Python kóddal beépítheti kódját a platformra. A gépi tanulás demokratizálására irányuló utunk során ez csak a fele a történetnek. Következő lépésünk az, hogy biztosítjuk a kutatók számára a szükséges eszközöket bizonyos területekhez, mint például az NLP és az önéletrajz. Erről további részleteket egy másik blogcikkben közölünk.
¹ Az eBay átalakulása modern AI platformmá
Eredetileg a https://tech.ebayinc.com oldalon tették közzé 2020. február 3-án.