Programmēšana

Pārskats: Nvidia's Rapids piedāvā GPU Python analīzi

Mašīnmācīšanās modeļu veidošana ir atkārtots process. Bieži vien rote un rutīna, šī ir spēle ar ātrāko uzvaru ciklā, jo jo ātrāk jūs varat atkārtot, jo vieglāk ir izpētīt jaunas teorijas un saņemt labas atbildes. Tas ir viens no iemesliem, kāpēc mūsdienās AI praktiskā izmantošanā uzņēmumos dominē lielākie uzņēmumi, kas šai problēmai var mest milzīgus resursus.

Rapids ir lietussargs vairākiem Nvidia inkubētiem atvērtā pirmkoda projektiem, kas visu apstrādes cauruļvadu liek GPU, novēršot I / O saistīto datu pārsūtīšanu, vienlaikus ievērojami palielinot katra atsevišķā soļa ātrumu. Tas nodrošina arī vienotu datu formātu, atvieglojot datu apmaiņas slogu starp dažādām sistēmām. Lietotāja līmenī Rapids atdarina Python API, lai atvieglotu pāreju uz šo lietotāju bāzi.

Tidyverse pavārgrāmata

Rapids ekosistēmas arhitektūra

Rapids projekta mērķis ir lielākoties atkārtot Python mašīnmācīšanās un datu analīzes API, bet GPU, nevis CPU. Tas nozīmē, ka Python izstrādātājiem jau ir viss nepieciešamais, lai palaistu GPU, un viņiem nav jāapgūst CUDA programmēšanas un paralēlo darbību zema līmeņa informācija. Pythonistas var izstrādāt kodu datorā, kurā nav iespējots GPU, un pēc tam ar dažiem pielāgojumiem palaidiet to visos GPU, kas viņiem ir pieejami.

Nvidia CUDA rīkkopa nodrošina zemāka līmeņa primitīvus matemātikas bibliotēkām, paralēlus algoritmus un diagrammu analīzi. Arhitektūras centrā ir GPU datu ietvars, kas balstīts uz Apache Arrow, kas nodrošina kolonnu atmiņā esošo datu struktūru, kas ir programmēšanas valodas agnostika. Lietotājs mijiedarbojas ar GPU datu ietvaru, izmantojot cuDF un Pandas līdzīgu API. Dask, Python bibliotēka paralēlai skaitļošanai, atdarina augšpusē esošās Python API un paralēli aprēķināšanai darbojas ar CUDA bibliotēkām. Padomājiet par Dask kā par Python dzirksti.

ĀTRI

Trīs galvenie projekti - cuDF, cuML un cuGraph - tiek izstrādāti neatkarīgi, taču ir paredzēti, lai tie darbotos nevainojami. Projekta ietvaros tiek veidoti arī tilti uz plašāku Python ekosistēmu.

Ātra uzstādīšana

Instalēšana caur Anaconda uz Linux mašīnas AWS pārsvarā bija vienkārša, neļaujot dažām žagām, jo ​​mainījās atkarības 0.11 versijā. C / C ++ bibliotēku instalēšana, lai izmantotu libcudf, nebija tik vienkārša, un es ieteiktu pieturēties pie Python API un Conda instalēšanas procesa. Rapids ietver Jupyter piezīmju grāmatiņu, kas pieejama arī Google bezmaksas Colab, kas atvieglo darba sākšanu. Es izmantoju Jupyter piezīmjdatora versiju 0.10, lai palaistu kodu Google Colab, kurā ietilpst Nvidia Tesla T4 GPU.

Rapids GPU datu ietvars

Jebkuras datu zinātnes darbplūsmas pamatā ir datu ietvars. Šeit notiek objektu inženierija un kur tiek pavadīta lielākā daļa laika, kad datu zinātnieki apkaisa netīrus datus. cuDF ir Rapids projekts uz GPU balstītam, Pandas līdzīgam datu ietvaram. CuDF pamatā ir libcudf, C ++ bibliotēka, kas ievieš zema līmeņa primitīvus Apache Arrow datu importēšanai, elementu matemātikas veikšanai masīvos un kārtošanas, pievienošanās, grupēšanas, samazināšanas un citu darbību izpildei GPU atmiņas matricās. Libcudf datu pamatstruktūra ir GPU DataFrame (GDF), kas savukārt ir veidots pēc Apache Arrow kolonnveida datu krātuves.

