Ohjelmointi

Katsaus: Nvidian Rapids tuo Python-analytiikan GPU: lle

Koneoppimismallien rakentaminen on toistuva prosessi. Usein rote ja rutiini, tämä on "nopein läpi syklin voitot" -peli, koska mitä nopeammin voit toistaa, sitä helpompaa on tutkia uusia teorioita ja saada hyviä vastauksia. Tämä on yksi syy siihen, miksi tekoälyn käytännön yrityskäyttöä hallitsevat nykyään suurimmat yritykset, jotka voivat heittää valtavia resursseja ongelmaan.

Rapids on sateenvarjo useille Nvidian inkuboimille avoimen lähdekoodin projekteille, joka sijoittaa koko prosessointijohdon GPU: lle, eliminoi I / O-sidotut tiedonsiirrot, samalla kun se lisää huomattavasti kunkin yksittäisen vaiheen nopeutta. Se tarjoaa myös tiedon yhteisen muodon, mikä helpottaa tietojen vaihtamista eri järjestelmien välillä. Käyttäjätasolla Rapids jäljittelee Python-sovellusliittymää helpottaakseen siirtymistä kyseiselle käyttäjäkannalle.

Tidyverse-keittokirja

Nopea ekosysteemin arkkitehtuuri

Rapids-projektin tavoitteena on toistaa pääosin Pythonin koneoppimisen ja data-analytiikan sovellusliittymät, mutta GPU: ille eikä suorittimille. Tämä tarkoittaa, että Python-kehittäjillä on jo kaikki tarvitsemansa GPU: n suorittamiseen tarvitsematta oppia CUDA-ohjelmoinnin ja rinnakkaisoperaatioiden matalan tason yksityiskohtia. Pythonistas voi kehittää koodin koneelle, joka ei ole GPU-yhteensopiva, ja sitten suorittaa muutamalla muutoksella se kaikilla käytettävissä olevilla GPU: illa.

Nvidia CUDA -työkalupakki tarjoaa matalamman tason primitiivit matematiikkakirjastoille, rinnakkaisalgoritmeille ja kaavioanalytiikalle. Arkkitehtuurin ytimessä on GPU-datakehys, joka perustuu Apache Arrow -näyttöön, joka tarjoaa sarakkeisen muistin sisäisen tietorakenteen, joka ohjelmoi ohjelmointikielen agnostiaa. Käyttäjä on vuorovaikutuksessa GPU-datakehyksen kanssa cuDF: n ja Pandas-tyyppisen API: n kautta. Dask, Python-kirjasto rinnakkaislaskentaan, jäljittelee ylävirran Python-sovellusliittymiä ja toimii rinnakkaislaskennassa CUDA-kirjastojen kanssa. Ajattele Daskia Sparkina Pythonille.

NOPEA

Kolme pääprojektia, cuDF, cuML ja cuGraph, kehitetään itsenäisesti, mutta ne on suunniteltu toimimaan saumattomasti yhdessä. Osana projektia kehitetään myös siltoja laajempaan Python-ekosysteemiin.

Nopea asennus

Asennus Anacondan kautta Linux-koneelle AWS: ssä oli enimmäkseen suoraviivaista, mikä esti muutamia hikkauksia riippuvuuksien muutoksen vuoksi versiossa 0.11. C / C ++ -kirjastojen asentaminen libcudfin käyttöä varten ei ollut niin helppoa, ja suosittelen pitämään kiinni Python-sovellusliittymien ja Condan asennusprosessista. Rapids sisältää Jupyter-muistikirjan, joka on saatavana myös Googlen ilmaisessa Colabissa, mikä tekee aloittamisesta helppoa. Käytin Jupyter-muistikirjan versiota 0.10 koodin suorittamiseen Google Colabissa, joka sisältää Nvidia Tesla T4 -näytönohjaimen.

Rapidsin GPU-datakehys

Datatieteen työnkulun ytimessä on datakehys. Täällä tapahtuu piirustekniikka ja suurin osa ajasta kuluu, kun datatutkijat kiertävät likaisia ​​tietoja. cuDF on Rapids-projekti GPU-pohjaiselle Pandas-tyyppiselle datakehykselle. CuDF: n taustalla on libcudf, C ++ -kirjasto, joka toteuttaa matalan tason primitiivejä Apache Arrow -datan tuontia varten, elementteittäin matematiikan suorittamista matriiseille ja lajittelun, liittämisen, ryhmittelemisen, pienentämisen ja muiden toimintojen suorittamista GPU: n sisäisissä muistimatriiseissa. Libcudfin perustietorakenne on GPU DataFrame (GDF), joka puolestaan ​​on mallinnettu Apache Arrow'n pylväsdatasäilöstä.

