Кратко про экосистему RAPIDS для работы с данными на GPU
Привет, Хабр!
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 рассказывают в рамках практических онлайн-курсов. По ссылке вы можете ознакомиться с полным каталогом курсов.