Pregled: Nvidijin Rapids donosi Python analitiku na GPU

Izgradnja modela strojnog učenja ponavljajući se postupak. Često je napamet i rutinski, ovo je igra „najbrži kroz ciklus pobjeđuje“, jer što brže možete ponavljati, lakše je istraživati ​​nove teorije i dobiti dobre odgovore. To je jedan od razloga zašto danas praktičnom uporabom AI-a dominiraju najveća poduzeća, koja mogu baciti ogromna sredstva na problem.

Rapids je kišobran za nekoliko projekata otvorenog koda, inkubiran od strane Nvidie, koji stavlja cijeli cjevovod za obradu na GPU, uklanjajući I / O vezane prijenose podataka, uz istovremeno značajno povećanje brzine svakog od pojedinačnih koraka. Također pruža zajednički format podataka, olakšavajući teret razmjene podataka između različitih sustava. Na korisničkoj razini, Rapids oponaša Python API kako bi olakšao prijelaz za tu korisničku bazu.

Kuharica Tidyverse

Arhitektura brzih ekosustava

Cilj projekta Rapids je replicirati, uglavnom, API-je za strojno učenje i analitiku podataka Pythona, ali za GPU, a ne za CPU. To znači da programeri Pythona već imaju sve što im je potrebno za pokretanje na GPU-u, a da ne moraju učiti detalje na niskoj razini CUDA programiranja i paralelnih operacija. Pythonistas može razviti kôd na stroju koji ne podržava GPU, a zatim ga, s nekoliko podešavanja, pokrenuti na svim GPU-ovima koji su im dostupni.

Komplet alata Nvidia CUDA pruža primitive niže razine za matematičke knjižnice, paralelne algoritme i analitiku grafova. U središtu je arhitekture GPU okvir podataka, zasnovan na Apache Arrow, koji pruža stupastu strukturu podataka u memoriji koja je agnostički programski jezik. Korisnik stupa u interakciju s GPU podatkovnim okvirom putem cuDF-a i API-ja sličnog Pandasu. Dask, Python knjižnica za paralelno računanje, oponaša uzlazne Python API-je i radi s CUDA knjižnicama za paralelno računanje. Mislite o Dasku kao Iskri za Python.

BRZI

Tri glavna projekta, cuDF, cuML i cuGraph, razvijaju se neovisno, ali osmišljeni za nesmetan rad. U sklopu projekta razvijaju se i mostovi do šireg ekosustava Python.

Brza instalacija

Instalacija putem Anaconde na Linux stroju u AWS-u uglavnom je bila jednostavna, zabranjivajući nekoliko štucanja zbog promjene ovisnosti u verziji 0.11. Instalacija knjižnica C / C ++ za upotrebu libcudf-a nije bila tako jednostavna, a ja bih preporučio da se pridržavate Python API-ja i postupka instalacije Conde. Rapids uključuje Jupyter prijenosno računalo, također dostupno na Googleovom besplatnom Colabu, što olakšava početak. Koristio sam Jupyterovu bilježnicu verzije 0.10 za pokretanje koda na Google Colabu, koji uključuje Nvidia Tesla T4 GPU.

Rapidsov GPU podatkovni okvir

U središtu bilo kojeg tijeka rada s naukom o podacima nalazi se okvir podataka. Tu se događa inženjering značajki i tamo provodi većinu vremena dok se znanstvenici podataka premeću prljave podatke. cuDF je Rapids projekt za podatkovni okvir sličan Pandasu koji se temelji na GPU-u. U osnovi cuDF-a je libcudf, knjižnica C ++ koja implementira primitive niske razine za uvoz podataka Apache Arrow, izvođenje matematičke matematike na nizovima i izvršavanje sortiranja, pridruživanja, grupiranja, smanjenja i drugih operacija na matricama memorije u GPU-u. Osnovna podatkovna struktura libcudf-a je GPU DataFrame (GDF), koji je zauzvrat oblikovan po uzoru na Apache Arrow-ovo stupasto spremište podataka.

BRZI

Biblioteka Rapids Python predstavlja korisniku sučelje više razine nalik podatkovnim kadrovima, poput onih u Pandama. U mnogim slučajevima, Pandasov kôd radi nepromijenjen na cuDF. Tamo gdje to nije slučaj, obično su potrebne samo manje promjene.

Korisnički definirane funkcije u cuDF-u

Kad prođete osnovnu manipulaciju podacima, ponekad je potrebno obrađivati ​​retke i stupce pomoću korisnički definiranih funkcija (UDF). cuDF pruža API PyData stila za pisanje koda za obradu strukturiranih podataka s više predmeta, poput nizova, serija i pomičnih prozora. Trenutno su podržani samo numerički i logički tipovi. UDF-ovi se kompajliraju pomoću Numba JIT kompajlera, koji koristi podskup LLVM-a za kompajliranje numeričkih funkcija u CUDA strojni kod. To rezultira znatno bržim vremenima rada GPU-a.

Žice u cuDF