NOPEA

Rapids Python -kirjasto tarjoaa käyttäjälle korkeamman tason rajapinnan, joka muistuttaa datakehyksiä, kuten Pandas. Monissa tapauksissa Pandas-koodi toimii muuttumattomana cuDF: ssä. Jos näin ei ole, tarvitaan yleensä vain pieniä muutoksia.

Käyttäjän määrittelemät toiminnot cuDF: ssä

Kun olet ohjannut perustietojen käsittelyn, on joskus tarpeen käsitellä rivejä ja sarakkeita käyttäjän määrittelemillä toiminnoilla (UDF). cuDF tarjoaa PyData-tyylisen API: n koodin kirjoittamiseen kurssirakeisempien tietorakenteiden, kuten matriisien, sarjojen ja liikkuvien ikkunoiden, käsittelemiseksi. Tällä hetkellä tuetaan vain numeerisia ja loogisia tyyppejä. UDF: t kootaan käyttämällä Numba JIT-kääntäjää, joka käyttää LLVM: n osajoukkoa numeeristen toimintojen kokoamiseen CUDA-konekoodiin. Tämä johtaa huomattavasti nopeampiin ajoaikoihin GPU: lla.

Jouset cuDF: ssä

Vaikka grafiikkasuorittimet ovat upeita kelluvien vektorien nopeaan käsittelyyn, niitä ei tyypillisesti ole käytetty merkkijonodatan käsittelyyn, ja todellisuudessa suurin osa tiedoista tulee meille merkkijonojen muodossa. cuStrings on GPU-merkkijonojen manipulointikirjasto, joka jakaa, regexe-asetuksia, ketjutusta, tunnusten korvaamista jne. merkkijonoryhmissä. Kuten muut cuDF-toiminnot, se toteutetaan C / C ++ -kirjastona (libnvStrings) ja kääritään Python-kerroksella, joka on suunniteltu jäljittelemään pandoja. Vaikka merkkijonotietotyyppiä ei ole optimoitu suoritettavaksi grafiikkasuoritimissa, koodin rinnakkaisen suorittamisen pitäisi antaa nopeus CPU-pohjaiseen merkkijonon manipulointiin.

Tietojen saaminen cuDF: ään tai siitä

Dataframe I / O: ta hoitaa oma kirjasto, cuIO. Kaikki yleisimmin käytetyt muodot ovat tuettuja, mukaan lukien nuoli, ORC, parketti, HDF5 ja CSV. Jos sinulla on onni käyttää DGX-2-laitteistoa, voit käyttää GPU Direct Storage -integraatiota siirtääksesi tietoja suoraan nopeasta tallennustilasta GPU: han ilman prosessoria. Kuolevaiset käyttäjät arvostavat silti GPU: n nopeutta suurten tietojoukkojen purkamisessa ja tiukkaa integraatiota Python-ekosysteemiin.

GPU Direct Storage on tällä hetkellä alfaversiossa, ja julkaisun jälkeen se on saatavana useimmissa Tesla-näytönohjaimissa. Voit luoda GPU-datakehyksen NumPy-matriiseista, Pandas DataFrame- ja PyArrow-taulukoista vain yhdellä rivillä koodia. Muut hankkeet voivat vaihtaa tietoja __cuda_array_interface__ Numba-ekosysteemiin kuuluville kirjastoille. DLPack hermoverkkokirjastoille on myös tuettu käyttöliittymä.

Todennäköisesti suurin haitta cuDF: n käytössä on yhteentoimivuuden puute Pythonin ulkopuolella. Mielestäni keskittyminen vahvaan C / C ++ -sovellusliittymien perustaan, kuten Arrow on tehnyt, mahdollistaisi laajemman ekosysteemin ja hyödyttäisi koko projektia.

Rapidsin cuML

cuML: n ilmoitettujen tavoitteiden on olla "GPU: iden tarjoama Pythonin Scikit-learn". Teoriassa tämä tarkoittaa, että sinun tarvitsee vain muuttaa tuontilauseketta ja ehkä virittää muutamia parametreja, jotta voidaan ottaa huomioon prosessorin suorittamisen erot, joissa joskus raakaa voimaa koskeva lähestymistapa on parempi. GPU-pohjaisen Scikit-learnin hyötyä on vaikea aliarvioida. Nopeudet ovat merkittäviä, ja data-analyytikot voivat olla monta kertaa tuottavampia. C ++ -sovellusliittymä ei ole aivan valmis laajaan kulutukseen Python-sidostensa ulkopuolella, mutta tämän odotetaan paranevan.

