Programování

Recenze: Nvidia's Rapids přináší analytiku Pythonu na GPU

Vytváření modelů strojového učení je opakovaný proces. Jedná se o hru „nejrychlejší v cyklu vyhrávající“, která je často rutinní a rutinní, protože čím rychleji iterujete, tím snazší je prozkoumat nové teorie a získat dobré odpovědi. To je jeden z důvodů, proč v praktickém podnikovém využití AI dnes dominují největší podniky, které na tento problém mohou vrhnout obrovské zdroje.

Rapids zastřešuje několik projektů s otevřeným zdrojovým kódem, inkubovaných společností Nvidia, která staví celý zpracovatelský kanál na GPU, eliminuje datově vázané datové přenosy a současně podstatně zvyšuje rychlost každého z jednotlivých kroků. Poskytuje také společný formát dat, což usnadňuje zátěž výměny dat mezi různorodými systémy. Na uživatelské úrovni napodobuje Rapids rozhraní Python API, aby usnadnil přechod pro tuto uživatelskou základnu.

Tidyverse Cookbook

Architektura ekosystému Rapids

Projekt Rapids si klade za cíl replikovat z větší části API pro strojové učení a analýzu dat Pythonu, ale spíše pro GPU než pro CPU. To znamená, že vývojáři Pythonu již mají vše, co potřebují ke spuštění na GPU, aniž by se museli učit podrobnosti na nízké úrovni programování CUDA a paralelních operací. Pythonistas může vyvíjet kód na stroji bez podpory GPU a poté jej s několika vylepšeními spustit na všech GPU, které mají k dispozici.

Sada nástrojů Nvidia CUDA poskytuje primitiva nižší úrovně pro matematické knihovny, paralelní algoritmy a analýzu grafů. Srdcem architektury je datový rámec GPU založený na Apache Arrow, který poskytuje sloupcovou datovou strukturu v paměti, která je agnostická v programovacím jazyce. Uživatel interaguje s datovým rámcem GPU pomocí cuDF a API podobného Pandas. Dask, knihovna Pythonu pro paralelní výpočet, napodobuje upstream Python API a pracuje s knihovnami CUDA pro paralelní výpočet. Přemýšlejte o Dasku jako o Sparku pro Python.

PEŘEJE

Tři hlavní projekty, cuDF, cuML a cuGraph, jsou vyvíjeny samostatně, ale jsou navrženy tak, aby hladce spolupracovaly. Součástí projektu jsou také mosty k širšímu pythonovskému ekosystému.

Instalace peřejí

Instalace přes Anaconda na stroji s Linuxem v AWS byla většinou přímá, blokovala pár škytavek kvůli změně závislostí ve verzi 0.11. Instalace knihoven C / C ++ pro použití libcudf nebyla tak snadná a doporučil bych se držet instalačních procesů Python API a Conda. Rapids obsahuje notebook Jupyter, který je k dispozici také v bezplatném Colabu společnosti Google, což usnadňuje začátek. Ke spuštění kódu na Google Colab jsem použil notebook Jupyter verze 0.10, který obsahuje GPU Nvidia Tesla T4.

Datový rámec GPU společnosti Rapids

Jádrem každého pracovního toku datové vědy je datový rámec. To je místo, kde se děje inženýrství funkcí a kde se tráví většina času, protože vědci v oblasti dat hádají špinavá data. cuDF je projekt Rapids pro datový rámec na bázi GPU, podobný pandám. Základem cuDF je libcudf, knihovna C ++ implementující nízkoúrovňová primitiva pro import dat Apache Arrow, provádění elementární matematiky na polích a provádění řazení, spojování, seskupování, redukce a dalších operací v maticích paměti GPU. Základní datovou strukturou libcudf je GPU DataFrame (GDF), který je zase modelován ve sloupcovém datovém úložišti Apache Arrow.

PEŘEJE

Knihovna Rapids Python poskytuje uživateli rozhraní na vyšší úrovni připomínající datové rámce, jako jsou ty v Pandách. V mnoha případech běží kód Pandas beze změny na cuDF. Pokud tomu tak není, jsou obvykle nutné pouze drobné změny.

Uživatelem definované funkce v cuDF

Jakmile projdete základní manipulací s daty, je někdy nutné zpracovávat řádky a sloupce pomocí uživatelsky definovaných funkcí (UDF). cuDF poskytuje rozhraní PyData API pro psaní kódu pro zpracování více datových struktur s jasným průběhem, jako jsou pole, řady a pohyblivá okna. V současné době jsou podporovány pouze číselné a booleovské typy. UDF se kompilují pomocí kompilátoru Numba JIT, který používá podmnožinu LLVM ke kompilaci numerických funkcí do strojového kódu CUDA. Výsledkem je podstatně rychlejší doba chodu na GPU.

Řetězce v cuDF

