Преглед: Rapids на Nvidia внася Python анализи в GPU

Изграждането на модели за машинно обучение е повтарящ се процес. Често за първи път и рутина, това е игра на „най-бързият цикъл печели“, тъй като колкото по-бързо можете да повторите, толкова по-лесно е да изследвате нови теории и да получите добри отговори. Това е една от причините практическото използване на ИИ в предприятието днес е доминирано от най-големите предприятия, които могат да хвърлят огромни ресурси за проблема.

Rapids е чадър за няколко проекта с отворен код, инкубиран от Nvidia, който поставя целия процесор за обработка на графичния процесор, като елиминира I / O свързаните трансфери на данни, като същевременно значително увеличава скоростта на всяка от отделните стъпки. Той също така предоставя общ формат за данните, облекчавайки тежестта от обмена на данни между различни системи. На потребителско ниво Rapids имитира API на Python, за да улесни прехода за тази потребителска база.

Готварската книга Tidyverse

Архитектура на екосистемата на Rapids

Проектът Rapids има за цел да възпроизведе, в по-голямата си част, API за машинно обучение и анализ на данни на Python, но по-скоро за GPU, отколкото за CPU. Това означава, че разработчиците на Python вече разполагат с всичко, което им е необходимо, за да работят на графичния процесор, без да се налага да научават подробностите от ниското ниво на програмирането и паралелните операции на CUDA. Pythonistas могат да разработят код на машина, която не поддържа GPU, след което с няколко ощипвания го стартират на всички графични процесори, достъпни за тях.

Наборът от инструменти на Nvidia CUDA предоставя примитиви на по-ниско ниво за математически библиотеки, паралелни алгоритми и анализи на графики. В основата на архитектурата е рамката за данни на GPU, базирана на Apache Arrow, която осигурява колонна структура в данните в паметта, която е агностична на езика за програмиране. Потребителят взаимодейства с рамката за данни на GPU чрез cuDF и API, подобен на Pandas. Dask, библиотека на Python за паралелни изчисления, имитира API на Python нагоре по веригата и работи с CUDA библиотеки за паралелно изчисление. Помислете за Dask като за Spark за Python.

БЪРЗИ

Трите основни проекта, cuDF, cuML и cuGraph, са разработени независимо, но са проектирани да работят безпроблемно заедно. Мостове към по-широката екосистема на Python също се разработват като част от проекта.

Монтаж на бързина

Инсталирането чрез Anaconda на Linux машина в AWS беше предимно лесно, като се изключиха няколко хълцания поради промяна в зависимостите във версия 0.11. Инсталирането на библиотеките C / C ++ за използване на libcudf не беше толкова лесно и бих препоръчал да се придържате към API на Python и процеса на инсталиране на Conda. Rapids включва тетрадка Jupyter, достъпна и в безплатния Colab на Google, което улеснява започването. Използвах преносимия компютър Jupyter версия 0.10, за да стартирам кода на Google Colab, който включва графичен процесор Nvidia Tesla T4.

GPU данни на Rapids '

В основата на всеки работен процес в областта на науката за данни е рамката за данни. Това е мястото, където се случва инженеринг на функции и където се прекарва по-голямата част от времето, докато учените по данни обработват мръсни данни. cuDF е проектът на Rapids за GPU-базиран, подобен на Pandas кадър от данни. В основата на cuDF е libcudf, библиотека на C ++, реализираща примитиви на ниско ниво за импортиране на данни от Apache Arrow, извършване на математическа математика по масиви и изпълнение на сортиране, присъединяване, групиране, намаляване и други операции с матрици на паметта в GPU. Основната структура на данните на libcudf е GPU DataFrame (GDF), която от своя страна е моделирана на колоновото хранилище на данни на Apache Arrow.

БЪРЗИ

Библиотеката на Rapids Python представя на потребителя интерфейс от по-високо ниво, наподобяващ рамки с данни, като тези в Pandas. В много случаи кодът на Pandas работи непроменен на cuDF. Когато случаят не е такъв, обикновено се изискват само незначителни промени.

Потребителски функции в cuDF

След като сте преминали основната манипулация с данни, понякога е необходимо да обработвате редове и колони с дефинирани от потребителя функции (UDF). cuDF предоставя API на PyData стил за писане на код за обработка на по-задълбочени структури от данни като масиви, серии и движещи се прозорци. Понастоящем се поддържат само числови и булеви типове. UDF се компилират с помощта на компилатора Numba JIT, който използва подмножество на LLVM за компилиране на числови функции в машинен код CUDA. Това води до значително по-бързо време на работа на графичния процесор.

Струни в cuDF

