Artikkelin ovat kirjoittaneet HPC AI Innovation Labin Rakshith Vasudev ja John Lockman lokakuussa 2019.
Kuten aiemmin on kerrottu, CheXNet on röntgenkuvauksen apuvälineenä käytettävä malli, joka voi tunnistaa DenseNet-arkkitehtuurin avulla jopa 14 patologista muutosta keuhkokuvasta. Useita vaihtoehtoja tutkittiin, jotta saatiin skaalatuksi sellaisen mallin koulutus, joka toimisi vähintään yhtä hyvin kuin alkuperäinen CheXNet-121. ResNet-50 vaikutti lupaavalta sekä skaalautuvuuden että koulutuksen tarkkuuden suhteen (positiivinen AUROC). Tekijät esittelivät skaalautuvuutta suoritinjärjestelmissä, mutta meitä kiinnostaa grafiikkasuoritinten rinnakkaisuus koulutuksen nopeuttamiseksi. Tässä artikkelissa kuvataan parhaita käytäntöjä, joilla saavutetaan enimmäissuorituskyky jaetussa skaalatussa CheXNetin koulutuksessa käyttäen Nvidia V100 SXM2 -grafiikkasuorittimia Dell EMC:n C4140-palvelimissa. Dell EMC:n PowerEdge C4140 takaa sekä tiheyden että suorituskyvyn neljällä Nvidia V100 -grafiikkasuorittimella SXM2-kokoonpanossa.
Laitteistokokoonpano: | Ohjelmiston määritys: |
---|---|
|
|
Uusien laskentalaitteiden (kuten grafiikka- ja tensorisuoritinten) avulla neuraaliverkkoja pystytään kouluttamaan yhä nopeammin, joten suorittimen tekemästä laskennasta saattaa muodostua pullonkaula. Tf.data-ohjelmointirajapinta sisältää tarvittavat osat, joilla voi suunnitella syöttötyöjonoja, jotka käyttävät suoritinta tehokkaasti ja optimoivat kaikki ETL-prosessin vaiheet.
Jotta koulutusvaiheen voi tehdä, koulutustiedot on ensin purettava ja muunnettava, minkä jälkeen ne on syötettävä kiihdyttimessä toimivaan malliin. Kiihdytin on kuitenkin vapaana yksinkertaisessa synkronisessa käyttöönotossa, kun suoritin valmistelee tietoja. Vastaavasti suoritin on vapaana, kun kiihdytin kouluttaa mallia. Siten koulutusvaihe koostuu sekä suorittimen esikäsittelyajasta että kiihdyttimen koulutusajasta
Työjonotus limittää koulutusvaiheen esikäsittelyn ja mallin suorittamisen. Kun kiihdytin tekee koulutusvaihetta, suoritin valmistelee tietoja vaiheeseen N+1. Se nopeuttaa koulutusta sekä tietojen purkamista ja muuntamista.
Ilman työjonotusta suoritin ja grafiikka-/tensorisuoritin on enimmäkseen vapaana:
Kuva 1: Peräkkäisessä suorituksessa grafiikkasuoritin on usein vapaana
Työjonotuksella aika vapaana vähenee merkittävästi:
Kuva 2: Työjonotus limittää suorittimen ja grafiikkasuorittimen käytön ja maksimoi grafiikkasuorittimen käyttöasteen
Tf.data-ohjelmointirajapinta tarjoaa ohjelmiston työjonomekanismin muunnoksessa tf.data.Dataset.prefetch transformation, jolla voi irrottaa tietojen tuotantoajan tietojen käyttöajasta. Muunnos käyttää nimenomaisesti taustasäiettä ja sisäistä puskuria elementtien esihakuun syöttötietojoukosta ennen kuin niitä pyydetään.
Lisätietoja: https://www.tensorflow.org/guide/performance/datasets
Noudattamalla TensorFlow'n ohjeita saadaan tämänkaltainen tietojen työjono (vanha tapa):
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/old_approach.py
Tällä tavalla, jota kutsutaan myös vanhaksi tavaksi, tf-tietojen työjono toimii seuraavasti (olettaen, että keuhkokuvan tietojoukko sisältää TFRecords-tietueita):
Tämä ei ole kuitenkaan tehokkain koodi. Se aiheuttaa pysähdyksiä, ja grafiikkasuorittimen käyttöaste on usein 0 %. Se ei siis käytä kiihdyttimiä tehokkaasti.
Jotta tf-tietojen työjono voidaan määrittää oikein, toimitaan TensorFlow'n virallisten mallien (tarkemmin ResNet-mallin) mukaisesti. Vanhan ja uuden tavan ero on siinä, miten tietojen työjono määritetään ennen sen syöttämistä malliin.
Uusi tapa näyttää tältä:
https://github.com/dellemc-hpc-ai/code-examples/blob/master/cheXNet-snippets/new_approach.py
TensorFlow'n virallinen eli uusi tapa:
Tässä vertaillaan vanhan ja uuden tavan suorituskykyä käyttäen TF Official -malleja.
Kuva 3: Uudella tavalla skaanaus on lähes lineaarinen.
Kuten huomataan, vanhalla tavalla suorituskyky on merkittävästi heikompi eikä skaalausta ole. Grafiikkasuorittimet ovat usein vähäisellä käytöllä tai vapaina, mikä laskee suorituskyvyn erittäin alas. Jos tiedonsiirtoa käsitellään hyvin, laskennan tehostaminen yhdessä grafiikkasuorittimessa tehostaa sitä usean solmun useassa grafiikkasuorittimessa.
Kun suorittimet tekevät esikäsittelyn rinnakkain, käsitellyt tiedot esihaetaan muistiin ja grafiikkasuorittimet hoitavat raskaimman kuorman eli matriisin kertauksen nopein yhteyksin, tämä uusi tapa vaikuttaa selvästi houkuttelevammalta usean solmun järjestelmissä.
Ympäristö, jossa töitä suoritetaan, on yhtä tärkeä kuin itse työt, koska oikeat kirjastot/moduulit vaikuttavat koulutuksen suorituskykyyn. Myös uusimmat CUDAan liittyvät kirjastot voivat parantaa suorituskykyä.
Asenna tämän ohjeen mukaan, jos toimivaa ympäristöä ei ole määritetty.
MPI on viestintäkirjasto, joka auttaa Horovodia jakamaan töitä. Erilaisia sidonta- ja yhdistämisparametrien vaihtoehtoja tutkittiin, ja paras parametri C4140:lle oli yhdistäminen kannan mukaan. Suositeltu asetus:mpirun --map-by socket -np x python pyfile.py --pyoptions
Jos samassa grafiikkasuorittimessa on käynnissä useita prosesseja, ne todennäköisesti kilpailevat grafiikkasuorittimen resursseista, käyttävät grafiikkasuorittimen muistia eivätkä saa mahdutetuksi kuhunkin erään enempää kuvia, ja tämä kaikki heikentää grafiikkasuorittimen suorituskykyä. Tensorflow 1.13.1 -versiota tutkittiin, mutta siinä näytti olevan vikaa. Se käynnisti useita prosesseja kussakin grafiikkasuorittimessa.
Yhteenveto: