Programovanie

Recenzia: Nvidia’s Rapids prináša analytiku Pythonu na GPU

Budovanie modelov strojového učenia je opakujúci sa proces. Často je to rutina a rutina, toto je hra „najrýchlejší v priebehu cyklu vyhráva“, pretože čím rýchlejšie môžete iterovať, tým ľahšie je preskúmať nové teórie a získať dobré odpovede. To je jeden z dôvodov, prečo v praktickom podnikovom využívaní umelej inteligencie dnes dominujú najväčšie podniky, ktoré na tento problém môžu vrhnúť obrovské prostriedky.

Rapids je zastrešujúcim prvkom niekoľkých open source projektov inkubovaných spoločnosťou Nvidia, ktoré kladú celý procesný kanál na GPU, eliminujú viazané I / O dátové prenosy a zároveň podstatne zvyšujú rýchlosť každého z jednotlivých krokov. Poskytuje tiež spoločný formát údajov, čo uľahčuje výmenu údajov medzi rozdielnymi systémami. Na používateľskej úrovni program Rapids napodobňuje rozhranie Python API s cieľom uľahčiť prechod pre túto používateľskú základňu.

Tidyverse Cookbook

Architektúra ekosystému Rapids

Cieľom projektu Rapids je replikovať z väčšej časti API pre strojové učenie a analýzu dát Pythonu, ale skôr pre GPU ako pre CPU. To znamená, že vývojári Pythonu už majú všetko, čo potrebujú na spustenie na GPU, bez toho, aby sa museli učiť nízkoúrovňové podrobnosti programovania CUDA a paralelných operácií. Pythonisti môžu vyvíjať kód na stroji bez podpory GPU, potom ho s niekoľkými vylepšeniami spustiť na všetkých GPU, ktoré majú k dispozícii.

Sada nástrojov Nvidia CUDA poskytuje primitívy nižšej úrovne pre matematické knižnice, paralelné algoritmy a analýzu grafov. Srdcom architektúry je dátový rámec GPU založený na Apache Arrow, ktorý poskytuje stĺpcovú dátovú štruktúru v pamäti, ktorá je agnostická v programovacom jazyku. Užívateľ interaguje s dátovým rámcom GPU prostredníctvom cuDF a API podobného Pandas. Dask, knižnica Python pre paralelné výpočty, napodobňuje upstream Python API a pracuje s knižnicami CUDA pre paralelné výpočty. Myslite na Daska ako na Spark pre Python.

RÝCHLE

Tri hlavné projekty, cuDF, cuML a cuGraph, sú vyvinuté nezávisle, ale sú navrhnuté tak, aby hladko spolupracovali. V rámci projektu sa tiež vyvíjajú mosty k širšiemu ekosystému Python.

Inštalácia perejí

Inštalácia cez Anaconda na stroji s Linuxom v AWS bola väčšinou jednoduchá, okrem pár závislostí vo verzii 0.11 bolo zablokované pár štikútok. Inštalácia knižníc C / C ++ na použitie knižnice libcudf nebola taká ľahká a odporúčal by som sa držať procesu Python API a procesu inštalácie Conda. Rapids obsahuje notebook Jupyter, ktorý je k dispozícii aj v bezplatnom serveri Colab od spoločnosti Google, čo uľahčuje začiatky. Na spustenie kódu v Google Colab, ktorý obsahuje GPU Nvidia Tesla T4, som použil notebook Jupyter vo verzii 0.10.

Dátový rámec GPU spoločnosti Rapids

Jadrom každého pracovného toku dátovej vedy je dátový rámec. Toto je miesto, kde sa deje inžinierstvo funkcií a kde sa trávi väčšina času, keď sa vedci zaoberajú špinavými dátami. cuDF je projekt Rapids pre dátový rámec podobný GPU založený na Pandas. Základom cuDF je libcudf, knižnica C ++ implementujúca nízkoúrovňové primitívy na import údajov Apache Arrow, vykonávanie elementárnej matematiky na poliach a vykonávanie triedenia, spájania, zoskupovania, redukcie a ďalších operácií na maticiach pamäte v GPU. Základnou dátovou štruktúrou súboru libcudf je GPU DataFrame (GDF), ktorý je zase modelovaný na stĺpcovom úložisku dát Apache Arrow.