Iako su GPU fantastični za brzu obradu plutajućih vektora, tipično se ne koriste za obradu podataka niza, a stvarnost je takva da većina podataka dolazi do nas u obliku nizova. cuStrings je GPU knjižnica za manipulaciju nizom za razdvajanje, primjenu regularnih izraza, spajanje, zamjenu tokena itd. u nizovima nizova. Kao i druge funkcije cuDF-a, implementiran je kao C / C ++ knjižnica (libnvStrings) i omotan Pythonovim slojem dizajniranim da oponaša Pande. Iako vrsta podataka niza nije optimizirana za izvršavanje na GPU-ima, paralelno izvršavanje koda trebalo bi osigurati ubrzanje manipulacije nizom zasnovane na CPU-u.

Dohvaćanje podataka u ili izvan cuDF-a

Ulazno-izlaznim okvirom podataka obrađuje namjenska knjižnica cuIO. Podržani su svi najčešće susretani formati, uključujući Arrow, ORC, Parket, HDF5 i CSV. Ako imate dovoljno sreće da radite na hardveru DGX-2, možete koristiti integraciju izravne pohrane GPU-a za premještanje podataka izravno iz pohrane velike brzine na GPU bez uključivanja CPU-a. Mortal korisnici i dalje će cijeniti ubrzanje koje GPU daje prilikom dekomprimiranja velikih skupova podataka i usku integraciju s Python ekosustavom.

GPU Direct Storage trenutno je u alfa verziji, a kada bude objavljen bit će dostupan na većini Tesla GPU-a. GPU podatkovni okvir možete stvoriti iz tablica NumPy, Pandas DataFrames i PyArrow samo s jednim retkom koda. Ostali projekti mogu razmjenjivati ​​podatke putem __cuda_array_interface__biblioteka koje spadaju u ekosustav Numbe. DLPack za knjižnice neuronske mreže također je podržano sučelje.

Vjerojatno najveći nedostatak u korištenju cuDF-a je nedostatak interoperabilnosti izvan Pythona. Mislim da bi usredotočenost na snažne temelje C / C ++ API-ja, kao što je to učinila Arrow, omogućila širi ekosustav i koristila projektu u cjelini.

Brzi cuML

Ciljevi cuML-a su biti "Python Scikit-learn powered by GPU". U teoriji to znači da biste trebali samo promijeniti izjavu o uvozu i možda podesiti nekoliko parametara kako bi se uzele u obzir razlike u radu na CPU-u, gdje je ponekad pristup grubom silom bolji. Prednost postojanja Scikit-learninga temeljenog na GPU-u teško je podcijeniti. Pobrzavanja su značajna, a analitičari podataka mogu biti višestruko produktivniji. C ++ API nije sasvim spreman za široku potrošnju izvan svojih Python veza, ali očekuje se da će se to poboljšati.

cuML također uključuje API-je za pomoć u podešavanju hiperparametara putem Daska, knjižnice za skaliranje Pythona na više čvorova. Mnogo algoritama strojnog učenja može se učinkovito napraviti paralelno, a cuML aktivno razvija algoritme s više GPU-a i s više čvorova i s više GPU-a.

BRZI

Brzački cuGraph

cuGraph je treći član ekosustava Rapids, a kao i ostali, cuGraph je u potpunosti integriran sa cuDF i cuML. Nudi dobar izbor grafičkih algoritama, primitiva i uslužnih programa, sve s GPU-ubrzanim performansama. Izbor API-ja u cuGraphu nešto je opsežniji nego u drugim dijelovima Rapida, s dostupnim mrežama NetworkX, Pregel, GraphBLAS i GQL (Graph Query Language).

BRZI

cuGraph više sliči nabor alata po duhu nego cuML. Graf tehnologija je brz pokret u akademskoj zajednici i industriji. Dakle, dizajnom cuGraph pruža programerima pristup primitivima sloja C ++ i grafikona, potičući treće strane da razvijaju proizvode koristeći cuGraph. Nekoliko sveučilišta je doprinijelo, a projekti iz Texas A&M (GraphBLAS), Georgia Tech (Hornet) i UC Davis (Gunrock) su "producirani" i uključeni pod cuGraph kišobran. Svaki projekt pruža drugačiji skup mogućnosti, sve GPU-ubrzane i podržane istim CuDF podatkovnim okvirom.

NetworkX je Python API čiji je cilj Rapids tim za svoje matično sučelje. Putem tog sučelja dostupni su brojni algoritmi. Iako je samo rang stranice multi-GPU, tim aktivno radi na verzijama s više GPU-a ostalih, tamo gdje je to primjenjivo.

BRZI

Jedan od cuGraph potprojekata koji mi se učini zanimljivim je cugraphBLAS, pokušaj da se standardiziraju građevni blokovi za algoritme grafova na jeziku linearne algebre. Na temelju GraphBLAS-a (graphblas.org), prilagođene strukture podataka dizajnirane za rijetku obradu dinamičkih grafova.

Drugi podprojekt cuGraph, Hornet pruža sistemski neovisan format za sadržavanje podataka grafova, analogno načinu na koji strelica Apache pruža sistemski neovisan način obrade podatkovnih okvira. Hornet podržava većinu popularnih formata grafova, uključujući SNAP, mtx, metis i rubove.

