Í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.