Programavimas

Apžvalga: „Nvidia“ „Rapids“ pateikia „Python“ analizę į GPU

Mašininio mokymosi modelių kūrimas yra pasikartojantis procesas. Dažnai šiurkštus ir įprastas žaidimas yra „greičiausias per ciklą“, nes kuo greičiau galite kartoti, tuo lengviau tyrinėti naujas teorijas ir gauti gerus atsakymus. Tai yra viena iš priežasčių, kodėl praktiškai įmonėse dirbtinį intelektą naudoja daugiausia įmonės, kurios gali iššaukti milžiniškus išteklius.

„Rapids“ yra kelių „Nvidia“ inkubuojamų atvirojo kodo projektų skėtis, kuris visą apdorojimo vamzdyną įdeda į GPU, pašalindamas įvesties / išvesties išvesties duomenų perdavimą, tuo pačiu žymiai padidindamas kiekvieno atskiro žingsnio greitį. Taip pat pateikiamas bendras duomenų formatas, palengvinantis keitimosi duomenimis tarp skirtingų sistemų naštą. Vartotojo lygiu „Rapids“ imituoja „Python“ API, kad palengvintų tos vartotojo bazės perėjimą.

„Tidyverse Cookbook“ knyga

Rapids ekosistemos architektūra

„Rapids“ projektu siekiama atkartoti „Python“ mašininio mokymosi ir duomenų analizės API, tačiau GPU, o ne procesorių. Tai reiškia, kad „Python“ kūrėjai jau turi viską, ko reikia norint paleisti GPU, nereikia mokytis žemo lygio CUDA programavimo ir lygiagrečių operacijų. „Pythonistas“ gali sukurti kodą kompiuteryje, kuriame nėra GPU, tada, atlikęs kelis patikslinimus, paleiskite jį visais jiems prieinamais GPU.

„Nvidia CUDA“ įrankių rinkinyje pateikiami žemesnio lygio primityvieji elementai matematikos bibliotekoms, lygiagrečiams algoritmams ir grafikų analizei. Architektūros esmė yra GPU duomenų rėmas, pagrįstas „Apache Arrow“, kuris suteikia stulpelinę atminties duomenų struktūrą, kuri programuoja kalbos agnostiką. Vartotojas sąveikauja su GPU duomenų rėmeliu per „cuDF“ ir į „Pandas“ panašų API. „Dask“, „Python“ biblioteka, skirta lygiagrečiam skaičiavimui, imituoja ankstesnes „Python“ API ir dirba kartu su „CUDA“ bibliotekomis lygiagrečiam skaičiavimui. Pagalvokite apie „Dask“ kaip apie „Python“ kibirkštį.

GREITAI

Trys pagrindiniai projektai - „cuDF“, „cuML“ ir „cuGraph“ - yra kuriami savarankiškai, tačiau skirti sklandžiai veikti kartu. Taip pat vykdant projektą kuriami tiltai į platesnę Python ekosistemą.

Greitas montavimas

Diegimas per „Anaconda“ „Linux“ kompiuteryje AWS dažniausiai buvo paprastas, neleidžiant kelių žagsėti dėl 0.11 versijos priklausomybių pasikeitimo. C / C ++ bibliotekų diegimas naudojant libcudf nebuvo taip lengvas, todėl rekomenduočiau laikytis „Python“ API ir „Conda“ diegimo proceso. „Rapids“ yra „Jupyter“ užrašų knygelė, taip pat prieinama nemokamoje „Google“ sistemoje „Colab“, todėl palengvina darbo pradžią. Naudodamas „Jupyter“ nešiojamojo kompiuterio versiją 0.10, norėdamas paleisti kodą „Google Colab“, kuriame yra „Nvidia Tesla T4“ GPU.

„Rapids“ GPU duomenų rėmas

Bet kurios duomenų mokslo darbo eigos esmė yra duomenų rėmas. Čia vyksta funkcijų inžinerija ir kur praleidžiama didžioji laiko dalis, nes duomenų mokslininkai grumiasi su nešvariais duomenimis. „cuDF“ yra „Rapids“ projektas, skirtas GPU pagrįstam „Pandas“ panašiam duomenų rėmui. Pagrindas „cuDF“ yra „libcudf“, C ++ biblioteka, įgyvendinanti žemo lygio primityvus „Apache Arrow“ duomenų importavimui, elementų matematikos atlikimui masyvuose ir rūšiavimo, sujungimo, grupavimo, mažinimo ir kitų operacijų vykdymui GPU atminties matricose. Pagrindinė libcudf duomenų struktūra yra GPU DataFrame (GDF), kuris savo ruožtu yra sukurtas pagal Apache Arrow stulpelinę duomenų saugyklą.