U skladu s duhom bliskosti s Python zajednicom, Pythonov izvorni NetworkX paket može se koristiti za proučavanje složenih mreža. To uključuje podatkovne strukture za grafikone i višegrafove, ponovno implementirane pomoću CUDA primitiva, omogućujući vam ponovnu upotrebu mnogih standardnih algoritama grafova i izvođenje mrežne strukture i mjere analize. Većina algoritama su single-GPU, poput NetworkX-a. Ipak, njihovo pokretanje samo na GPU-u nudi značajno ubrzanje, dok se rad nastavlja premještati na implementacije s više GPU-a.

Na putu Rapids 

S obzirom na ogromnu brzinu koju pruža analitika zasnovana na GPU-u, nekoliko novih projekata dolazi u kombinaciju u budućim verzijama.

DLPack i array_interface za duboko učenje

Višeslojne neuronske mreže bile su jedno od prvih opterećenja premještenih na GPU-ove, a za ovaj slučaj upotrebe strojnog učenja postoji znatan dio koda. Prije je DLPack bio de-facto standard za razmjenu podataka među knjižnicama dubokog učenja. Danas je uobičajeno podržano sučelje array. Rapids podržava oboje.

cuSignal

Kao i većina drugih projekata u Rapidsu, cuSignal je GPU-ubrzana verzija postojeće Python biblioteke, u ovom slučaju SciPy Signal biblioteke. Izvorna SciPy Signal knjižnica temelji se na NumPyu, koji je zamijenjen svojim ekvivalentom ubrzanim GPU-om, CuPy u cuSignalu. Ovo je dobar primjer filozofije dizajna Rapids na djelu. Izuzev nekoliko prilagođenih CUDA jezgri, priključak na GPU uglavnom uključuje zamjenu naredbe o uvozu i ugađanje nekoliko parametara funkcije. 

Donošenje obrade signala u Rapids fold je pametan potez. Obrada signala je svugdje i ima mnogo korisnih komercijalnih aplikacija u industriji i obrani.

cuProstorni

Prostorne i prostorno-vremenske operacije izvrsni su kandidati za ubrzanje GPU-a i rješavaju mnoge probleme iz stvarnog svijeta s kojima se suočavamo u svakodnevnom životu, poput analize prometnih obrazaca, zdravlja / kvalitete tla i rizika od poplave. Velik dio podataka prikupljenih mobilnim uređajima, uključujući dronove, ima geoprostornu komponentu, a prostorna analiza je u središtu Pametnog grada. 

Arhitektiran poput ostalih komponenata, cuSpatial je knjižnica C ++ izgrađena na CUDA primitivima i knjižnici obrade Thrust vektora, koristeći cuDF za razmjenu podataka. Potrošači knjižnice C ++ mogu čitati podatke o točkama, polilinijama i poligonima pomoću čitača C ++. Korisnicima Pythona je bolje koristiti postojeće Python pakete poput Shapely ili Fiona za popunjavanje NumPy polja, a zatim koristiti cuSpatial Python API ili pretvoriti u cuDF podatkovne okvire. 

cuxfilter za vizualizaciju podataka

Vizualizacija podataka je ključna, kako u tijeku analitičkog tijeka, tako i za predstavljanje ili izvještavanje o rezultatima. Ipak, za svu čaroliju koja GPU-ovi mogu raditi na samim podacima, prenošenje tih podataka u preglednik nije trivijalan zadatak. cuxfilter, inspiriran Crossfilter JavaScript bibliotekom, želi premostiti taj jaz pružajući stog koji omogućuje neovisnim bibliotekama za vizualizaciju prikaz podataka u cuDF podatkovnim okvirima.

Bilo je nekoliko iteracija cuxfiltera jer tim sređuje najbolju arhitekturu i uzorke konektora. Najnovija iteracija koristi Jupyterove bilježnice, Bokeh poslužitelj i PyViz ploče, dok eksperimenti integracije uključuju projekte Ubera, Falcona i PyDecka. Ova komponenta još nije spremna za prime time, ali je predviđena za objavljivanje u Rapids 0,13. Puno je pokretnih dijelova i nisam uspio eksperimentirati s njim iz prve ruke, ali ako ispuni obećanja, ovo će biti izvrstan dodatak Rapidsovom alatu.

Povećavanje i smanjivanje s Daskom

Dask je distribuirani planer zadataka za Python, igrajući sličnu ulogu za Python koju Apache Spark igra za Scalu. Dask-cuDF je knjižnica koja nudi particionirane podatkovne okvire podržane GPU-om. Dask-cuDF dobro funkcionira kada planirate koristiti cuML ili kada učitavate skup podataka koji je veći od GPU memorije ili je raširen u više datoteka.

Poput Spark RDD (Resilient Distributed Dataset), Dask-cuDF distribuirani okvir podataka uglavnom se ponaša baš poput lokalnog, tako da možete eksperimentirati sa svojim lokalnim strojem i prijeći na distribuirani model kada trebate povećati veličinu. Dask-cuML daje CuML mogućnosti za više čvorova, što ga čini dobrom opcijom kada nemate proračun za DGX radnu stanicu.