5 nasvetov za usposabljanje z več grafičnimi procesorji s Keras PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.

5 nasvetov za trening z več GPU-jem s Kerasom

Deep Learning (najljubša buzzword iz konca leta 2010 skupaj z blockchain / bitcoin in Data Science / Machine Learning) nam je v zadnjih nekaj letih omogočil nekaj zelo kul stvari. Razen napredka algoritmov (ki najbrž temeljijo na idejah, ki jih poznamo že od devetdesetih let prejšnjega stoletja, imenovanih "doba rudarjenja podatkov"), so glavni razlogi za njegov uspeh pripisani razpoložljivosti velikih brezplačnih nizov podatkov, uvedbi knjižnic z odprtimi izvori in uporaba GPU-jev. V tem spletnem postu se bom osredotočil na zadnja dva in z vami bom delil nekaj nasvetov, ki sem se jih naučil na težko pot.

Zakaj TensorFlow & Keras?

TensorFlow je zelo priljubljena knjižnica Deep Learning, ki jo je razvil Google in omogoča prototipiranje hitro zapletenih omrežij. Na voljo je z veliko zanimivimi funkcijami, kot sta samodejna diferenciacija (ki vam prihrani od ocenjevanja / kodiranja gradientov stroškovnih funkcij) in podpora za GPU (ki vam omogoča enostavno izboljšanje hitrosti 200 x z uporabo spodobne strojne opreme). Poleg tega ponuja vmesnik Python, kar pomeni, da lahko hitro oblikujete prototip, ne da bi morali zapisati C ali CUDA kodo. Res je, da obstaja veliko drugih okvirov, ki jih lahko uporabimo namesto TensorFlow, na primer Torch, MXNet, Theano, Caffe, Deeplearning4j, CNTK itd., Vendar se vse skupaj prilega vašemu primeru uporabe in vašim osebnim željam.

Ampak zakaj Keras? Zame je, da neposredno uporabljam TF, kot da bi delal strojno učenje z maticami. Da, to je izvedljivo in občasno morate to storiti (še posebej, če napišete sloje po meri / funkcijo izgube), vendar res želite napisati kodo, ki zapletena omrežja opisuje kot niz vektorskih operacij (ja, vem obstajajo metode višje ravni v TF, vendar niso tako kul kot Keras)? Tudi kaj, če se želite preseliti v drugo knjižnico? No, potem bi verjetno morali napisati kodo, ki je zanič. Ta taaaa, Keras na pomoč! Keras vam omogoča, da opišete svoja omrežja s pomočjo konceptov na visoki ravni in napišete kodo, ki je začasna agnostica, kar pomeni, da lahko omrežja poganjate v različnih knjižnicah globokega učenja. Kar nekaj stvari, ki jih imam rad pri Kerasu, je, da je dobro napisana, ima objektno orientirano arhitekturo, lahko preprosto prispeva in ima prijazno skupnost. Če vam je všeč, se zahvalite François Chollet za njegovo razvijanje in odkritje.

Nasveti in predlogi za usposabljanje z več GPU-ji

Brez dodatnega oboževanja, pojdimo na nekaj nasvetov, kako kar najbolje izkoristiti trening GPU-ja na Kerasu in nekaj težav, ki jih morate imeti v mislih:

1. Izobraževanje z več GPU ni samodejno

Trening modelov na GPU z uporabo Keras & Tensorflow je brezhiben. Če imate kartico NVIDIA in ste namestili CUDA, jo bodo knjižnice samodejno zaznale in uporabile za usposabljanje. Tako kul! Kaj pa, če ste pokvarjeni brat in imate več grafičnih procesorjev? No, na žalost boste morali malo delati, da boste dosegli usposabljanje za več GPU.
5 nasvetov za usposabljanje z več grafičnimi procesorji s Keras PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
Obstaja več načinov za vzporeditev omrežja, odvisno od tega, kaj želite doseči, vendar sta glavna dva pristopa primerjava modelov in podatkov. Prvi vam lahko pomaga, če je vaš model preveč zapleten, da bi se lahko vgradil v en GPU, medtem ko slednji pomaga, ko želite pospešiti izvedbo. Kadar ljudje govorijo o usposabljanju z več GPU-ji, mislijo na slednje. To je bilo včasih težje doseči, a k sreči je Keras pred kratkim vključil uporabno metodo, imenovano mutli_gpu_model kar olajša vzporedni trening / napovedi (trenutno na voljo samo z zaledjem TF). Glavna ideja je, da svoj model posredujete po metodi in ga kopirate v različne GPU. Izvirni vhod se razdeli na koščke, ki se napajajo različnim GPU-jem, nato pa se združijo kot en izhod. Ta metoda se lahko uporablja za doseganje vzporednega usposabljanja in napovedi, vendar ne pozabite, da se za usposabljanje ne zahteva linearno s količino GPU-jev zaradi potrebne sinhronizacije.

