5 vinkkiä usean GPU:n harjoitteluun Keras PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.

5 vinkkiä multi-GPU-koulutukseen Keran kanssa

Syvän oppimisen (2010-luvun lopun suosikkisanan lisäksi blockchain / bitcoin ja Data Science / Machine Learning) avulla olemme voineet tehdä todella hienoja juttuja viime vuosina. Muut kuin algoritmien edistysaskeleet (jotka tosin perustuvat jo 1990-luvulta lähtien tunnetuihin ideoihin, nimeltään "Data Mining era"), sen menestyksen pääasialliset syyt voivat johtua suurten ilmaisten tietoaineistojen saatavuudesta, avoimen lähdekoodin kirjastojen käyttöönotosta ja GPU: ien käyttö. Tässä blogiviestissä keskityn kahteen viimeiseen ja kerron teille joitain vinkkejä, jotka olen oppinut kovalla tavalla.

Miksi TensorFlow & Keras?

TensorFlow on Googlen kehittämä erittäin suosittu Deep Learning -kirjasto, jonka avulla voit prototyyppiä nopeasti monimutkaisia ​​verkkoja. Siihen kuuluu paljon mielenkiintoisia ominaisuuksia, kuten automaattinen erottelu (joka säästää arvioimasta / koodaamasta kustannustoimintojen kaltevuuksia) ja GPU-tuki (jonka avulla saat helposti 200x nopeuden parannuksen kunnollisella laitteistolla). Lisäksi se tarjoaa Python-käyttöliittymän, joka tarkoittaa, että voit prototyypit tehdä nopeasti tarvitsematta kirjoittaa C- tai CUDA-koodia. On totta, että TensorFlow: n sijasta on paljon muitakin kehyksiä, kuten Torch, MXNet, Theano, Caffe, Deeplearning4j, CNTK jne., Mutta kaikki riippuu käyttökohteestasi ja henkilökohtaisista mieltymyksistäsi.

Mutta miksi Keras? Minusta suora TF: n käyttäminen on kuin koneoppimista Numpyn kanssa. Kyllä, se on mahdollista, ja aika ajoin sinun on tehtävä se (varsinkin jos kirjoitat mukautettuja kerroksia / tappio-toimintoja), mutta haluatko todella kirjoittaa koodin, joka kuvaa monimutkaiset verkot vektorioperaatioiden sarjana (kyllä, tiedän TF: ssä on korkeamman tason menetelmiä, mutta ne eivät ole niin viileitä kuin Keras)? Entä jos haluat siirtyä toiseen kirjastoon? No, sinun on todennäköisesti kirjoitettava koodi, joka imee. Ta ta taaa, Keras pelastamaan! Keras antaa sinun kuvata verkostosi korkean tason käsitteillä ja kirjoittaa koodin, joka on taustanagnostinen, mikä tarkoittaa, että voit käyttää verkkoja eri syvän oppimisen kirjastojen välillä. Harvinaisia ​​asioita, joita rakastan Kerasiin, on se, että se on kirjoitettu hyvin, sillä on oliopohjainen arkkitehtuuri, siihen on helppo osallistua ja sillä on ystävällinen yhteisö. Kiitos, jos pidät siitä Francois Chollet sen kehittämiseen ja avoimeen hankintaan.

Vinkkejä ja hankintoja Multi-GPU-koulutukseen

Siirrytään seuraavaksi muutamiin vinkkeihin, jotka tekevät GPRS-harjoituksista Kerasilla ja parilla hankalla mielessäsi:

1. Multi-GPU-koulutus ei ole automaattista

Koulutusmallit GPU: lla Keras & Tensorflow -ohjelmalla ovat saumattomia. Jos sinulla on NVIDIA-kortti ja olet asentanut CUDA: n, kirjastot tunnistavat sen automaattisesti ja käyttävät sitä koulutukseen. Niin siistiä! Mutta entä jos olet pilaantunut kaveri ja sinulla on useita grafiikkasuoritimia? Valitettavasti joudut työskentelemään vähän saavuttaaksesi moni-GPU-koulutuksen.
5 vinkkiä usean GPU:n harjoitteluun Keras PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.
Verkon rinnakkaistamiseen on useita tapoja riippuen siitä, mitä haluat saavuttaa, mutta kaksi tärkeintä lähestymistapaa on malli ja datan rinnakkaistaminen. Ensimmäinen voi auttaa sinua, jos mallisi on liian monimutkainen sopiakseen yhteen GPU: han, kun taas jälkimmäinen auttaa, kun haluat nopeuttaa suoritusta. Tyypillisesti, kun ihmiset puhuvat multi-GPU-koulutuksesta, he tarkoittavat viimeksi mainittua. Sitä oli aiemmin vaikeampaa saavuttaa, mutta onneksi Keras on hiljattain sisällyttänyt apuohjelmamenetelmän nimeltä mutli_gpu_model mikä helpottaa rinnakkaisharjoittelua / ennustamista (tällä hetkellä saatavana vain TF-taustaohjelmalla). Pääideana on, että siirrät mallin menetelmän läpi ja se kopioidaan erilaisille GPU: ille. Alkuperäinen tulo jaetaan palasiksi, jotka syötetään erilaisille GPU: ille ja sitten ne yhdistetään yhdeksi lähdöksi. Tätä menetelmää voidaan käyttää rinnakkaisharjoituksen ja ennusteiden saavuttamiseen, muista kuitenkin, että harjoittelua varten se ei mittaudu lineaarisesti GPU: ien määrään vaaditun synkronoinnin vuoksi.