cuML sisältää myös sovellusliittymiä hyperparametrien virittämiseen Daskin kautta, joka on kirjasto Pythonin skaalaamiseen useille solmuille. Monet koneoppimisalgoritmit voidaan tehdä tehokkaasti rinnakkain, ja cuML kehittää aktiivisesti sekä multi-GPU- että multi-node, multi-GPU -algoritmeja.

NOPEA

Rapidsin cuGraph

cuGraph on Rapids-ekosysteemin kolmas jäsen, ja muiden tapaan cuGraph on täysin integroitu cuDF: ään ja cuML: ään. Se tarjoaa hyvän valikoiman graafi-algoritmeja, primitiivejä ja apuohjelmia, joilla kaikilla on GPU-nopeutettu suorituskyky. CuGraphin sovellusliittymien valinta on jonkin verran laajempi kuin Rapidsin muissa osissa, ja kaikki käytettävissä ovat NetworkX, Pregel, GraphBLAS ja GQL (Graph Query Language).

NOPEA

cuGraph on enemmän kuin henkinen työkalupakki kuin cuML. Graafiteknologia on nopeasti liikkuva tila sekä tiedemaailmassa että teollisuudessa. Siten cuGraph antaa suunnittelijalle pääsyn C ++ -kerrokseen ja kaavioprimitiiveihin, kannustamalla kolmansia osapuolia kehittämään tuotteita cuGraphia käyttämällä. Useat yliopistot ovat osallistuneet, ja Texas A&M: n (GraphBLAS), Georgia Techin (Hornet) ja UC Davisin (Gunrock) projektit on "tuotettu" ja sisällytetty cuGraph-sateenvarjoon. Jokainen projekti tarjoaa erilaiset ominaisuudet, kaikki GPU-kiihdytetyt, ja kaikki niiden takana on sama cuDF-tietokehys.

NetworkX on Python-sovellusliittymä, johon Rapids-tiimi on kohdistanut natiiviliittymänsä. Tämän käyttöliittymän kautta on käytettävissä useita algoritmeja. Vaikka vain sivun sijoitus on multi-GPU, tiimi työskentelee aktiivisesti muiden multi-GPU-versioiden parissa, jos mahdollista.

NOPEA

Yksi cuGraph-aliprojekteista, jotka pidin mielenkiintoisina, on cugraphBLAS, pyrkimys standardoida graafi-algoritmien rakennuspalikat lineaarisen algebran kielellä. Perustuu GraphBLAS: iin (graphblas.org), mukautettuun tietorakenteeseen, joka on suunniteltu harvaan dynaamiseen graafien käsittelyyn.

Toinen cuGraph-aliprojekti, Hornet, tarjoaa järjestelmästä riippumattoman muodon kaaviotietojen sisällyttämiseksi, analoginen tapaan, jolla Apache-nuoli tarjoaa järjestelmästä riippumattoman tavan käsitellä datakehyksiä. Hornet tukee useimpia suosittuja kaaviomuotoja, kuten SNAP, mtx, metis ja reunat.

Python-yhteisöä lähellä olemisen hengen mukaisesti Pythonin alkuperäistä NetworkX-pakettia voidaan käyttää monimutkaisten verkkojen tutkimiseen. Tämä sisältää kaavioiden ja monikuvaajien tietorakenteet, jotka on täydennetty uudelleen CUDA-primitiivien avulla, jolloin voit käyttää monia tavallisia kaavioalgoritmeja ja suorittaa verkon rakenne- ja analyysitoimenpiteitä. Suurin osa algoritmeista on yksi GPU, kuten NetworkX. Siitä huolimatta niiden suorittaminen pelkästään GPU: lla tarjoaa huomattavaa nopeutta, kun taas työ siirtyy edelleen monen GPU: n toteutuksiin.

Rapids-etenemissuunnitelmassa

Kun otetaan huomioon GPU-pohjaisen analytiikan tarjoama valtava nopeus, tuleviin versioihin on tulossa muutama uusi projekti.

DLPack ja array_interface syvälliseen oppimiseen

Monikerroksiset hermoverkot olivat yksi ensimmäisistä grafiikkasuorittimiin siirretyistä työkuormista, ja tälle koneoppimisen käyttötapaukselle on olemassa huomattava määrä koodia. Aikaisemmin DLPack oli tosiasiallisesti standardi tiedonvaihdolle syvällisesti oppivien kirjastojen välillä. Nykyään array_interface on yleisesti tuettu. Rapids tukee molempia.