2. Bodite pozorni na velikost serije

Med treningom z več GPU bodite pozorni na velikost serije, saj ima večkratni učinek na hitrost / pomnilnik, konvergenco vašega modela in če niste previdni, lahko poškodujete uteži modela!

Hitrost / pomnilnik: Očitno večja je serija, hitrejši bo trening / napoved. To je zato, ker je treba vnašati in odvzeti podatke iz GPU-jev, zato imajo majhne serije več režijskih stroškov. Na drugi strani je večja serija, več pomnilnika potrebujete v GPU-ju. Zlasti med treningom se vhodi vsakega sloja hranijo v pomnilniku, saj so potrebni na koraku širjenja hrbta, tako da lahko povečanje velikosti serije preveč povzroči napake, ki niso v pomnilniku.

Konvergenca: Če za usposabljanje modela uporabljate Stochastic Gradient Decent (SGD) ali nekatere njegove različice, morate imeti v mislih, da lahko velikost serije vpliva na sposobnost vašega omrežja za konvergenco in posploševanje. Tipične velikosti šarž pri številnih težavah z računalniškim vidom so med 32-512 primeri. Kot Keskar in sod povedano: "V praksi je bilo ugotovljeno, da pri uporabi večje serije (od 512) kakovost modela niža, merjeno z njegovo zmožnostjo posploševanja." Upoštevajte, da imajo drugi različni orodji za optimizacijo različne lastnosti in specializirane tehnike porazdeljene optimizacije lahko pomagajo pri težavi. Če vas matematične podrobnosti zanimajo, priporočam, da preberete diplomsko nalogo Joeri Hermans "O skalabilnem poglobljenem učenju in vzporednem spustu gradientov".
5 nasvetov za usposabljanje z več grafičnimi procesorji s Keras PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
Korumpiranje uteži: To je grda tehnična podrobnost, ki ima lahko uničujoče rezultate. Ko izvajate usposabljanje z več GPU-ji, je pomembno, da vse GPU shranite s podatki. Lahko se zgodi, da ima zadnja serija vaše epohe manj podatkov, kot je definirano (ker velikosti vašega nabora podatkov ni mogoče natančno razdeliti na velikost vaše šarže). To lahko povzroči, da nekateri GPU v zadnjem koraku ne bodo prejeli nobenih podatkov. Žal nekateri plasti Kerasa, predvsem sloj normalizacije serije, ne morejo obvladati tistega, kar vodi do nan vrednosti, ki se pojavljajo v utežih (tekoča sredina in nihanje v BN plasti). Da bodo stvari še bolj nastrojene, med treningom težave ne bomo opazovali (medtem ko je faza učenja 1), ker določena plast v ocenah uporablja povprečje / odstopanje serije. Kljub temu se med napovedmi (faza učenja, nastavljena na 0) uporablja tekoča srednja vrednost / odstopanje, ki v našem primeru lahko postane nan, kar vodi do slabih rezultatov. Zato si naredite uslugo in vedno preverite, ali je vaša velikost serije določena, ko izvajate trening z več GPU-ji. Dva preprosta načina za dosego tega sta bodisi z zavrnitvijo serij, ki se ne ujemata s predhodno določeno velikostjo, bodisi ponovite zapise znotraj serije, dokler ne dosežete vnaprej določene velikosti. Nenazadnje ne pozabite, da mora biti pri nastavitvi več GPU velikost serije večje od števila razpoložljivih GPU-jev v vašem sistemu.

3. Podatki o GPU-ju. Starvation, podobno kot CPU-ji, ne morejo biti v koraku s GPU-ji