Въпреки че графичните процесори са фантастични за бързо обработване на плаващи вектори, те обикновено не се използват за обработка на низови данни и реалността е, че повечето данни идват при нас под формата на низове. cuStrings е GPU библиотека за манипулиране на низове за разделяне, прилагане на регулярни изрази, конкатенация, замяна на маркери и др. в масиви от низове. Подобно на другите функции на cuDF, той е реализиран като библиотека C / C ++ (libnvStrings) и е обвит от слой Python, предназначен да имитира Pandas. Въпреки че типът низови данни не е оптимизиран за изпълнение на графични процесори, паралелното изпълнение на кода трябва да осигури ускоряване на манипулирането на низове на базата на процесора.

Получаване на данни във или извън cuDF

Dataframe I / O се обработва от специална библиотека, cuIO. Поддържат се всички най-често срещани формати, включително Arrow, ORC, Parquet, HDF5 и CSV. Ако имате късмета да работите на хардуер DGX-2, можете да използвате интеграция на GPU Direct Storage, за да преместите данни директно от високоскоростно съхранение в GPU, без да включвате процесора. Потребителите на Mortal все още ще оценят ускорението, което GPU дава при декомпресиране на големи масиви от данни, и тясната интеграция с екосистемата на Python.

Понастоящем GPU Direct Storage е в алфа версия и когато бъде пуснат, ще бъде наличен на повечето графични процесори на Tesla. Можете да създадете GPU рамка с данни от масиви NumPy, Pandas DataFrames и PyArrow таблици само с един ред код. Други проекти могат да обменят данни чрез __cuda_array_interface__за библиотеките, които попадат в екосистемата на Numba. DLPack за невронни мрежови библиотеки също е поддържан интерфейс.

Вероятно най-големият недостатък при използването на cuDF е липсата на оперативна съвместимост извън Python. Мисля, че фокусът върху силна основа на C / C ++ API, както направи Arrow, би позволил по-широка екосистема и ще бъде от полза за проекта като цяло.

CuML на Rapids

Декларираните цели на cuML са да бъде „Scikit-learn на Python, задвижван от графични процесори“. На теория това означава, че трябва да промените само изявлението си за импортиране и може би да настроите няколко от параметрите, за да отчетете разликите в работата на процесор, където понякога подходът на груба сила е по-добър. Ползата от наличието на базиран на GPU Scikit-learn е трудно да се занижи. Ускоренията са значителни и анализаторите на данни могат да бъдат в пъти по-продуктивни. API C ++ не е съвсем готов за широко потребление извън обвързването на Python, но се очаква това да се подобри.

cuML включва и API за помощ при настройка на хиперпараметри чрез Dask, библиотека за мащабиране на Python през множество възли. Много алгоритми за машинно обучение могат да бъдат направени ефективно паралелни и cuML активно разработва алгоритми както с много GPU, така и с много възли, с много GPU.

БЪРЗИ

CuGraph на Rapids

cuGraph е третият член на екосистемата Rapids и подобно на останалите, cuGraph е напълно интегриран с cuDF и cuML. Той предлага добър избор от графични алгоритми, примитиви и помощни програми, всички с ускорена графична производителност. Изборът на API в cuGraph е малко по-обширен, отколкото в други части на Rapids, с NetworkX, Pregel, GraphBLAS и GQL (Graph Query Language).

БЪРЗИ

cuGraph е по-скоро като набор от инструменти по дух, отколкото cuML. Графичната технология е бързо движещо се пространство както в академичните среди, така и в индустрията. По този начин, по дизайн, cuGraph дава на разработчиците достъп до C ++ слоя и примитиви на графики, насърчавайки трети страни да разработват продукти, използващи cuGraph. Няколко университета са допринесли, а проекти от Texas A&M (GraphBLAS), Georgia Tech (Hornet) и UC Davis (Gunrock) са „продуцирани“ и включени под чадъра cuGraph. Всеки проект предоставя различен набор от възможности, всички ускорени с GPU и всички подкрепени от една и съща рамка за данни cuDF.

NetworkX е API на Python, насочен от екипа на Rapids за своя роден интерфейс. Чрез този интерфейс има редица алгоритми. Докато единственият ранг на страницата е мулти-GPU, екипът работи активно по мулти-GPU версии на другите, където е приложимо.

БЪРЗИ

Един от подпроектите на cuGraph, който ми се стори интересен, е cugraphBLAS, опит за стандартизиране на градивните блокове за графични алгоритми на езика на линейната алгебра. Въз основа на GraphBLAS (graphblas.org), персонализирана структура от данни, предназначена за обработка на оскъдни динамични графики.

Друг подпроект на cuGraph, Hornet предоставя независим от системата формат за съдържане на графични данни, аналогичен на начина, по който стрелката Apache осигурява независим от системата начин за обработка на рамки от данни. Hornet поддържа повечето популярни графични формати, включително SNAP, mtx, metis и ръбове.