Ačkoli GPU jsou fantastické pro rychlé zpracování floatových vektorů, obvykle se nepoužívají ke zpracování dat řetězců a realita je taková, že většina dat k nám přichází ve formě řetězců. cuStrings je knihovna pro manipulaci s řetězci GPU pro rozdělení, použití regexů, zřetězení, nahrazení tokenů atd. v polích řetězců. Stejně jako ostatní funkce cuDF je implementován jako knihovna C / C ++ (libnvStrings) a zabalen vrstvou Pythonu určenou k napodobování Pand. Ačkoli datový typ řetězce není optimalizován pro provádění na GPU, paralelní spuštění kódu by mělo zajistit zrychlení manipulace s řetězci založenou na CPU.

Získávání dat do nebo z cuDF

I / O datového rámce zpracovává vyhrazená knihovna cuIO. Jsou podporovány všechny nejčastěji se vyskytující formáty, včetně Arrow, ORC, Parquet, HDF5 a CSV. Pokud máte to štěstí, že běžíte na hardwaru DGX-2, můžete použít integraci GPU Direct Storage k přesunu dat přímo z vysokorychlostního úložiště do GPU bez zapojení CPU. Uživatelé smrtelníků stále ocení zrychlení, které GPU poskytuje při dekompresi velkých datových sad, a úzkou integraci s ekosystémem Pythonu.

Přímé úložiště GPU je aktuálně v alfa verzi a po vydání bude k dispozici na většině GPU Tesla. Datový rámec GPU můžete vytvořit z polí NumPy, Pandas DataFrames a PyArrow pomocí jediného řádku kódu. Jiné projekty si mohou vyměňovat data prostřednictvím __cuda_array_interface__ pro knihovny, které spadají do ekosystému Numba. DLPack pro knihovny neuronových sítí je také podporovaným rozhraním.

Pravděpodobně největší nevýhodou při používání cuDF je nedostatek interoperability mimo Python. Myslím, že zaměření na silný základ API C / C ++, jak to udělala společnost Arrow, by umožnilo širší ekosystém a prospělo projektu jako celku.

Rapids 'cuML

Stanovenými cíli cuML je být „Pythonův Scikit-learn založený na GPU“. Teoreticky to znamená, že byste měli pouze změnit své prohlášení o importu a možná vyladit několik parametrů, aby zohlednili rozdíly v běhu na CPU, kde je někdy lepší přístup hrubou silou. Výhody, které má Scikit-learn založený na GPU, je těžké pochopit. Zrychlení jsou značná a analytici dat mohou být mnohokrát produktivnější. Rozhraní C ++ API není zcela připraveno na širokou spotřebu mimo své vazby Pythonu, ale očekává se, že se to zlepší.

cuML také zahrnuje API pro pomoc s laděním hyperparametru přes Dask, knihovnu pro škálování Pythonu přes více uzlů. Mnoho algoritmů strojového učení lze efektivně vytvořit paralelně a cuML aktivně vyvíjí jak multi-GPU, tak víceuzlové, multi-GPU algoritmy.

PEŘEJE

Rapids 'cuGraph

cuGraph je třetím členem ekosystému Rapids a stejně jako ostatní je cuGraph plně integrován s cuDF a cuML. Nabízí dobrý výběr grafických algoritmů, primitiv a nástrojů, vše s výkonem zrychleným pomocí GPU. Výběr API v cuGraph je poněkud rozsáhlejší než v jiných částech Rapids, přičemž jsou k dispozici všechny NetworkX, Pregel, GraphBLAS a GQL (Graph Query Language).

PEŘEJE

cuGraph je spíše duchovní sada nástrojů než cuML. Technologie grafů je rychle se rozvíjejícím prostorem jak v akademické sféře, tak v průmyslu. Podle návrhu tedy cuGraph poskytuje vývojářům přístup k C ++ vrstvě a primitivům grafů, což povzbuzuje třetí strany k vývoji produktů pomocí cuGraph. Přispělo několik univerzit a projekty z Texasu A&M (GraphBLAS), Georgia Tech (Hornet) a UC Davis (Gunrock) byly „vyrobeny“ a zahrnuty do zastřešení cuGraph. Každý projekt poskytuje jinou sadu funkcí, všechny akcelerované GPU a všechny podporované stejným datovým rámcem cuDF.

NetworkX je rozhraní Python API zaměřené týmem Rapids pro jeho nativní rozhraní. Prostřednictvím tohoto rozhraní je k dispozici celá řada algoritmů. I když pouze hodnocení stránek je multi-GPU, tým aktivně pracuje na verzích ostatních GPU ostatních, kde je to možné.

PEŘEJE

Jeden z podprojektů cuGraph, který mi připadal zajímavý, je cugraphBLAS, snaha o standardizaci stavebních bloků pro grafové algoritmy v jazyce lineární algebry. Na základě GraphBLAS (graphblas.org), vlastní datové struktury určené pro řídké zpracování dynamických grafů.