RÝCHLE

Knižnica Rapids Python poskytuje používateľovi rozhranie na vyššej úrovni pripomínajúce dátové rámce, aké sú napríklad v Pandách. V mnohých prípadoch beží kód Pandas na cuDF nezmenený. Ak to tak nie je, zvyčajne sú potrebné iba malé zmeny.

Užívateľom definované funkcie v cuDF

Po prekonaní základnej manipulácie s údajmi je niekedy potrebné spracovávať riadky a stĺpce pomocou používateľsky definovaných funkcií (UDF). cuDF poskytuje rozhranie PyData API na písanie kódu na spracovanie podrobnejších dátových štruktúr, ako sú polia, rady a pohyblivé okná. V súčasnosti sú podporované iba numerické a booleovské typy. UDF sa kompilujú pomocou kompilátora Numba JIT, ktorý používa podmnožinu LLVM na kompiláciu numerických funkcií do strojového kódu CUDA. To má za následok podstatne kratšie doby chodu na GPU.

Struny v cuDF

Aj keď sú GPU fantastické pre rýchle spracovanie plavákových vektorov, zvyčajne sa nepoužívali na spracovanie údajov reťazcov a realita je taká, že väčšina údajov k nám prichádza vo forme reťazcov. cuStrings je knižnica na manipuláciu s reťazcami GPU na rozdelenie, použitie regulárnych výrazov, zreťazenie, nahradenie tokenov atď. v poliach reťazcov. Rovnako ako ďalšie funkcie cuDF je implementovaný ako knižnica C / C ++ (libnvStrings) a zabalený vrstvou Pythonu určenou na napodobnenie Pand. Aj keď dátový typ reťazca nie je optimalizovaný na vykonávanie na GPU, paralelné vykonávanie kódu by malo zabezpečiť zrýchlenie manipulácie s reťazcami na báze procesora.

Získavanie údajov do alebo z cuDF

I / O dátových rámcov spracúva vyhradená knižnica cuIO. Podporované sú všetky najčastejšie sa vyskytujúce formáty, vrátane Arrow, ORC, Parquet, HDF5 a CSV. Ak máte šťastie, že bežíte na hardvéri DGX-2, môžete použiť integráciu GPU Direct Storage na presun údajov priamo z vysokorýchlostného úložiska do GPU bez zapojenia CPU. Používatelia smrteľníkov stále ocenia zrýchlenie, ktoré poskytuje GPU pri dekompresii veľkých súborov údajov, a úzku integráciu s ekosystémom Python.

GPU Direct Storage je momentálne v alfa verzii a po vydaní bude k dispozícii na väčšine GPU Tesla. Dátový rámec GPU môžete vytvoriť z polí NumPy, Pandas DataFrames a PyArrow tabuliek iba s jedným riadkom kódu. Ostatné projekty si môžu vymieňať údaje prostredníctvom __cuda_array_interface__ pre knižnice, ktoré spadajú do ekosystému Numba. DLPack pre knižnice neurónových sietí je tiež podporovaným rozhraním.

Pravdepodobne najväčšou nevýhodou pri používaní cuDF je nedostatok interoperability mimo Pythonu. Myslím si, že zameranie na silný základ C / C ++ API, ako to urobila spoločnosť Arrow, by umožnilo širší ekosystém a prinieslo úžitok projektu ako celku.

CuML rapids

Stanovené ciele cuML majú byť „Python’s Scikit-learn powered by GPU“. Teoreticky to znamená, že by ste mali zmeniť iba príkaz na import a možno vyladiť niekoľko parametrov, aby ste zohľadnili rozdiely v behu na CPU, kde je niekedy lepší prístup hrubou silou. Výhody, ktoré ponúka Scikit-learn založený na GPU, sú ťažko pochopiteľné. Zrýchlenia sú značné a analytici údajov môžu byť mnohokrát produktívnejší. C ++ API nie je celkom pripravené na širokú spotrebu mimo svojich väzieb na Python, ale očakáva sa, že sa to zlepší.

