5 näpunäidet mitme GPU-ga treenimiseks Keras PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.

5 näpunäidet mitme GPU-ga treenimiseks Kerasega

Süvaõpe (2010. aastate lõpu lemmiksõna koos plokiahela/bitcoini ja andmeteaduse/masinõppega) on võimaldanud meil viimastel aastatel teha tõeliselt lahedaid asju. Peale algoritmide edusammude (mis põhinevad küll juba 1990. aastatest tuntud ideedel ehk "andmekaevandamise ajastul") võib selle edu peamisteks põhjusteks pidada suurte tasuta andmekogumite kättesaadavust, avatud lähtekoodiga raamatukogude kasutuselevõttu ja GPU-de kasutamine. Selles blogipostituses keskendun viimasele kahele ja jagan teiega mõningaid näpunäiteid, mida õppisin raskel teel.

Miks TensorFlow & Keras?

TensorFlow on Google'i poolt välja töötatud väga populaarne süvaõppe teek, mis võimaldab teil kiiresti prototüüpida keerukaid võrke. Sellel on palju huvitavaid funktsioone, nagu automaatne diferentseerimine (mis säästab teid kulufunktsioonide gradientide hindamisest/kodeerimisest) ja GPU-tugi (mis võimaldab korraliku riistvara abil hõlpsasti 200-kordset kiirust parandada). Lisaks pakub see Pythoni liidest, mis tähendab, et saate kiiresti prototüüpida, ilma et peaksite C- või CUDA-koodi kirjutama. Tõsi, TensorFlow asemel saab kasutada palju muid raamistikke, nagu Torch, MXNet, Theano, Caffe, Deeplearning4j, CNTK jne, kuid see kõik taandub teie kasutusjuhtumitele ja teie isiklikele eelistustele.

Aga miks Keras? Minu jaoks on otse TF-i kasutamine nagu masinõppe tegemine Numpyga. Jah, see on teostatav ja aeg-ajalt peate seda tegema (eriti kui kirjutate kohandatud kihte/kadufunktsioone), aga kas soovite tõesti kirjutada koodi, mis kirjeldab keerulisi võrke vektoroperatsioonide seeriana (jah, ma tean TF-is on kõrgema taseme meetodeid, kuid need pole nii lahedad kui Keras)? Mida teha ka siis, kui soovite kolida teise raamatukogusse? Siis peaksite tõenäoliselt koodi ümber kirjutama, mis on nõme. Ta ta taaa, Keras appi! Keras võimaldab teil kirjeldada oma võrke kõrgetasemeliste kontseptsioonide abil ja kirjutada koodi, mis on agnostiline, mis tähendab, et saate võrgustikke käitada erinevates süvaõppe teekides. Kerase juures meeldib mulle vaid see, et see on hästi kirjutatud, sellel on objektorienteeritud arhitektuur, lihtne panustada ja selles on sõbralik kogukond. Kui sulle meeldib, ütle aitäh François Chollet selle arendamise ja avatud lähtekoodiga hankimise eest.

Näpunäiteid ja näpunäiteid mitme GPU-ga treenimiseks

Ilma pikema jututa jätkame mõne näpunäidetega selle kohta, kuidas Kerase GPU-treeningust maksimaalselt ära kasutada, ja paarile probleemile, mida peaksite silmas pidama:

1. Multi-GPU koolitus ei ole automaatne

GPU-ga treenimismudelid Keras & Tensorflow abil on sujuvad. Kui teil on NVIDIA kaart ja olete installinud CUDA, tuvastavad raamatukogud selle automaatselt ja kasutavad seda koolituseks. Nii lahe! Aga mis siis, kui olete ärahellitatud jõmpsikas ja teil on mitu GPU-d? Kahjuks peate mitme GPU koolituse saavutamiseks natuke tööd tegema.
5 näpunäidet mitme GPU-ga treenimiseks Keras PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.
Võrgu paralleelstamiseks on mitu võimalust olenevalt sellest, mida soovite saavutada, kuid kaks peamist lähenemisviisi on mudeli ja andmete paralleelsus. Esimene võib teid aidata, kui teie mudel on liiga keeruline, et mahtuda ühte GPU-sse, samas kui viimane aitab täitmist kiirendada. Tavaliselt, kui inimesed räägivad mitme GPU-ga koolitusest, peavad nad silmas viimast. Varem oli seda raskem saavutada, kuid õnneks on Keras hiljuti lisanud utiliidimeetodi nimega mutli_gpu_mudel mis muudab paralleelõppe/ennustused lihtsamaks (praegu saadaval ainult TF-i taustaprogrammiga). Põhiidee on selles, et läbite oma mudeli meetodi ja see kopeeritakse erinevate GPU-de vahel. Algne sisend jagatakse tükkideks, mis suunatakse erinevatele GPU-dele ja seejärel koondatakse need üheks väljundiks. Seda meetodit saab kasutada paralleeltreeningu ja ennustuste saavutamiseks, kuid pidage meeles, et treenimisel ei skaleeru see vajaliku sünkroonimise tõttu lineaarselt GPU-de arvuga.