ĀTRI

Rapids Python bibliotēka piedāvā lietotājam augstāka līmeņa saskarni, kas līdzinās datu ietvariem, piemēram, Pandas. Daudzos gadījumos Pandas kods cuDF darbojas nemainīgs. Ja tas tā nav, parasti ir nepieciešamas tikai nelielas izmaiņas.

Lietotāja definētas funkcijas cuDF

Kad esat pabeidzis pamata datu apstrādi, dažreiz ir jāapstrādā rindas un kolonnas ar lietotāja definētām funkcijām (UDF). cuDF nodrošina PyData stila API, lai rakstītu kodu, lai apstrādātu kursa ziņā detalizētākas datu struktūras, piemēram, masīvus, sērijas un pārvietotos logus. Pašlaik tiek atbalstīti tikai skaitliskie un Būla veidi. UDF tiek sastādīti, izmantojot Numba JIT kompilatoru, kas izmanto LLVM apakškopu, lai sastādītu ciparu funkcijas CUDA mašīnkodam. Tā rezultātā GPU darbojas ievērojami ātrāk.

Stīgas cuDF

Lai gan grafiskie procesori ir fantastiski, lai ātri apstrādātu pludiņvektorus, tos parasti neizmanto virkņu datu apstrādei, un realitāte ir tāda, ka lielākā daļa datu mums tiek piegādāti virkņu veidā. cuStrings ir GPU virkņu manipulāciju bibliotēka, kas paredzēta virkņu masīvos sadalīšanai, regulāru lietošanu, sasiešanai, žetonu nomaiņai utt. Tāpat kā citas cuDF funkcijas, tā tiek realizēta kā C / C ++ bibliotēka (libnvStrings) un ietīta ar Python slāni, kas paredzēts Panda atdarināšanai. Lai gan virknes datu tips nav optimizēts izpildei GPU, paralēlai koda izpildei jānodrošina ātrāka virkne nekā centrālajam procesoram.

Datu iegūšana no cuDF vai no tā

Dataframe I / O apstrādā īpaša bibliotēka cuIO. Tiek atbalstīti visi visbiežāk sastopamie formāti, tostarp Arrow, ORC, Parkets, HDF5 un CSV. Ja paveicas, ka darbojaties ar aparatūru DGX-2, varat izmantot GPU Direct Storage integrāciju, lai datus tieši pārvietotu no ātrgaitas krātuves uz GPU, neiesaistot procesoru. Mirstīgie lietotāji joprojām novērtēs GPU sniegto ātrdarbības ātrumu, dekompresējot lielas datu kopas, un ciešu integrāciju ar Python ekosistēmu.

GPU Direct Storage pašlaik ir alfa, un pēc izlaišanas tā būs pieejama lielākajai daļai Tesla GPU. Jūs varat izveidot GPU datu ietvaru no NumPy masīviem, Pandas DataFrames un PyArrow tabulām tikai ar vienu koda rindiņu. Citi projekti var apmainīties ar datiem, izmantojot __cuda_array_interface__ bibliotēkām, kas ietilpst Numbas ekosistēmā. DLPack neironu tīkla bibliotēkām ir arī atbalstīts interfeiss.

Iespējams, ka lielākais cuDF izmantošanas trūkums ir savietojamības trūkums ārpus Python. Es domāju, ka koncentrēšanās uz spēcīgu C / C ++ API pamatu, kā to ir darījusi Arrow, ļautu plašākai ekosistēmai un nāktu par labu projektam kopumā.

Rapids ’cuML

cuML izvirzītie mērķi ir “Python's Scikit-learn, ko darbina GPU.” Teorētiski tas nozīmē, ka jums ir jāmaina tikai importa paziņojums un, iespējams, jāpielāgo daži parametri, lai ņemtu vērā atšķirības, kas saistītas ar darbību CPU, kur dažreiz labāka ir brutāla spēka pieeja. Ieguvumu no GPU balstītas Scikit-learn ir grūti nenovērtēt. Paātrinājumi ir ievērojami, un datu analītiķi var būt daudzkārt produktīvāki. C ++ API nav gluži gatavs plašam patēriņam ārpus tās Python saistījumiem, taču paredzams, ka tas uzlabosies.