cuSignal

Kuten useimmat muut Rapids-projektit, cuSignal on GPU-nopeutettu versio olemassa olevasta Python-kirjastosta, tässä tapauksessa SciPy Signal -kirjastosta. Alkuperäinen SciPy Signal -kirjasto perustuu NumPyyn, joka korvataan sen GPU-nopeutetulla vastaavalla CuPy in cuSignal. Tämä on hyvä esimerkki Rapids-suunnittelufilosofiasta työssä. Muutamia mukautettuja CUDA-ytimiä lukuun ottamatta GPU: n portti sisältää enimmäkseen tuontilausekkeen korvaamisen ja muutamien toimintoparametrien säätämisen.

Signaalinkäsittelyn tuominen Rapids-taittoon on älykäs liike. Signaalinkäsittely on kaikkialla, ja sillä on monia välittömästi hyödyllisiä kaupallisia sovelluksia teollisuudessa ja puolustuksessa.

cuSpatial

Avaruus- ja tilapäiset toiminnot ovat hyviä ehdokkaita grafiikkasuoritinten kiihdytykselle, ja ne ratkaisevat monia reaalimaailman ongelmia, joita kohtaamme jokapäiväisessä elämässä, kuten liikennemallien, maaperän terveyden / laadun ja tulvariskien analysointi. Suurella osalla mobiililaitteiden, myös droonien, keräämistä tiedoista on paikkatietokomponentti, ja alueellinen analyysi on älykaupungin ydin.

Muiden komponenttien tapaan suunniteltu cuSpatial on C ++ -kirjasto, joka on rakennettu CUDA-primitiiveihin ja Thrust-vektorinkäsittelykirjastoon ja käyttää cuDF: ää tiedonsiirtoon. C ++ -kirjaston kuluttajat voivat lukea piste-, sylinteriviiva- ja polygonitiedot käyttämällä C ++ -lukijaa. Python-käyttäjien on parempi käyttää olemassa olevia Python-paketteja, kuten Shapely tai Fiona, täyttämään NumPy-taulukko, sitten käyttämällä cuSpatial Python -sovellusliittymää tai muuntamalla cuDF-tietokehyksiksi.

cuxfilter tietojen visualisointiin

Tietojen visualisointi on perustavaa laatua sekä analytiikan työnkulussa että tulosten esittämisessä tai raportoinnissa. Silti kaiken taian vuoksi, että GPU: t voivat työskennellä itse datan suhteen, näiden tietojen saaminen selaimeen ei ole triviaali tehtävä. Crossfilter JavaScript -kirjaston innoittama cuxfilter pyrkii kuromaan tämän aukon tarjoamalla pinon, jonka avulla kolmannen osapuolen visualisointikirjastot voivat näyttää tietoja cuDF-tietokehyksissä.

Cuxfilterin toistoja on ollut muutama, kun joukkue lajittelee parhaat arkkitehtuurit ja liitinkuviot. Uusin iterointi hyödyntää Jupyter-muistikirjoja, Bokeh-palvelinta ja PyViz-paneeleja, kun taas integraatiokokeissa on Uberin, Falconin ja PyDeckin projekteja. Tämä komponentti ei ole vielä valmis ensi aikaan, mutta se on tarkoitus julkaista Rapids 0.13: ssa. Siellä on paljon liikkuvia osia, enkä kokeillut sitä omasta kädestäni, mutta jos se täyttää lupauksensa, se on hieno lisäys Rapids-työkalupakettiin.

Suurentaminen ja pienentäminen Daskin avulla

Tehtävä on hajautettu Python-tehtävien ajoitus, jolla on samanlainen rooli Pythonille kuin Apache Spark Scalalle. Dask-cuDF on kirjasto, joka tarjoaa osioituja, GPU-tukemia tietokehyksiä. Dask-cuDF toimii hyvin, kun aiot käyttää cuML: ää tai kun lataat tietojoukkoa, joka on suurempi kuin GPU-muisti tai hajautettu useisiin tiedostoihin.

Kuten Spark RDD (Resilient Distributed Dataset), Dask-cuDF-hajautettu tietokehys käyttäytyy enimmäkseen samalla tavalla kuin paikallinen, joten voit kokeilla paikallista laitettasi ja siirtyä hajautettuun malliin, kun haluat laajentaa. Dask-cuML antaa cuML-monisolmuominaisuudet, joten se on hyvä vaihtoehto, kun sinulla ei ole budjettia DGX-työasemalle.