2. Kiinnitä huomiota erän kokoon

Kun teet moni-GPU-koulutusta, kiinnitä huomiota erän kokoon, koska sillä on useita vaikutuksia nopeuteen / muistiin, mallisi lähentymiseen ja jos et ole varovainen, saatat vioittaa mallin painot!

Nopeus / muisti: On selvää, että mitä suurempi erä, sitä nopeampi on harjoittelu / ennustaminen. Tämä johtuu siitä, että tietojen lisäämiseen ja poistamiseen GPU: ista liittyy yleiskustannuksia, joten pienissä erissä on enemmän yleiskustannuksia. Kun läppä on, sitä suurempi erä, sitä enemmän muistia tarvitset GPU: lla. Varsinkin harjoittelun aikana kunkin kerroksen tulot pidetään muistissa, koska niitä vaaditaan takaisin etenemisvaiheessa, joten erän koon liiallinen lisääminen voi johtaa muistin loppumisvirheisiin.

Lähentyminen: Jos käytät mallia harjoitellaan stokastista gradienttihaitoa (SGD) tai jotain sen muunnelmista, sinun tulisi pitää mielessä, että erän koko voi vaikuttaa verkon kykyyn lähentyä ja yleistyä. Tyypilliset eräkoot monissa tietokoneen näköongelmissa ovat välillä 32 - 512 esimerkkiä. Kuten Keskar et ai sanoen: "Käytännössä on havaittu, että käytettäessä suurempaa erää (kuin 512) mallin laatu huononee mitattuna sen kyvyllä yleistyä." Huomaa, että muilla erilaisilla optimoijilla on erilaiset ominaisuudet ja erikoistuneet hajautetut optimointitekniikat voivat auttaa ongelmassa. Jos olet kiinnostunut matemaattisista yksityiskohdista, suosittelen lukemaan Joeri Hermansin tutkielmaa “Skaalattavissa olevalla syvällä oppimisella ja rinnakkaisella kaltevuuslaskemisella".
5 vinkkiä usean GPU:n harjoitteluun Keras PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.
Painojen vioittuminen: Tämä on ilkeä tekninen yksityiskohta, jolla voi olla tuhoisia tuloksia. Kun teet moni-GPU-koulutusta, on tärkeää syöttää kaikki GPU: t tiedoilla. Voi tapahtua, että aikakausi viimeisimmällä erällä on vähemmän tietoja kuin määriteltiin (koska tietojoukon kokoa ei voida jakaa tarkalleen erän koon mukaan). Tämä saattaa johtaa siihen, että jotkut GPU: t eivät vastaanota tietoja viimeisen vaiheen aikana. Valitettavasti jotkut Keras-kerrokset, etenkin erän normalisointikerros, eivät kykene selviytymään siitä, joka johtaa nanoarvojen esiintymiseen painoissa (juokseva keskiarvo ja varianssi BN-kerroksessa). Jotta asiat olisivat jopa ilkeämpiä, ei tarkkailla ongelmaa harjoituksen aikana (kun oppimisvaihe on 1), koska tietty kerros käyttää erän keskiarvoa / varianssia arvioissa. Siitä huolimatta ennusteiden aikana (oppimisvaihe asetetaan arvoon 0) käytetään juoksevaa keskiarvoa / varianssia, josta meidän tapauksessamme voi tulla nanotulos, mikä johtaa huonoihin tuloksiin. Joten tee itsellesi palvelus ja varmista aina, että eräsi koko on kiinteä, kun teet multi-GPU-koulutusta. Kaksi yksinkertaista tapaa saavuttaa tämä on joko hylkäämällä erät, jotka eivät vastaa ennalta määritettyä kokoa, tai toista erän tietueet, kunnes saavutat ennalta määritetyn koon. Viimeisenä, mutta ei vähäisimpänä, pidä mielessä, että usean GPU: n asennuksessa erän koon tulisi olla moninkertainen järjestelmässäsi käytettävissä olevien GPU: ien lukumäärällä.

3. GPU-tiedot Starvation eli CPU: t eivät voi pysyä GPU: n kanssa