cuML ietver arī API, lai palīdzētu ar hiperparametru regulēšanu, izmantojot Dask, bibliotēku Python mērogošanai vairākos mezglos. Daudzus mašīnmācīšanās algoritmus var efektīvi veidot paralēli, un cuML aktīvi izstrādā gan multi-GPU, gan vairāku mezglu, multi-GPU algoritmus.

ĀTRI

Rapids ’cuGraph

cuGraph ir Rapids ekosistēmas trešais loceklis, un tāpat kā citi, cuGraph ir pilnībā integrēts cuDF un cuML. Tas piedāvā labu grafu algoritmu, primitīvu un utilītu izvēli, visiem ar GPU paātrinātu veiktspēju. API izvēle cuGraph ir nedaudz plašāka nekā citās Rapids daļās, un ir pieejami visi NetworkX, Pregel, GraphBLAS un GQL (Graph Query Language).

ĀTRI

cuGraph pēc gara drīzāk atgādina rīkkopa nekā cuML. Grafu tehnoloģija ir strauji mainīga telpa gan akadēmiskajā vidē, gan rūpniecībā. Tādējādi pēc konstrukcijas cuGraph dod izstrādātājiem piekļuvi C ++ slānim un grafiku primitīviem, mudinot trešās puses izstrādāt produktus, izmantojot cuGraph. Vairākas universitātes ir devušas savu ieguldījumu, un Teksasas A&M (GraphBLAS), Georgia Tech (Hornet) un UC Deivisa (Gunrock) projekti ir “ražoti” un iekļauti cuGraph lietussargā. Katrs projekts nodrošina atšķirīgu iespēju komplektu, visas GPU paātrinātas, un visas tās atbalsta viens un tas pats cuDF datu ietvars.

NetworkX ir Python API, kuru Rapids komanda ir mērķējusi uz savu vietējo saskarni. Izmantojot šo saskarni, ir pieejami vairāki algoritmi. Lai gan tikai lapas rangs ir multi-GPU, komanda, ja nepieciešams, aktīvi strādā pie citu GPU versijām.

ĀTRI

Viens no cuGraph apakšprojektiem, kas man šķita interesants, ir cugraphBLAS - centieni standartizēt grafu algoritmu celtniecības blokus lineārās algebras valodā. Pamatojoties uz GraphBLAS (graphblas.org), pielāgotu datu struktūru, kas paredzēta retu dinamisku grafu apstrādei.

Vēl viens cuGraph apakšprojekts Hornet nodrošina no sistēmas neatkarīgu formātu grafu datu saturēšanai, līdzīgi kā Apache bultiņa nodrošina no sistēmas neatkarīgu veidu, kā apstrādāt datu ietvarus. Hornet atbalsta lielāko daļu populāro grafu formātu, tostarp SNAP, mtx, metis un malas.

Saskaņā ar garu būt tuvu Python kopienai, Python vietējo NetworkX pakotni var izmantot sarežģītu tīklu izpētei. Tas ietver grafu un vairāku grafu datu struktūras, kas atkārtoti tiek papildinātas, izmantojot CUDA primitīvus, ļaujot atkārtoti izmantot daudzus standarta grafu algoritmus un veikt tīkla struktūras un analīzes pasākumus. Lielākā daļa algoritmu ir viena GPU, piemēram, NetworkX. Neskatoties uz to, to palaišana tikai ar GPU piedāvā ievērojamu paātrinājumu, savukārt darbs turpina pāriet uz vairāku GPU ieviešanu.

Rapidsas ceļvedī

Ņemot vērā milzīgo paātrinājumu, ko nodrošina uz GPU balstīta analīze, turpmākajās versijās ir iekļauti daži jauni projekti.

DLPack un array_interface dziļām mācībām

Daudzslāņu neironu tīkli bija viena no pirmajām slodzēm, kas tika pārvietotas uz GPU, un šim mašīnmācīšanās lietošanas gadījumam pastāv ievērojams koda kopums. Iepriekš DLPack bija de facto standarts datu apmaiņai starp dziļi mācošām bibliotēkām. Mūsdienās masīvs_interface parasti tiek atbalstīts. Rapids atbalsta abus.

cuSignal