2. Pöörake tähelepanu partii suurusele

Kui teete mitme GPU-ga treeningut, pöörake tähelepanu partii suurusele, kuna sellel on mitu mõju kiirusele/mälule, mudeli ühtlustamisele ja kui te ei ole ettevaatlik, võite oma mudeli kaalu rikkuda!

Kiirus/mälu: Ilmselt mida suurem partii, seda kiirem on koolitus/ennustus. Selle põhjuseks on asjaolu, et GPU-desse andmete sisestamine ja sealt väljavõtmine on kulukas, mistõttu on väikestel partiidel rohkem üldkulusid. Teisest küljest, mida suurem on partii, seda rohkem mälu GPU-s vajate. Eriti treenimise ajal hoitakse iga kihi sisendeid mällu, kuna need on tagasilevitamise etapis vajalikud, nii et partii suuruse liiga suur suurendamine võib põhjustada mälu lõppemise tõrkeid.

Lähenemine: Kui kasutate oma mudeli treenimiseks Stochastic Gradient Decent (SGD) või mõnda selle varianti, peaksite meeles pidama, et partii suurus võib mõjutada teie võrgu võimet läheneda ja üldistada. Paljude arvutinägemisprobleemide puhul on tüüpilised partiide suurused vahemikus 32–512 näidet. Nagu Keskar jt sõnastage: "Praktikas on täheldatud, et suurema partii (kui 512) kasutamisel halveneb mudeli kvaliteet, mida mõõdetakse selle üldistusvõimega." Pange tähele, et teistel erinevatel optimeerijatel on erinevad omadused ja spetsiaalsed hajutatud optimeerimise tehnikad võivad probleemi lahendada. Kel huvi matemaatiliste detailide vastu, soovitan lugeda Joeri Hermansi lõputööd “Skaleeritava süvaõppe ja paralleelse gradiendi laskumise kohta".
5 näpunäidet mitme GPU-ga treenimiseks Keras PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.
Kaalu rikkumine: See on vastik tehniline detail, millel võivad olla laastavad tulemused. Kui teete mitme GPU-ga koolitust, on oluline toita kõik GPU-d andmetega. Võib juhtuda, et teie epohhi viimases partiis on määratletust vähem andmeid (kuna teie andmestiku suurust ei saa teie partii suurusega täpselt jagada). Seetõttu ei pruugi mõned GPU-d viimase etapi ajal andmeid vastu võtta. Kahjuks ei suuda mõned Kerase kihid, eriti partii normaliseerimise kiht, sellega toime tulla, mille tulemuseks on nan-väärtuste ilmumine kaaludesse (BN-kihi jooksev keskmine ja dispersioon). Asjade veelgi ebameeldivamaks muutmiseks ei jälgita probleemi koolituse ajal (kui õppefaas on 1), kuna konkreetne kiht kasutab hinnangutes partii keskmist/variatsiooni. Sellegipoolest kasutatakse ennustamise ajal (õppefaas 0-ks) jooksvat keskmist/dispersiooni, mis meie puhul võib muutuda nan, mis toob kaasa kehvad tulemused. Seega tehke endale teene ja veenduge alati, et teie partii suurus oleks mitme GPU treeningu ajal fikseeritud. Kaks lihtsat viisi selle saavutamiseks on kas tagasi lükata partiid, mis ei vasta eelmääratletud suurusele, või korrata partii kirjeid, kuni jõuate eelmääratletud suuruseni. Lõpuks pidage meeles, et mitme GPU-ga seadistuses peaks partii suurus olema teie süsteemis saadaolevate GPU-de arvu kordne.

3. GPU andmed Nälgimine ehk protsessorid ei suuda GPU-dega sammu pidada