Další subprojekt cuGraph, Hornet poskytuje systémově nezávislý formát pro ukládání dat grafů, analogicky k tomu, jak šipka Apache poskytuje systémově nezávislý způsob zpracování datových rámců. Hornet podporuje většinu populárních formátů grafů včetně SNAP, mtx, metis a edge.

V souladu s duchem blízkosti komunity Pythonu lze pro studium komplexních sítí použít nativní balíček NetworkX od Pythonu. To zahrnuje datové struktury pro grafy a multi-grafy, znovu implementované pomocí primitiv CUDA, což vám umožní znovu použít mnoho standardních grafových algoritmů a provést síťovou strukturu a analytická opatření. Většina algoritmů je single-GPU, jako NetworkX. Samotné jejich spuštění na GPU však nabízí značné zrychlení, zatímco práce pokračují v přechodu na implementace s více GPU.

Na plánu Rapids

Vzhledem k obrovskému zrychlení, které poskytuje analytika založená na GPU, existuje v budoucích verzích několik nových projektů.

DLPack a array_interface pro hluboké učení

Vícevrstvé neuronové sítě byly jednou z prvních úloh přenesených na GPU a pro tento případ použití strojového učení existuje značná část kódu. Dříve byl DLPack de-facto standardem pro výměnu dat mezi knihovnami hlubokého učení. V dnešní době je array_interface běžně podporováno. Rapids podporuje obojí.

cuSignal

Stejně jako většina ostatních projektů v Rapids je cuSignal GPU akcelerovanou verzí existující knihovny Pythonu, v tomto případě knihovny SciPy Signal. Původní knihovna SciPy Signal je založena na NumPy, který je nahrazen ekvivalentem s akcelerací GPU, CuPy v cuSignal. Toto je dobrý příklad filozofie designu Rapids při práci. S výjimkou několika vlastních jader CUDA zahrnuje port GPU většinou nahrazení příkazu import a vyladění několika funkčních parametrů.

Zpracování signálu do záhybu Rapids je chytrý krok. Zpracování signálu je všude a má mnoho okamžitě užitečných komerčních aplikací v průmyslu a obraně.

cuSpatial

Prostorové a časoprostorové operace jsou skvělými kandidáty na zrychlení GPU a řeší mnoho problémů v reálném světě, kterým čelíme v každodenním životě, jako je analýza vzorů dopravy, zdraví / kvality půdy a povodňové riziko. Velká část dat shromážděných mobilními zařízeními, včetně dronů, má geoprostorovou složku a prostorová analýza je srdcem Smart City.

CuSpatial, navržený jako ostatní komponenty, je knihovna C ++ postavená na primitivech CUDA a knihovně zpracování vektorů Thrust, která pro výměnu dat používá cuDF. Spotřebitelé knihovny C ++ mohou číst data bodů, křivek a mnohoúhelníků pomocí čtečky C ++. Uživatelé Pythonu jsou na tom lépe, když použijí existující balíčky Pythonu jako Shapely nebo Fiona k vyplnění pole NumPy, pak použijí API CuSpatial Python nebo převedou na datové rámce cuDF.

cuxfilter pro vizualizaci dat

Vizualizace dat je zásadní, a to jak v rámci analytického pracovního toku, tak pro prezentaci nebo vykazování výsledků. Přesto pro všechna kouzla, že GPU mohou pracovat na samotných datech, není získání těchto dat do prohlížeče triviální úkol. cuxfilter, inspirovaný knihovnou JavaScript Crossfilter, si klade za cíl překlenout tuto mezeru poskytnutím zásobníku, který umožní vizualizačním knihovnám třetích stran zobrazovat data v datových rámcích cuDF.

Při třídění nejlepší architektury a vzorů konektorů došlo k několika iteracím cuxfilteru. Nejnovější iterace využívá notebooky Jupyter, server Bokeh a panely PyViz, zatímco integrační experimenty zahrnují projekty od společností Uber, Falcon a PyDeck. Tato komponenta ještě není připravena na hlavní vysílací čas, ale má být vydána v Rapids 0.13. Existuje spousta pohyblivých částí a já jsem s tím experimentovat nemusel z první ruky, ale pokud splní svůj slib, bude to skvělý doplněk k sadě nástrojů Rapids.

Škálování nahoru a ven s Daskem

Dask je distribuovaný plánovač úloh pro Python, který hraje podobnou roli pro Python, kterou Apache Spark hraje pro Scalu. Dask-cuDF je knihovna, která poskytuje dělené datové rámce podporované GPU. Dask-cuDF funguje dobře, když plánujete použít cuML nebo když načítáte datovou sadu, která je větší než paměť GPU nebo je rozložena do více souborů.

Stejně jako Spark RDD (odolná distribuovaná datová sada) se distribuovaný datový rámec Dask-cuDF většinou chová stejně jako místní, takže můžete experimentovat s místním počítačem a přejít na distribuovaný model, když potřebujete zvětšit. Dask-cuML poskytuje možnosti více uzlů cuML, takže je dobrou volbou, pokud nemáte rozpočet na pracovní stanici DGX.

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