cuML tiež obsahuje API na pomoc s ladením hyperparametra cez Dask, knižnicu na škálovanie Pythonu cez viac uzlov. Mnoho algoritmov strojového učenia sa dá efektívne vytvoriť paralelne a cuML aktívne vyvíja algoritmy s viacerými grafickými procesormi aj s viacerými uzlami a viacerými grafickými procesormi.

RÝCHLE

CuGraph Rapids

cuGraph je tretím členom ekosystému Rapids a rovnako ako ostatné, je cuGraph plne integrovaný s cuDF a cuML. Ponúka dobrý výber grafických algoritmov, primitívov a pomocných programov, všetky s výkonom akcelerovaným pomocou GPU. Výber API v cuGraph je o niečo rozsiahlejší ako v iných častiach Rapids, pričom sú k dispozícii všetky verzie NetworkX, Pregel, GraphBLAS a GQL (Graph Query Language).

RÝCHLE

cuGraph je skôr duchom ako sada nástrojov ako cuML. Technológia grafov je rýchlo sa rozvíjajúcim priestorom v akademickej aj priemyselnej oblasti. Podľa návrhu teda cuGraph poskytuje vývojárom prístup k primitívnym vrstvám vrstvy C ++ a grafom, čo podporuje tretie strany pri vývoji produktov pomocou cuGraph. Prispelo niekoľko univerzít a projekty z Texasu A&M (GraphBLAS), Georgia Tech (Hornet) a UC Davis (Gunrock) boli „produktizované“ a zahrnuté do zastrešenia cuGraph. Každý projekt poskytuje inú sadu funkcií, všetky sú akcelerované GPU a všetky sú podporované rovnakým dátovým rámcom cuDF.

NetworkX je rozhranie Python API, na ktoré sa zameral tím Rapids pre svoje natívne rozhranie. Existuje veľké množstvo algoritmov dostupných cez toto rozhranie. Aj keď iba multi-GPU má hodnotenie iba stránok, tím aktívne pracuje na verziách ostatných GPU s ostatnými, kde je to vhodné.

RÝCHLE

Jedným z podprojektov cuGraph, ktorý mi pripadal zaujímavý, je cugraphBLAS, úsilie štandardizovať stavebné bloky pre grafové algoritmy v jazyku lineárnej algebry. Na základe GraphBLAS (graphblas.org), vlastnej dátovej štruktúry určenej na riedke dynamické spracovanie grafov.

Ďalším subprojektom cuGraph, Hornet poskytuje systémovo nezávislý formát pre ukladanie údajov grafov, analogicky k tomu, ako šípka Apache poskytuje systémovo nezávislý spôsob spracovania dátových rámcov. Hornet podporuje väčšinu populárnych formátov grafov vrátane SNAP, mtx, metis a edge.

V súlade s duchom blízkosti komunity Pythonu je možné na štúdium komplexných sietí použiť natívny balík NetworkX od Pythonu. Patria sem dátové štruktúry pre grafy a multi-grafy, ktoré sa opätovne implementujú pomocou primitív CUDA, čo vám umožňuje opätovné použitie mnohých štandardných grafových algoritmov a vykonávanie sieťovej štruktúry a analytických opatrení. Väčšina algoritmov je s jedným GPU, napríklad NetworkX. Samotné ich spustenie na GPU však ponúka značné zrýchlenie, zatiaľ čo práce pokračujú v prechode na implementácie s viacerými GPU.

Na cestovnej mape Rapids

Vzhľadom na obrovské zrýchlenie, ktoré poskytuje analytika založená na GPU, prichádza do mixu budúcich verzií niekoľko nových projektov.

DLPack a array_interface pre hlboké učenie

Viacvrstvové neurónové siete boli jedným z prvých pracovných zaťažení presunutých na GPU a pre tento prípad použitia strojového učenia existuje veľká časť kódu. Predtým bol DLPack de-facto štandardom pre výmenu údajov medzi knižnicami hlbokého učenia. V dnešnej dobe je array_interface bežne podporované. Rapids podporuje oboje.

