Programiranje

Pregled: Nvidijin Rapids na GPU pripelje analitiko Python

Izdelava modelov strojnega učenja je ponavljajoč se postopek. Pogosto je to navadno in rutinsko, to je igra "najhitreje skozi cikel zmaga", saj hitreje kot lahko ponovite, lažje je raziskovati nove teorije in dobiti dobre odgovore. To je eden od razlogov, da danes v praktični uporabi umetne inteligence v podjetjih prevladujejo največja podjetja, ki lahko problem rešijo ogromno.

Rapids je dežnik za več odprtokodnih projektov, ki jih je inkubirala Nvidia, ki celotni cevovod za obdelavo postavi na GPU, odpravi prenose podatkov, vezane na V / I, hkrati pa znatno poveča hitrost vsakega posameznega koraka. Zagotavlja tudi skupno obliko podatkov, kar olajša breme izmenjave podatkov med različnimi sistemi. Na uporabniški ravni Rapids posnema API Python, da olajša prehod za to uporabniško bazo.

Kuharica Tidyverse

Arhitektura ekosistema Rapids

Cilj projekta Rapids je večinoma ponoviti API-je strojnega učenja in podatkovne analitike Pythona, vendar za GPU in ne za CPU. To pomeni, da razvijalci Pythona že imajo vse, kar potrebujejo za zagon na GPU, ne da bi se morali naučiti podrobnosti o programiranju in vzporednih operacijah CUDA na nizki ravni. Pythonistas lahko razvije kodo na računalniku, ki nima GPU, nato pa jo z nekaj popravki zažene na vseh GPU-jih, ki so jim na voljo.

Komplet orodij Nvidia CUDA ponuja primitive nižje ravni za matematične knjižnice, vzporedne algoritme in analitiko grafov. V središču arhitekture je podatkovni okvir GPU, ki temelji na Apache Arrow in zagotavlja stolpčno podatkovno strukturo v pomnilniku, ki je agnostična v programskem jeziku. Uporabnik sodeluje z podatkovnim okvirom GPU prek cuDF in API-ja, podobnega Pandasu. Dask, knjižnica Python za vzporedno računanje, posnema API-je Python v zgornjem toku in za vzporedno računanje deluje s knjižnicami CUDA. Dask si omislite kot Iskro za Python.

HITRE

Trije glavni projekti, cuDF, cuML in cuGraph, so razviti neodvisno, vendar zasnovani za nemoteno sodelovanje. V okviru projekta se razvijajo tudi mostovi do širšega ekosistema Python.

Hitra namestitev

Namestitev prek Anaconde na računalnik Linux v AWS je bila večinoma enostavna in je zaradi spremembe odvisnosti v različici 0.11 preprečila nekaj kolcanja. Namestitev knjižnic C / C ++ za uporabo libcudf ni bila tako enostavna in priporočam, da se držite API-jev Python in namestitvenega postopka Conda. Rapids vključuje prenosnik Jupyter, ki je na voljo tudi v Googlovem brezplačnem Colabu, kar olajša začetek. Za prenos kode v Google Colab, ki vključuje grafični procesor Nvidia Tesla T4, sem uporabil prenosnik Jupyter različice 0.10.

Rapidsov GPU podatkovni okvir

V središču vsakega poteka dela na področju podatkov je okvir podatkov. Tu se zgodi inženiring lastnosti in tam porabi večino časa, ko se znanstveniki premešajo umazane podatke. cuDF je projekt Rapids za GPU-jev, Pandasov podoben podatkovni okvir. Podlaga za cuDF je libcudf, knjižnica C ++, ki izvaja primitive na nizki ravni za uvoz podatkov Apache Arrow, izvajanje elementov matematične matematike na nizih in izvajanje razvrščanja, združevanja, združevanja, zmanjšanja in drugih operacij na pomnilniških matrikah v GPU. Osnovna podatkovna struktura libcudf je GPU DataFrame (GDF), ki je po vzoru stolpne shrambe podatkov Apache Arrow.