GREITAI

„Rapids Python“ biblioteka pateikia vartotojui aukštesnio lygio sąsają, panašią į duomenų kadrus, kaip ir „Pandas“. Daugeliu atvejų „Pandas“ kodas veikia nepakeistas „cuDF“. Kai to nėra, paprastai reikia atlikti tik nedidelius pakeitimus.

Vartotojo nustatytos funkcijos cuDF

Kai praeisite pagrindinį duomenų valdymą, kartais reikia apdoroti eiles ir stulpelius su vartotojo nustatytomis funkcijomis (UDF). „cuDF“ pateikia „PyData“ stiliaus API, kad būtų galima rašyti kodą, kad būtų apdorotos kurso tikslesnės duomenų struktūros, tokios kaip masyvai, serijos ir judantys langai. Šiuo metu palaikomi tik skaitiniai ir loginiai tipai. UDF sudaromi naudojant „Numba JIT“ kompiliatorių, kuris naudoja LLVM pogrupį skaitmeninėms funkcijoms sudaryti į CUDA mašinos kodą. Tai lemia žymiai greitesnį GPU veikimo laiką.

Stygos cuDF

Nors GPU yra fantastiniai greitai apdorojant plūduriuojančius vektorius, jie paprastai nebuvo naudojami eilutės duomenims apdoroti, o realybė yra ta, kad dauguma duomenų mums ateina kaip eilutės. „cuStrings“ yra GPU eilučių manipuliavimo biblioteka, skirta padalyti, pritaikyti regexes, susieti, pakeisti žetonus ir kt. eilučių masyvuose. Kaip ir kitos „cuDF“ funkcijos, ji įgyvendinama kaip C / C ++ biblioteka (libnvStrings) ir apipinta „Python“ sluoksniu, sukurtu mėgdžioti Pandas. Nors eilutės duomenų tipas nėra optimizuotas vykdyti GPU, lygiagretusis kodo vykdymas turėtų pagreitinti manipuliavimą procesoriumi pagrįstomis eilutėmis.

Gaunami duomenys iš „cuDF“ arba iš jo

„Dataframe I / O“ tvarko tam skirta biblioteka „cuIO“. Palaikomi visi dažniausiai sutinkami formatai, įskaitant „Arrow“, ORC, „Parketo“, HDF5 ir CSV. Jei jums pasisekė, kad naudojate „DGX-2“ aparatinę įrangą, galite naudoti „GPU Direct Storage“ integraciją, kad perkeltumėte duomenis tiesiai iš didelės spartos atminties į GPU, neįtraukdami procesoriaus. „Mirtingieji“ vartotojai vis tiek įvertins greitį, kurį GPU suteikia išpakuodamas didelius duomenų rinkinius, ir tvirtą integraciją su „Python“ ekosistema.

„GPU Direct Storage“ šiuo metu yra alfa versijoje, o kai bus išleista, bus galima naudotis daugumoje „Tesla“ GPU. Galite sukurti GPU duomenų kadrą iš „NumPy“ masyvų, „Pandas DataFrame“ ir „PyArrow“ lentelių, naudodami tik vieną kodo eilutę. Kiti projektai gali keistis duomenimis per __cuda_array_interface__ bibliotekoms, kurios patenka į Numbos ekosistemą. DLPack neuroninių tinklų bibliotekoms taip pat yra palaikoma sąsaja.

Tikriausiai didžiausias trūkumas naudojant cuDF yra sąveikos trūkumas už „Python“ ribų. Manau, kad sutelktas dėmesys į tvirtą C / C ++ API pagrindą, kaip tai padarė „Arrow“, įgalintų platesnę ekosistemą ir būtų naudinga visam projektui.

„Rapids“ cuML

Nurodyti „cuML“ tikslai yra „Python's Scikit-learn, pagrįsti GPU“. Teoriškai tai reiškia, kad turėtumėte pakeisti tik importo ataskaitą ir galbūt sureguliuoti keletą parametrų, kad būtų atsižvelgta į skirtingus procesoriaus veikimo skirtumus, kur kartais geresnis požiūris į grubią jėgą. Sunku neįvertinti „GPU“ pagrįstos „Scikit-learning“ naudos. Spartinimas yra reikšmingas, o duomenų analitikai gali būti daug kartų produktyvesni. „C ++“ API nėra visiškai pasirengusi plačiam vartojimui, išskyrus „Python“ susiejimus, tačiau tikimasi, kad tai pagerės.