Tyypillisesti kallein osa syvien verkkojen koulutuksessa / ennustamisessa on arvio, joka tapahtuu GPU: lla. Tiedot esikäsitellään taustalla olevissa CPU: issa ja ne syötetään GPU: ille säännöllisin väliajoin. Tästä huolimatta ei pidä aliarvioida kuinka nopeasti GPU: t ovat; voi käydä niin, että jos verkkoosi on liian matala tai esikäsittelyvaihe on liian monimutkainen, etteivät prosessorisi voi pysyä GPU: n kanssa tai toisin sanoen he eivät syötä heille tietoja riittävän nopeasti. Tämä voi johtaa alhaiseen GPU-käyttöasteeseen, mikä tarkoittaa rahan / resurssien tuhlaamista.
5 vinkkiä usean GPU:n harjoitteluun Keras PlatoBlockchain Data Intelligencen avulla. Pystysuuntainen haku. Ai.
Keras suorittaa tyypillisesti erien arviot rinnakkain. Pythonin GIL (Global Interpreter Lock) -sovelluksesta johtuen et kuitenkaan voi todella saavuttaa aitoa monisäikeistä pythonia. Tähän on olemassa kaksi ratkaisua: joko käytä useita prosesseja (huomaa, että tässä on paljon hankaluuksia, joita en aio kattaa täällä) tai pidä esikäsittelyvaiheesi yksinkertaisena. Olen aiemmin lähettänyt Keras-palvelupyynnön lievittääkseen joitain tarpeettomia rasitteita, joita panimme CPU: ille kuvan esikäsittelyn aikana, joten useimpiin käyttäjiin ei pitäisi vaikuttaa, jos he käyttävät vakiogeneraattoreita. Jos sinulla on mukautettuja generaattoreita, yritä ajaa mahdollisimman paljon logiikkaa C-kirjastoihin, kuten Numpy, koska jotkut näistä menetelmistä vapauta GIL mikä tarkoittaa, että voit lisätä rinnakkaisuuden astetta. Hyvä tapa havaita, kohtaako GPU-tietojen nälkää, on seurata GPU: n käyttöä. Siitä huolimatta, että tämä ei ole ainoa syy havaita tämä (synkronointi, joka tapahtuu harjoituksen aikana usean GPU: n välillä, on syyllinen myös alhaiseen käyttöasteeseen) ). Tyypillisesti GPU-datan nälkäisyys voidaan havaita tarkkailemalla GPU-purskeita, joita seuraa pitkät tauot ilman hyödyntämistä. Olen aiemmin avannut Dstatin avoimen lähdekoodin laajennuksen, joka voi auttaa mittaamaan GPU: n käyttöä, joten katso alkuperäinen blogin viesti.

4. Rinnakkaismallien tallentaminen

Oletetaan, että käytit mutli_gpu_model-menetelmää mallin suuntaamiseen, koulutus päättyi ja haluat nyt säilyttää sen painot. Huono uutinen on, että et voi soittaa vain tallentaa () siihen. Tällä hetkellä Kerasilla on rajoitus, joka ei salli sinua tallenna rinnakkaismalli. Tähän on kaksi tapaa: joko kutsua tallennus () alkuperäisen mallin viitteeseen (painot päivitetään automaattisesti) tai sinun on sarjettava malli hidastamalla rinnakkaisversio ja puhdistamalla kaikki tarpeettomat yhteydet. Ensimmäinen vaihtoehto on paljon helpompaa, mutta aion tulevaisuudessa avata lähdekoodin serialize () -menetelmän, joka suorittaa jälkimmäisen.

5. Käytettävissä olevien GPU: ien laskemisella on ilkeä sivuvaikutus

Valitettavasti tällä hetkellä tensorflow.python.client.device_lib.list_local_devices () -menetelmällä on ilkeä sivuvaikutus, joka aiheuttaa uuden TensorFlow-istunnon luomisen ja kaikkien järjestelmän käytettävissä olevien GPU: ien alustamisen. Tämä voi johtaa odottamattomiin tuloksiin, kuten katsella määriteltyä enemmän GPU: ita tai alustaa ennenaikaisesti uusia istuntoja (voit lukea kaikki tämän tiedot pull-pyyntö). Samanlaisten yllätyksien välttämiseksi suositellaan sen sijaan käyttämään Kerasin K.get_session (). List_devices () -menetelmää, joka palauttaa sinulle kaikki istunnossa tällä hetkellä rekisteröidyt GPU: t. Viimeisenä, mutta ei vähäisimpänä, pidä mielessä, että list_devices () -metodiin soittaminen on jotenkin kallista, joten jos olet kiinnostunut käytettävissä olevien GPU-laitteiden määrästä, soita menetelmälle kerran ja tallenna niiden numero paikalliselle muuttujalle.

Se siitä! Toivottavasti pidit tätä luetteloa hyödyllisenä. Jos olet löytänyt muita hanhia / vinkkejä GPRS-koulutukseen Keralla, jaa ne alla kommentteihin. 🙂

Aikaleima:

Lisää aiheesta Datumbox