Ponavadi je najdražji del med usposabljanjem / napovedovanjem globinskih omrežij ocena, ki se dogaja na GPU-jih. Podatki so v ozadju predhodno obdelani v procesorjih in jih občasno pošiljamo v GPU. Kljub temu ne gre podcenjevati, kako hitri so GPU-ji; lahko se zgodi, da če je vaše omrežje preveč plitvo ali je korak predhodne obdelave preveč zapleten, da vaši procesorji ne morejo biti v koraku s svojimi GPU-ji, ali z drugimi besedami, ne hranijo jih dovolj hitro. To lahko privede do majhne izkoriščenosti GPU-ja, kar pomeni zapravljeni denar / vire.
5 nasvetov za usposabljanje z več grafičnimi procesorji s Keras PlatoBlockchain Data Intelligence. Navpično iskanje. Ai.
Keras ponavadi ocenjuje seštev vzporedno, vendar zaradi Pythonove GIL (Global Interpreter Lock) v Pythonu resnično ne morete doseči pravega večnareznega navoja. Za to obstajata dve rešitvi: bodisi uporabite več postopkov (upoštevajte, da je v tem, kar ne bom pokrival, veliko možnosti) ali pa korak vnaprej obdelajte. V preteklosti sem Kerasu poslal Pull-Request, da bi ublažil nekaj nepotrebnega napora, ki smo ga obdelovali na CPU-ju med predobdelavo slike, tako da večina uporabnikov ne bi smela biti prizadeta, če uporabljajo standardne generatorje. Če imate generatorje po meri, poskusite potisniti čim več logike v knjižnice C, kot je Numpy, ker nekatere od teh metod dejansko izpustite GIL kar pomeni, da lahko povečate stopnjo vzporednosti. Dober način za zaznavanje, ali se soočate s stradanjem podatkov o GPU-ju, je spremljanje uporabe GPU-ja, kljub temu pa je treba opozoriti, da to ni edini razlog za to opazovanje (sinhronizacija, ki se zgodi med usposabljanjem prek več GPU-jev, je kriva tudi za slabo uporabo ). Običajno stradanje podatkov GPU-ja lahko zaznamo z opazovanjem razpokov GPU-ja, ki mu sledijo dolge pavze brez uporabe. V preteklosti sem odprl razširitev za Dstat, ki vam lahko pomaga meriti izkoriščenost GPU-ja, zato si oglejte originalno objavo v spletnem dnevniku.

4. Shranjevanje vzporednih modelov

Recimo, da ste uporabili metodo mutli_gpu_model za vzporeditev svojega modela, trening je končan in zdaj želite ohraniti njegove uteži. Slaba novica je, da na njem ne morete samo poklicati save (). Trenutno ima Keras omejitev, ki ti tega ne omogoča shranite vzporedni model. Obstajata dva načina: ali pokličite save () na referenco izvirnega modela (uteži se bodo posodobili samodejno) ali pa morate model serijsko uporabiti tako, da sečete paralelizirano različico in očistite vse nepotrebne povezave. Prva možnost je lažja, toda v prihodnosti nameravam odpreti kodo serialize () metode, ki izvaja slednjo.

5. Štetje razpoložljivih GPU-jev je neprijeten stranski učinek

Na žalost je trenutno na strani tensorflow.python.client.device_lib.list_local_devices () moten stranski učinek, ki povzroči ustvarjanje novega TensorFlow Session in inicializacijo vseh razpoložljivih GPU-jev v sistemu. To lahko privede do nepričakovanih rezultatov, kot je ogled več GPU-jev od določenih ali predčasno inicializiranje novih sej (vse podrobnosti o tem lahko preberete povpraševanje). Da se izognete podobnim presenečenjem, priporočamo, da namesto tega uporabite Kerasovo metodo K.get_session (). List_devices (), ki vam bo vrnila vse trenutno registrirane GPU-je v seji. Nenazadnje, ne pozabite, da je klicanje liste_devices () nekako drago, zato če vas samo zanima število razpoložljivih grafičnih procesorjev, pokličite metodo enkrat in njihovo številko shranite v lokalno spremenljivko.

To je to! Upam, da ste našli ta seznam uporaben. Če ste na Kerasu našli še druge karte / nasvete za GPU vadbo, jih delite spodaj v komentarjih. 🙂

Časovni žig:

Več od Datumbox