Tavaliselt on sügavate võrkude treenimise/ennustamise kõige kallim osa GPU-del toimuv hinnang. Andmeid eeltöödeldakse taustal asuvates CPU-des ja neid edastatakse perioodiliselt GPU-dele. Sellegipoolest ei tohiks alahinnata graafikaprotsessorite kiirust; võib juhtuda, et kui teie võrk on liiga madal või eeltöötlusetapp on liiga keeruline, ei suuda teie CPU-d teie GPU-dega sammu pidada või teisisõnu ei toida nad neid piisavalt kiiresti andmetega. See võib kaasa tuua madala GPU kasutamise, mis tähendab raha/ressursside raiskamist.
5 näpunäidet mitme GPU-ga treenimiseks Keras PlatoBlockchain Data Intelligence'iga. Vertikaalne otsing. Ai.
Keras teostab tavaliselt partiide hinnanguid paralleelselt, kuid Pythoni GIL-i (Global Interpreter Lock) tõttu ei saa te Pythonis tegelikult saavutada tõelist mitmelõimelisust. Selleks on kaks lahendust: kas kasutage mitut protsessi (pange tähele, et selles on palju probleeme, mida ma siin ei käsitle) või hoidke eeltöötlusetapp lihtsana. Varem olen saatnud Kerasele tõmbetaotluse, et leevendada tarbetut pinget, mida me kujutise eeltöötluse ajal protsessoritele avaldasime, nii et enamikku kasutajaid ei tohiks tavaliste generaatorite kasutamine mõjutada. Kui teil on kohandatud generaatorid, proovige võimalikult palju loogikat suruda C-teekidesse (nt Numpy), sest mõned neist meetoditest tegelikult vabastage GIL mis tähendab, et saate paralleelsuse astet suurendada. Hea viis tuvastada, kas olete silmitsi GPU andmete näljaga, on jälgida GPU kasutust, kuid hoiatage siiski, et see pole ainus põhjus selle jälgimiseks (madalas kasutuses on süüdi ka sünkroonimine, mis toimub treeningu ajal mitme GPU vahel ). Tavaliselt saab GPU andmete nälgimist tuvastada, jälgides GPU katkestusi, millele järgneb pikki pause, mida ei kasutata. Varem olen hankinud Dstati jaoks avatud lähtekoodiga laienduse, mis aitab teil mõõta GPU kasutust, seega vaadake originaal blogi postitus.

4. Paralleelmudelite salvestamine

Oletame, et kasutasite mudeli paralleelseerimiseks meetodit mutli_gpu_model, treening on lõppenud ja nüüd soovite selle kaalusid säilitada. Halb uudis on see, et te ei saa sellel lihtsalt helistada save(). Praegu on Kerasel piirang, mis seda ei luba salvestage paralleelmudel. Selle vältimiseks on kaks võimalust: kas käivitage algmudeli viitele salvestamine () (kaalud värskendatakse automaatselt) või peate mudeli järjestama, lõigates paralleelse versiooni ja puhastades kõik mittevajalikud ühendused. Esimene võimalus on palju lihtsam, kuid tulevikus kavatsen avada avatud lähtekoodiga serialize() meetodi, mis täidab viimast.

5. Saadaolevate GPU-de loendamisel on vastik kõrvalmõju

Kahjuks on praegu meetodil tensorflow.python.client.device_lib.list_local_devices() vastik kõrvalmõju, mis põhjustab uue TensorFlow seansi loomise ja kõigi süsteemi saadaolevate GPU-de lähtestamise. See võib viia ootamatute tulemusteni, nagu näiteks määratust rohkemate GPU-de vaatamine või uute seansside enneaegne käivitamine (selle kohta saate lugeda kõiki üksikasju tõmba-päring). Sarnaste üllatuste vältimiseks soovitame selle asemel kasutada Kerase meetodit K.get_session().list_devices(), mis tagastab teile kõik seansil hetkel registreeritud GPU-d. Viimaseks, kuid mitte vähemtähtsaks, pidage meeles, et meetodi list_devices() kutsumine on kuidagi kallis, nii et kui teid huvitab saadaolevate GPU-de arv, helistage meetodile üks kord ja salvestage nende number kohalikku muutujasse.

See on kõik! Loodame, et see loend oli teile kasulik. Kui leidsite Kerast GPU-koolituse jaoks muid häid näpunäiteid, jagage neid allpool kommentaarides. 🙂

Ajatempel:

Veel alates Datumbox