Кратко про экосистему RAPIDS для работы с данными на GPU

590c7ed4fb0261873ac4e7e7e6cd7700.png

Привет, Хабр!

RAPIDS — это open source библиотека экосистема, состоящая из нескольких библиотек, разработанная NVIDIA, которая предоставляет набор инструментов для выполнения всего цикла обработки данных и аналитики на GPU. RAPIDS была создана с целью того, чтобы ускорить анализ данных и работу в ML, используя всю мощь GPU, и делает это, предоставляя в целом привычный интерфейс, похожий на тот, к которому привыкли в Pandas, Scikit-learn и т.д.

RAPIDS основан на CUDA, архитектуре параллельных вычислений от NVIDIA. Операции, которые когда-то занимали минуты или часы на CPU, теперь могут быть выполнены за секунды на GPU, благодаря параллелизму и высокой пропускной способности памяти GPU.

Основные компоненты RAPIDS

cuDF — это библиотека, часть экосистемы RAPIDS, предоставляющая интерфейс DataFrame, подобный Pandas, но для выполнения операций на GPU. Она позволяет выполнять множество операций предварительной обработки данных, включая фильтрацию, сортировку, группировку и агрегацию, ускоряя все эти процессы благодаря параллелизму

Основные возможности:

  • Чтение и запись данных в различных форматах (CSV, JSON, Parquet и другие).

  • Выполнение операций преобразования данных, таких как сортировка, группировка, агрегация.

  • Объединение и соединение различных наборов данных.

  • Поддержка пользовательских функций для выполнения произвольных операций на GPU.

cuML — это уже библиотека ML, предназначенная для выполнения классических алгоритмов и моделей машинного обучения на GPU с API, аналогичным Scikit-learn.

Основные возможности:

  • Поддержка большого числа алгоритмов машинного обучения, включая классификацию, регрессию, кластеризацию и уменьшение размерности.

  • Ускорение тренировки моделей и предсказаний.

  • Простая интеграция с другими компонентами RAPIDS.

Существует также cuGraph для анализа графов. С ней можно проводить поиск кратчайшего пути, вычисление центральности вершин и выявление сообществ, на GPU.

cuSpatial для геопространственной и темпоральной аналитики.

cuSignal для обработки сигналов на GPU.

Установим:

Но для начала — системные требования:

  • GPU NVIDIA: RAPIDS разработан для работы с GPU NVIDIA, поэтому наличие совместимой видеокарты обязательно. Поддерживаемые модели включают серии NVIDIA Pascal™, Volta™, Turing™ и Ampere™.

  • Операционная система: RAPIDS поддерживает Ubuntu 16.04/18.04/20.04, CentOS 7/8 и RHEL 7/8. Для пользователей Windows и MacOS есть возможность использовать Docker или WSL 2 для запуска RAPIDS.

  • CUDA Toolkit: для работы RAPIDS необходим CUDA Toolkit версии 10.1 или выше. Версия CUDA должна соответствовать возможностям видеокарты.

Наиболее простой и рекомендуемый нами способ установки RAPIDS — использование менеджера пакетов Conda:

# для создания нового conda-окружения с именем rapids и установки RAPIDS
conda create -n rapids-0.19 -c rapidsai -c nvidia -c conda-forge \
    rapids=0.19 python=3.7 cudatoolkit=11.0

rapids-0.19 — это имя окружения, rapids=0.19 указывает на версию RAPIDS, а cudatoolkit=11.0 — на версию CUDA Toolkit.

Для юзеров Docker, NVIDIA и RAPIDS имеет образы Docker, предварительно настроенные для работы с RAPIDS:

# загрузка и запуск контейнера RAPIDS
docker pull rapidsai/rapidsai:0.19-cuda11.0-runtime-ubuntu18.04-py3.7
docker run --gpus all -it -p 8888:8888 rapidsai/rapidsai:0.19-cuda11.0-runtime-ubuntu18.04-py3.7

Команды загружают образ Docker с установленным RAPIDS и запускают его, предоставляя доступ к Jupyter Notebook на порту 8888.

На Windows можно использовать WSL 2, установив подсистему Linux и следуя инструкциям установки для Ubuntu.

Для MacOS, к сожалению, прямая установка RAPIDS невозможна из-за отсутствия поддержки GPU NVIDIA, но можно использовать облачные решения или Docker для работы с RAPIDS в вирт. среде.

Библиотека cuDF

Так же, как и в Pandas, в cuDF можно создавать DataFrame из различных источников данных, включая словари, массивы и файлы разных форматов:

import cudf
import numpy as np

# DataFrame из словаря
data = {'a': range(10), 'b': np.random.rand(10)}
df = cudf.DataFrame(data)

# DataFrame из массива
arr = np.random.rand(10, 2)
df_from_array = cudf.DataFrame(arr, columns=['x', 'y'])

cuDF поддерживает чтение и запись файлов в различных форматах, таких как CSV, Parquet, JSON:

# чтение из CSV
df = cudf.read_csv('data.csv')

# запись в Parquet
df.to_parquet('data.parquet')

Существуют реализации предварительной обработки и анализа данных, включая фильтрацию, сортировку, группировку и агрегацию:

# фильтрация
filtered_df = df[df['a'] > 5]

# сортировка
sorted_df = df.sort_values(by='b')

# группировка и агрегация
grouped_df = df.groupby('a').agg({'b': 'mean'})

Можно объединять и соединять различные наборы данных:

# слияние двух DataFrame
merged_df = cudf.merge(df1, df2, on='key')

# соединение (join)
joined_df = df1.join(df2, lsuffix='_left', rsuffix='_right')

В сравнении с Pandas большинство операций в зависимости от GPU выполняется в 4–10 раз быстрей.

Библиотека cuML

Пример линейной регрессии в cuML аналогичен тому, как это делается в Scikit-learn:

from cuml.linear_model import LinearRegression
import cudf
import numpy as np

X = np.random.rand(10000, 10)
y = np.dot(X, np.random.rand(10))

# преобразование данных в формат, поддерживаемый cuML
X_gpu = cudf.DataFrame(X)
y_gpu = cudf.Series(y)

model = LinearRegression(fit_intercept=True, normalize=True, algorithm='eig')
model.fit(X_gpu, y_gpu)

predictions = model.predict(X_gpu)

Алгоритм KMeans для кластеризации данных:

from cuml.cluster import KMeans
import cudf
import numpy as np

X = np.random.rand(10000, 2)

X_gpu = cudf.DataFrame(X)

# создание и тренировка модели KMeans
kmeans = KMeans(n_clusters=5)
kmeans.fit(X_gpu)

# получение меток кластеров
labels = kmeans.predict(X_gpu)

PCA для снижения размерности данных:

from cuml.decomposition import PCA
import cudf
import numpy as np

X = np.random.rand(10000, 20)

X_gpu = cudf.DataFrame(X)

pca = PCA(n_components=3)
X_transformed = pca.fit_transform(X_gpu)

Случайный лес:

from cuml.ensemble import RandomForestClassifier
import cudf
import numpy as np

X = np.random.rand(10000, 10)
y = np.random.randint(0, 2, 10000)

X_gpu = cudf.DataFrame(X)
y_gpu = cudf.Series(y)

rf = RandomForestClassifier(n_estimators=50, max_depth=16)
rf.fit(X_gpu, y_gpu)

predictions = rf.predict(X_gpu)

Как вы заметили, для работы с cuML необходимо преобразовать данные в форматы, поддерживаемые RAPIDS, такие как cuDF DataFrame или Series.

Параметры моделей в cuML могут отличаться от их аналогов в Scikit-learn.

Библиотека cuGraph

cuGraph позволяет создавать как направленные, так и ненаправленные графы из различных источников данных, включая edge lists и adjacency matrices.

В либе существуют реализации многих стандартных алгоритмов для анализа графов, включая поиск кратчайших путей, вычисление центральности вершин, определение сообществ и многое другое.

Создание графа из списка ребер:

import cudf
import cugraph

# создание DataFrame в cuDF для списка ребер
df = cudf.DataFrame()
df['src'] = [0, 1, 2, 0]
df['dst'] = [1, 2, 3, 3]

# создание объекта графа в cuGraph
G = cugraph.Graph()
G.from_cudf_edgelist(df, source='src', destination='dst')

Вычисление PageRank:

# вычисление PageRank
pagerank_values = cugraph.pagerank(G)

Поиск кратчайших путей:

# вычисление кратчайших путей от вершины 0
shortest_paths = cugraph.sssp(G, source=0)

Обнаружение сообществ с использованием алгоритма Louvain:

# обнаружение сообществ
partitions, modularity_score = cugraph.louvain(G)

Про другие практические инструменты из области ML, Data Science, аналитики и не только эксперты OTUS рассказывают в рамках практических онлайн-курсов. По ссылке вы можете ознакомиться с полным каталогом курсов.

© Habrahabr.ru