HITRE

Knjižnica Rapids Python uporabniku predstavlja vmesnik višje ravni, ki spominja na podatkovne okvire, kot so tisti v Pandah. V mnogih primerih se koda Pandas na CuDF izvaja nespremenjena. Kadar ni tako, so običajno potrebne le manjše spremembe.

Uporabniško določene funkcije v cuDF

Ko pretečete osnovno obdelavo podatkov, je včasih treba vrstice in stolpce obdelati z uporabniško določenimi funkcijami (UDF). cuDF ponuja API sloga PyData za pisanje kode za obdelavo bolj tečajnih podatkovnih struktur, kot so nizi, nizi in premična okna. Trenutno so podprte samo številske in logične vrste. UDF se prevedejo s pomočjo prevajalnika Numba JIT, ki uporablja podmnožico LLVM za prevajanje numeričnih funkcij v strojno kodo CUDA. To ima za posledico bistveno hitrejši čas delovanja GPU-ja.

Strune v cuDF

Čeprav so grafični procesorji fantastični za hitro obdelavo float vektorjev, jih običajno niso uporabljali za obdelavo nizovnih podatkov, v resnici pa večina podatkov pride do nas v obliki nizov. cuStrings je knjižnica za manipulacijo nizov GPU za razdeljevanje, uporabo regularnih izrazov, združevanje, zamenjavo žetonov itd. v nizih nizov. Kot druge funkcije cuDF je tudi ta implementiran kot knjižnica C / C ++ (libnvStrings) in ovit s plastjo Python, ki posnema Pande. Čeprav vrsta podatkov niza ni optimizirana za izvajanje na grafičnih procesorjih, bi moralo vzporedno izvajanje kode pospešiti manipulacijo nizov na osnovi CPU.

Pridobivanje podatkov v ali iz CuDF

I / O podatkovnega okvira upravlja namenska knjižnica cuIO. Podprti so vsi najpogosteje zajeti formati, vključno z Arrow, ORC, Parket, HDF5 in CSV. Če imate srečo, da uporabljate strojno opremo DGX-2, lahko z integracijo neposrednega pomnilnika GPU prenesete podatke neposredno iz hitrega pomnilnika na grafični procesor, ne da bi pri tem uporabili CPU. Mortalni uporabniki bodo še vedno cenili pospešitev, ki jo daje GPU pri dekompresiji velikih naborov podatkov, in tesno integracijo z ekosistemom Python.

GPU Direct Storage je trenutno v različici alfa in bo po izidu na voljo na večini grafičnih procesorjev Tesla. Iz tabel NumPy, Pandas DataFrames in PyArrow lahko samo z eno vrstico kode ustvarite podatkovni okvir GPU. Drugi projekti si lahko izmenjujejo podatke prek __cuda_array_interface__ za knjižnice, ki spadajo v ekosistem Numbe. Podprti je tudi DLPack za knjižnice nevronskih omrežij.

Verjetno največja pomanjkljivost pri uporabi cuDF je pomanjkanje interoperabilnosti zunaj Pythona. Mislim, da bi osredotočenost na močne temelje API-jev C / C ++, kot je storila Arrow, omogočila širši ekosistem in koristila projektu kot celoti.

CuML Rapids

Cilji cuML-a so biti "Python's Scikit-learn powered by GPU". Teoretično to pomeni, da morate spremeniti samo izjavo o uvozu in morda prilagoditi nekaj parametrov, da upoštevate razlike v delovanju na CPU, kjer je včasih boljši pristop s surovo silo. Korist Scikit-learninga, ki temelji na GPU, je težko podceniti. Pospeševanja so precejšnja, analitiki podatkov pa so lahko večkrat bolj produktivni. API C ++ ni povsem pripravljen za široko porabo zunaj svojih Pythonovih vezi, vendar naj bi se to izboljšalo.