„cuML“ taip pat apima API, padedančias sureguliuoti hiperparametrus per „Dask“, biblioteką, skirtą „Python“ masteliui keisti keliuose mazguose. Daugelį mašininio mokymosi algoritmų galima efektyviai sujungti lygiagrečiai, o „cuML“ aktyviai kuria ir daugelio GPU, ir kelių mazgų, daugelio GPU algoritmus.

GREITAI

Rapids cuGraph

„cuGraph“ yra trečiasis „Rapids“ ekosistemos narys ir, kaip ir kiti, „cuGraph“ yra visiškai integruotas su „cuDF“ ir „cuML“. Tai siūlo gerą grafikų algoritmų, primityvų ir komunalinių paslaugų pasirinkimą, kurių visos funkcijos yra pagreitintos GPU. API pasirinkimas „cuGraph“ yra šiek tiek platesnis nei kitose „Rapids“ dalyse, turint visas „NetworkX“, „Pregel“, „GraphBLAS“ ir GQL („Graph Query Language“) galimybes.

GREITAI

„cuGraph“ yra labiau panašus į priemonių rinkinį, o ne į „cuML“. Grafikų technologija yra sparčiai judanti erdvė tiek akademinėje aplinkoje, tiek pramonėje. Taigi pagal konstrukciją „cuGraph“ suteikia kūrėjams prieigą prie C ++ sluoksnio ir grafiko primityvų, skatindamas trečiąsias šalis kurti produktus naudodamas „cuGraph“. Keli universitetai prisidėjo, o „Texas A&M“ („GraphBLAS“), „Georgia Tech“ („Hornet“) ir „UC Davis“ („Gunrock“) projektai buvo „pagaminti“ ir įtraukti į „cuGraph“ skėtį. Kiekvienas projektas suteikia skirtingas galimybes, visas GPU pagreitintas ir visas tas pats „cuDF“ duomenų rėmas.

„NetworkX“ yra „Python“ API, kurią „Rapids“ komanda taiko savo vietinei sąsajai. Per tą sąsają yra keletas algoritmų. Nors tik puslapio reitingas yra daugelio GPU, komanda, jei reikia, aktyviai dirba su kitų GPU versijomis.

GREITAI

Vienas iš „cuGraph“ paprojekčių, kuris man pasirodė įdomus, yra „cugraphBLAS“ - pastangos standartizuoti grafų algoritmų statybinius elementus linijinės algebros kalba. Remiantis „GraphBLAS“ (graphblas.org), pasirinktine duomenų struktūra, skirta retam dinamiškam grafikų apdorojimui.

Kitas „cuGraph“ paprojektas „Hornet“ pateikia nuo sistemos nepriklausomą formatą, kuriame pateikiami grafiko duomenys, analogiškai kaip „Apache“ rodyklė suteikia nuo sistemos nepriklausomą būdą apdoroti duomenų kadrus. „Hornet“ palaiko daugumą populiarių grafikų formatų, įskaitant SNAP, mtx, metis ir kraštus.

Laikantis artumo „Python“ bendruomenei dvasios, „Python“ gimtoji „NetworkX“ paketas gali būti naudojamas kompleksiniams tinklams tirti. Tai apima grafikų ir kelių grafikų duomenų struktūras, papildytas naudojant CUDA primityvus, leidžiančius pakartotinai naudoti daugelį standartinių grafikų algoritmų ir atlikti tinklo struktūrą bei analizės priemones. Dauguma algoritmų yra vieno GPU, pvz., „NetworkX“. Nepaisant to, vien jų paleidimas naudojant GPU suteikia didelį pagreitį, o darbas ir toliau pereina prie kelių GPU diegimo.

Rapidso gairėse

Atsižvelgiant į didžiulį GPU pagrįstos analizės greitį, būsimose versijose yra keletas naujų projektų.

DLPack ir masyvo sąsaja giliam mokymuisi

Daugiasluoksniai neuroniniai tinklai buvo vienas iš pirmųjų darbo krūvių, perkeltų į GPU, ir šiam mašininio mokymosi naudojimo atvejui yra nemažas kodo rinkinys. Anksčiau „DLPack“ buvo de facto keitimosi duomenimis tarp giliai besimokančių bibliotekų standartas. Šiais laikais masyvo sąsaja paprastai palaikoma. Rapids palaiko abu.

„cuSignal“