В съответствие с духа на близост до общността на Python, родният пакет NetworkX на Python може да се използва за изучаване на сложни мрежи. Това включва структури от данни за графики и многографи, преизпълнени с помощта на примитиви CUDA, което ви позволява да използвате повторно много от стандартните алгоритми на графики и да извършвате мрежова структура и мерки за анализ. По-голямата част от алгоритмите са с един графичен процесор, като NetworkX. Независимо от това, пускането им само на графичния процесор предлага значително ускорение, докато работата продължава да се придвижва към мулти-графични внедрения.

На пътната карта на Rapids 

Като се има предвид огромната скорост, която предоставя GPU-базиран анализ, има няколко нови проекта, които влизат в комбинацията в бъдещите версии.

DLPack и array_interface за задълбочено обучение

Многослойните невронни мрежи бяха едно от първите натоварвания, преместени в графични процесори, и за този случай на използване на машинно обучение съществува значително количество код. Преди това DLPack беше фактическият стандарт за обмен на данни между библиотеки за дълбоко обучение. В днешно време array_interface обикновено се поддържа. Rapids поддържа и двете.

cuSignal

Подобно на повечето други проекти в Rapids, cuSignal е GPU-ускорена версия на съществуваща библиотека на Python, в този случай SciPy Signal библиотека. Оригиналната библиотека SciPy Signal се основава на NumPy, която е заменена с еквивалента си с ускорен GPU, CuPy в cuSignal. Това е добър пример за действащата философия на Rapids. С изключение на няколко персонализирани ядра CUDA, портът към графичния процесор включва най-вече подмяна на инструкцията за импортиране и настройка на няколко функционални параметри. 

Пренасянето на обработката на сигнала в сгъването на Rapids е интелигентен ход. Обработката на сигнали е навсякъде и има много полезни търговски приложения в индустрията и отбраната.

cuSpatial

Пространствените и пространствено-временните операции са чудесни кандидати за ускоряване на GPU и решават много реални проблеми, с които се сблъскваме в ежедневието, като например анализ на моделите на трафика, здравето / качеството на почвата и риска от наводнения. Голяма част от данните, събрани от мобилни устройства, включително безпилотни летателни апарати, имат геопространствен компонент, а пространственият анализ е в основата на Smart City. 

Архитектурно подобно на другите компоненти, cuSpatial е библиотека на C ++, изградена върху примитиви CUDA и библиотека за обработка на вектор Thrust, използвайки cuDF за обмен на данни. Потребителите на библиотеката на C ++ могат да четат данните за точка, полилиния и многоъгълник, използвайки четец C ++. Потребителите на Python са по-добре да използват съществуващите пакети на Python като Shapely или Fiona, за да запълнят масив NumPy, след това да използват cuSpatial Python API или да конвертират в рамки за данни на cuDF. 

cuxfilter за визуализация на данни

Визуализирането на данни е от основно значение, както в рамките на работния процес на аналитика, така и за представяне или докладване на резултати. И все пак за цялата магия, която графичните процесори могат да работят върху самите данни, извеждането им в браузър не е тривиална задача. cuxfilter, вдъхновен от JavaScript библиотеката Crossfilter, има за цел да преодолее тази празнина, като предостави стек, за да позволи на библиотеките за визуализация на трети страни да показват данни в рамки с данни на cuDF.

Има няколко повторения на cuxfilter, тъй като екипът сортира най-добрата архитектура и модели на съединители. Последната итерация използва преносими компютри Jupyter, сървър Bokeh и панели PyViz, докато експериментите за интеграция включват проекти от Uber, Falcon и PyDeck. Този компонент все още не е готов за праймтайма, но е планиран за пускане в Rapids 0.13. Има много движещи се части и не успях да експериментирам с него от първа ръка, но ако изпълни обещанието си, това ще бъде чудесно допълнение към инструментариума на Rapids.

Мащабиране и намаляване с Dask

Dask е разпределен планировчик на задачи за Python, играейки подобна роля за Python, която Apache Spark играе за Scala. Dask-cuDF е библиотека, която предоставя разделени, подкрепени от GPU рамки за данни. Dask-cuDF работи добре, когато планирате да използвате cuML или когато зареждате набор от данни, който е по-голям от GPU паметта или е разпространен в множество файлове.

Подобно на Spark RDD (Resilient Distributed Dataset), Dask-cuDF разпределеният кадър от данни се държи най-вече точно като локален, така че можете да експериментирате с вашата локална машина и да преминете към разпределен модел, когато трябва да увеличите мащаба. Dask-cuML дава възможности на cuML за много възли, което го прави добра опция, когато нямате бюджет за работна станция DGX.