cuML vključuje tudi API-je za pomoč pri nastavljanju hiperparametrov prek Dask, knjižnice za skaliranje Pythona po več vozliščih. Številne algoritme strojnega učenja je mogoče učinkovito narediti vzporedno, CuML pa aktivno razvija algoritme z več GPU in z več vozlišči in z več GPU.

HITRE

Rapids ’cuGraph

cuGraph je tretji član ekosistema Rapids in tako kot drugi je cuGraph popolnoma integriran s cuDF in cuML. Ponuja dober izbor grafičnih algoritmov, primitivov in pripomočkov, vse z GPU-pospešeno zmogljivostjo. Izbira API-jev v cuGraphu je nekoliko obsežnejša kot v drugih delih Rapidsa, saj so na voljo NetworkX, Pregel, GraphBLAS in GQL (Graph Query Language).

HITRE

cuGraph je po duhu bolj podoben orodju kot cuML. Graf tehnologija je hitro premikajoč se prostor tako v akademskem svetu kot v industriji. Tako CuGraph razvijalcem po zasnovi omogoča dostop do slojev C ++ in primitivov grafov, s čimer spodbuja tretje osebe, da razvijajo izdelke z uporabo cuGraph. Prispevalo je več univerz, projekti iz Texas A&M (GraphBLAS), Georgia Tech (Hornet) in UC Davis (Gunrock) pa so bili "producirani" in vključeni pod okrilje cuGraph. Vsak projekt ponuja drugačen nabor zmogljivosti, vse pospešene z GPU in vse podprte z istim podatkovnim okvirom cuDF.

NetworkX je API za Python, ki ga je ekipa Rapids ciljala za svoj izvorni vmesnik. Prek tega vmesnika je na voljo več algoritmov. Čeprav je samo rang strani več GPU, skupina aktivno dela na različicah več GPU drugih, kjer je to primerno.

HITRE

Eden izmed podprojektov cuGraph, ki se mi je zdel zanimiv, je cugraphBLAS, prizadevanje za standardizacijo gradnikov grafičnih algoritmov v jeziku linearne algebre. Temelji na GraphBLAS (graphblas.org), podatkovni strukturi po meri, zasnovani za redko obdelavo dinamičnih grafov.

Še en podprojekt cuGraph, Hornet, ponuja sistemsko neodvisno obliko za vsebovanje grafskih podatkov, analogno načinu, kako puščica Apache ponuja sistemsko neodvisen način za obdelavo podatkovnih okvirov. Hornet podpira večino priljubljenih formatov grafov, vključno s SNAP, mtx, metis in robovi.

V skladu z duhom bližine skupnosti Python lahko Pythonov domači paket NetworkX uporabimo za proučevanje zapletenih omrežij. To vključuje podatkovne strukture za grafe in večgrafe, ki so bile znova uporabljene s primitivci CUDA, kar vam omogoča ponovno uporabo številnih standardnih algoritmov grafov in izvajanje omrežne strukture in analiznih ukrepov. Večina algoritmov je eno-grafičnih procesorjev, na primer NetworkX. Kljub temu samo njihovo izvajanje na GPU-ju ponuja znatno pospešitev, medtem ko se delo nadaljuje z izvajanjem več GPU-jev.

Na načrtu za Rapids

Glede na izjemno pospešeno analitiko, ki temelji na GPU, je v prihodnjih različicah na voljo nekaj novih projektov.

DLPack in array_interface za poglobljeno učenje

Večplastna nevronska omrežja so bila ena prvih delovnih obremenitev, preseljenih na grafične procesorje, in za ta primer uporabe strojnega učenja obstaja precejšen del kode. Prej je bil DLPack dejanski standard za izmenjavo podatkov med knjižnicami globokega učenja. Danes je vmesnik array_interface pogosto podprt. Rapids podpira oboje.

cuSignal