Tāpat kā lielākā daļa citu Rapids projektu, arī cuSignal ir GPU paātrināta esošas Python bibliotēkas versija, šajā gadījumā SciPy Signal bibliotēka. Sākotnējā SciPy Signal bibliotēka ir balstīta uz NumPy, kas tiek aizstāts ar GPU paātrinātu ekvivalentu CuPy in cuSignal. Šis ir labs Rapids dizaina filozofijas piemērs darbā. Izņemot dažus pielāgotos CUDA kodolus, GPU ports galvenokārt ietver importa paziņojuma nomaiņu un dažu funkciju parametru pielāgošanu.

Signāla apstrādes ievešana Rapids krokā ir gudrs solis. Signālu apstrāde ir visur, un tai ir daudz uzreiz noderīgu komerciālu lietojumu rūpniecībā un aizsardzībā.

cuSpatial

Telpiskās un telpiskās laika operācijas ir lieliski GPU paātrināšanas kandidāti, un tie atrisina daudzas reālās pasaules problēmas, ar kurām mēs saskaramies ikdienas dzīvē, piemēram, analizējot satiksmes modeļus, augsnes veselību / kvalitāti un plūdu risku. Lielai daļai mobilo ierīču, tostarp bezpilota lidaparātu, savākto datu ir ģeotelpiska sastāvdaļa, un telpiskās analīzes ir Viedās pilsētas pamatā.

Tāpat kā citas sastāvdaļas, cuSpatial ir C ++ bibliotēka, kas veidota uz CUDA primitīviem un Thrust vektoru apstrādes bibliotēkas, datu apmaiņai izmantojot cuDF. C ++ bibliotēkas patērētāji var nolasīt punktu, polilīniju un daudzstūru datus, izmantojot C ++ lasītāju. Python lietotājiem labāk izmantot esošās Python paketes, piemēram, Shapely vai Fiona, lai aizpildītu NumPy masīvu, pēc tam izmantojot cuSpatial Python API vai pārveidojot par cuDF datu ietvariem.

cuxfilter datu vizualizēšanai

Datu vizualizēšana ir būtiska gan analīzes darbplūsmā, gan rezultātu prezentēšanai vai ziņošanai. Neskatoties uz visu burvību, ko GPU var strādāt ar pašiem datiem, šo datu nonākšana pārlūkprogrammā nav mazsvarīgs uzdevums. cuxfilter, kuru iedvesmojusi Crossfilter JavaScript bibliotēka, cenšas pārvarēt šo plaisu, nodrošinot kaudzīti, lai trešo pušu vizualizācijas bibliotēkas varētu attēlot datus cuDF datu ietvaros.

Ir bijuši daži cuxfilter atkārtojumi, jo komanda sakārto labāko arhitektūru un savienotāju modeļus. Jaunākajā atkārtojumā tiek izmantoti Jupyter piezīmjdatori, Bokeh serveris un PyViz paneļi, savukārt integrācijas eksperimenti ietver Uber, Falcon un PyDeck projektus. Šis komponents vēl nav gatavs galvenajam laikam, taču paredzēts izlaišanai Rapids 0.13. Ir daudz kustīgu detaļu, un man nav izdevies eksperimentēt ar to no pirmavotiem, taču, ja tas piepildīs solījumus, tas būs lielisks papildinājums Rapids rīkkopai.

Palielināšana un palielināšana ar Dask

Dask ir izplatīts Python uzdevumu plānotājs, spēlējot līdzīgu lomu Python, kādu Apache Spark spēlē Scala. Dask-cuDF ir bibliotēka, kas nodrošina sadalītus, ar GPU atbalstītus datu ietvarus. Dask-cuDF darbojas labi, ja plānojat izmantot cuML vai ielādējat datu kopu, kas ir lielāka par GPU atmiņu vai ir sadalīta vairākos failos.

Tāpat kā Spark RDD (elastīgā izplatītā datu kopa), arī Dask-cuDF izplatītais datu ietvars darbojas tāpat kā vietējais, tāpēc, ja nepieciešams palielināt, varat eksperimentēt ar vietējo mašīnu un pāriet uz izplatīto modeli. Dask-cuML dod cuML vairāku mezglu iespējas, padarot to par labu iespēju, ja jums nav budžeta DGX darbstacijai.