cuSignal

Rovnako ako väčšina ostatných projektov v Rapids, aj cuSignal je GPU-akcelerovaná verzia existujúcej knižnice Python, v tomto prípade knižnice SciPy Signal. Pôvodná knižnica signálov SciPy je založená na NumPy, ktorá je nahradená ekvivalentom akcelerovaným GPU, CuPy v cuSignal. Toto je dobrý príklad filozofie dizajnu Rapids pri práci. S výnimkou niekoľkých vlastných jadier CUDA port pre GPU väčšinou vyžaduje nahradenie príkazu import a vylepšenie niekoľkých funkčných parametrov.

Zavedenie spracovania signálu do záhybu Rapids je chytrý krok. Spracovanie signálu je všade a má mnoho okamžite užitočných komerčných aplikácií v priemysle a obrane.

cuSpatial

Priestorové a časopriestorové operácie sú skvelými kandidátmi na akceleráciu GPU a riešia mnohé problémy v reálnom svete, s ktorými sa stretávame v každodennom živote, ako je analýza dopravných vzorov, zdravie / kvalita pôdy a povodňové riziko. Veľká časť údajov zhromaždených mobilnými zariadeniami vrátane dronov má geopriestorovú zložku a priestorová analýza je jadrom Smart City.

CuSpatial je podobne ako ostatné komponenty knižnica C ++ postavená na primitívach CUDA a knižnici spracovania vektorov Thrust, ktorá na výmenu dát používa cuDF. Spotrebitelia knižnice C ++ môžu čítať údaje o bodoch, čiarach a polygónoch pomocou čítačky C ++. Používateľom Pythonu je lepšie používať existujúce balíčky Pythonu ako Shapely alebo Fiona na vyplnenie poľa NumPy, potom použiť cuSpatial Python API alebo konverziu na cuDF dataframes.

cuxfilter na vizualizáciu údajov

Vizualizácia údajov je zásadná, a to ako v rámci analytického pracovného toku, tak aj pri prezentácii alebo vykazovaní výsledkov. Napriek všetkej mágii, ktorú GPU môžu pracovať na samotných údajoch, nie je dostať tieto údaje do prehliadača triviálna úloha. cuxfilter, inšpirovaný knižnicou JavaScript Crossfilter, sa zameriava na prekonanie tejto medzery poskytnutím zásobníka, ktorý umožňuje vizualizačným knižniciam tretích strán zobrazovať údaje v údajových rámcoch cuDF.

Ako tím triedi najlepšiu architektúru a vzory konektorov, došlo k niekoľkým opakovaniam cuxfilteru. Posledná iterácia využíva notebooky Jupyter, server Bokeh a panely PyViz, zatiaľ čo integračné experimenty zahŕňajú projekty od spoločností Uber, Falcon a PyDeck. Táto súčasť ešte nie je úplne pripravená na hlavný vysielací čas, ale je naplánovaná na vydanie v Rapids 0.13. Pohyblivých častí je veľa a ja som s tým nemal experimentovať z prvej ruky, ale ak splní svoj prísľub, bude to vynikajúci doplnok k súprave nástrojov Rapids.

Škálovanie a odchádzanie s Daskom

Dask je distribuovaný plánovač úloh pre Python, ktorý hrá pre Python podobnú rolu, ktorú Apache Spark hrá pre Scalu. Dask-cuDF je knižnica, ktorá poskytuje rozdelené dátové rámce podporované GPU. Dask-cuDF funguje dobre, keď plánujete použiť cuML alebo keď načítate množinu údajov, ktorá je väčšia ako pamäť GPU alebo je rozložená do viacerých súborov.

Rovnako ako Spark RDD (Resilient Distributed Dataset), aj distribuovaný dátový rámec Dask-cuDF sa väčšinou chová ako miestny, takže môžete experimentovať s miestnym strojom a prejsť na distribuovaný model, keď sa potrebujete zväčšiť. Dask-cuML poskytuje možnosti viacerých uzlov cuML, čo je dobrá voľba, ak nemáte rozpočet na pracovnú stanicu DGX.

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