Kot večina drugih projektov pri Rapids-u je cuSignal različica obstoječe knjižnice Python, pospešena z GPU, v tem primeru SciPy Signal knjižnice. Izvirna knjižnica SciPy Signal temelji na NumPy, ki je nadomeščen s svojim ekvivalentom, pospešenim z GPU, CuPy v cuSignal. To je dober primer filozofije oblikovanja Rapids pri delu. Z izjemo nekaj jeder po meri CUDA, vrata GPU večinoma vključujejo zamenjavo izjave o uvozu in prilagajanje nekaj funkcijskih parametrov.

Prenos signala v Rapids fold je pametna poteza. Obdelava signalov je povsod in ima veliko uporabnih komercialnih aplikacij v industriji in obrambi.

cuSpatial

Prostorske in prostorsko-časovne operacije so odlični kandidati za pospeševanje GPU-ja in rešujejo številne resnične probleme, s katerimi se srečujemo v vsakdanjem življenju, na primer analizo prometnih vzorcev, zdravja / kakovosti tal in tveganja poplav. Večina podatkov, ki jih zbirajo mobilne naprave, vključno z brezpilotnimi letali, ima geoprostorsko komponento, prostorska analiza pa je v središču pametnega mesta.

Tako kot druge komponente je cuSpatial knjižnica C ++, zgrajena na primitivih CUDA in vektorski obdelovalni knjižnici Thrust, ki za izmenjavo podatkov uporablja cuDF. Potrošniki knjižnice C ++ lahko s pomočjo bralnika C ++ berejo podatke o točkah, premicah in poligonih. Uporabnikom Pythona je bolje uporabiti obstoječe pakete Python, kot sta Shapely ali Fiona, da zapolnijo matriko NumPy, nato pa uporabiti cuSpatial Python API ali pretvoriti v podatkovne okvire cuDF.

cuxfilter za vizualizacijo podatkov

Vizualizacija podatkov je bistvenega pomena tako v delovnem toku analitike kot za predstavitev ali poročanje o rezultatih. Kljub vsemu čarobnemu delovanju grafičnih procesorjev na same podatke pa njihov prenos v brskalnik ni nepomembna naloga. Cuxfilter, ki ga je navdihnila knjižnica JavaScript Crossfilter, želi premostiti to vrzel z zagotavljanjem sklada, ki omogoča neodvisnim knjižnicam za vizualizacijo prikaz podatkov v podatkovnih okvirih cuDF.

Bilo je nekaj ponovitev cuxfilterja, ko je ekipa razvrstila najboljšo arhitekturo in vzorce konektorjev. Najnovejša ponovitev uporablja prenosnike Jupyter, strežnik Bokeh in plošče PyViz, medtem ko integracijski poskusi vključujejo projekte Uberja, Falcona in PyDecka. Ta komponenta še ni povsem pripravljena za prime time, vendar je predvidena za izdajo v Rapids 0.13. Premikajočih se delov je veliko in nisem mogel eksperimentirati z njimi iz prve roke, toda če bo izpolnil obljubo, bo to odličen dodatek k orodju Rapids.

Povečevanje in zmanjševanje z Daskom

Dask je porazdeljeni načrtovalnik opravil za Python, ki ima podobno vlogo za Python, kot jo igra Apache Spark za Scalo. Dask-cuDF je knjižnica, ki ponuja particionirane podatkovne okvire, podprte z GPU. Dask-cuDF dobro deluje, če nameravate uporabiti cuML ali ko nalagate nabor podatkov, ki je večji od pomnilnika GPU ali je razporejen v več datotek.

Tako kot Spark RDD (Resilient Distributed Dataset) se tudi distribuirani podatkovni okvir Dask-cuDF večinoma obnaša tako kot lokalni, zato lahko poskusite z lokalnim računalnikom in se premaknete na porazdeljeni model, ko ga želite povečati. Dask-cuML omogoča cuML zmogljivosti za več vozlišč, zato je dobra izbira, če nimate proračuna za delovno postajo DGX.

$config[zx-auto] not found$config[zx-overlay] not found