Kaip ir dauguma kitų „Rapids“ projektų, „cuSignal“ yra GPU pagreitinta esamos „Python“ bibliotekos versija, šiuo atveju - „SciPy Signal“ biblioteka. Originali „SciPy Signal“ biblioteka yra pagrįsta „NumPy“, kuris pakeistas GPU pagreitintu atitikmeniu „CuPy“ programoje „cuSignal“. Tai yra geras „Rapids“ dizaino filosofijos pavyzdys darbe. Išskyrus keletą pasirinktinių CUDA branduolių, GPU prievadas dažniausiai susijęs su importo sakinio pakeitimu ir kelių funkcijų parametrų koregavimu.

Signalo apdorojimas į „Rapids“ klostę yra protingas žingsnis. Signalų apdorojimas yra visur ir turi daug iškart naudingų komercinių programų pramonėje ir gynyboje.

cuSpatial

Erdvinės ir erdvėlaikinės operacijos yra puikūs kandidatai į GPU pagreitinimą, ir jie išsprendžia daugybę realaus pasaulio problemų, su kuriomis susiduriame kasdieniame gyvenime, pavyzdžiui, analizuojame eismo modelius, dirvožemio sveikatą / kokybę ir potvynių riziką. Didžioji dalis mobiliųjų įrenginių, įskaitant bepiločius orlaivius, surinktų duomenų turi geoerdvinį komponentą, o erdvinė analizė yra „Išmaniojo miesto“ esmė.

Sukurtas kaip ir kiti komponentai, „cuSpatial“ yra C ++ biblioteka, sukurta remiantis CUDA primityviais ir „Thrust“ vektoriaus apdorojimo biblioteka, keičiantis duomenimis naudojant „cuDF“. C ++ bibliotekos vartotojai gali skaityti taškų, linijinių linijų ir daugiakampių duomenis naudodami C ++ skaitytuvą. „Python“ vartotojams geriau naudoti esamus „Python“ paketus, pvz., „Shapely“ ar „Fiona“, norint užpildyti „NumPy“ masyvą, tada naudoti „cuSpatial Python“ API arba konvertuoti į „cuDF“ duomenų rėmelius.

Cuxfilter duomenų vizualizavimui

Duomenų vizualizavimas yra labai svarbus tiek analizės darbo eigoje, tiek rezultatų pateikimui ar ataskaitų teikimui. Nepaisant visų stebuklingų dalykų, kuriuos GPU gali dirbti su pačiais duomenimis, duomenų perdavimas į naršyklę nėra nereikšminga užduotis. „cuxfilter“, įkvėptas „Crossfilter JavaScript“ bibliotekos, siekia užpildyti šią spragą pateikdamas kaminą, kad trečiųjų šalių vizualizacijos bibliotekos galėtų rodyti duomenis „cuDF“ duomenų rėmuose.

Buvo keletas „cuxfilter“ pakartojimų, nes komanda išsirinko geriausią architektūrą ir jungčių modelius. Naujausia iteracija naudoja „Jupyter“ bloknotus, „Bokeh“ serverį ir „PyViz“ skydus, o integracijos eksperimentai apima „Uber“, „Falcon“ ir „PyDeck“ projektus. Šis komponentas dar nėra paruoštas pagrindiniam laikui, tačiau jį planuojama išleisti „Rapids 0.13“. Yra daug judančių dalių, ir aš netekau eksperimentuoti su ja iš pirmų lūpų, tačiau jei tai pateisins pažadus, tai bus puikus „Rapids“ įrankių rinkinio priedas.

Didinimas ir mažinimas naudojant Dask

„Dask“ yra paskirstytas „Python“ užduočių planuoklis, atliekantis panašų Python vaidmenį, kurį „Apache Spark“ atlieka „Scala“. „Dask-cuDF“ yra biblioteka, teikianti padalintus, GPU paremtus duomenų kadrus. „Dask-cuDF“ veikia gerai, kai planuojate naudoti „cuML“ arba kai įkeliate duomenų rinkinį, kuris yra didesnis nei GPU atmintis arba yra paskirstytas keliuose failuose.

Kaip ir „Spark RDD“ (atsparus paskirstytas duomenų rinkinys), „Dask-cuDF“ paskirstytas duomenų rėmas dažniausiai veikia taip pat, kaip ir vietinis, todėl galite eksperimentuoti su savo vietine mašina ir pereiti prie paskirstyto modelio, kai reikia didinti mastelį. „Dask-cuML“ suteikia „cuML“ kelių mazgų galimybes, todėl tai yra gera galimybė, kai neturite DGX darbo vietos biudžeto.