Поиск по сайту Поиск

Как ускорить Data Science с помощью GPU

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

За последние несколько лет библиотеки Python, предназначенные для Data Science, довольно хорошо научились использовать возможности CPU. Например, Pandas отлично справляется с обработкой наборов данных, размер которых превышает 100 ГБ. А если у вашей машины недостаточно ОЗУ, вы всегда можете использовать удобные функции, разбивающие данные на небольшие пакеты и обрабатывающие по одному фрагменту за раз.

GPU vs CPU: параллельная обработка

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

Иллюстрация того, как многоядерная система обрабатывает данные. Для одноядерной системы (слева) все 10 задач отправляются на одно ядро. Для двухъядерной системы (справа) каждое ядро выполняет 5 задач, что удваивает скорость обработки.

Большое влияние GPU оказывают на Deep Learning. Повторяющиеся вычисления, например, свёртку, можно ускорить с их помощью до 100 раз.

В Data Science тоже присутствуют многократно выполняемые операции, которые обрабатывают большие наборы данных с помощью таких библиотек как Pandas, Numpy и Scikit-Learn. На GPU выполнять эти операции достаточно просто.

Ускорение GPU с Rapids

Rapids — набор программных библиотек, предназначенных для ускорения Data Science за счет использования графических процессоров. Он генерирует низкоуровневый код CUDA для быстрого выполнения алгоритмов, оптимизированных на GPU, и в то же время имеет простую реализацию на Python.

Преимущество Rapids в том, что он хорошо интегрируется в библиотеки Data Science. Например, Pandas dataframe можно легко передать в Rapids и ускорить обработку на GPU. На рисунке ниже показано, как Rapids делает доступным низкоуровневое ускорение, сохраняя при этом высокоуровневую реализацию.

Rapids использует несколько Python-библиотек:

cuDF: dataframes для GPU. Поддерживает практически те же способы обработки данных, что и Pandas.

CuML: библиотека для машинного обучения. Содержит множество алгоритмов ML, которые есть в Scikit-Learn.

cuGraph: обработка графов на GPU. Поддерживает много основных алгоритмов анализа графов, включая PageRank.

Гайд по использованию Rapids

Установка

Теперь вы увидите Rapids в действии!

В качестве примера мы запустим простой код на сервере с GPU NVIDIA Tesla V100.

1. Войдите в личный кабинет на сайте REG.RU и выберите услугу Облачные серверы. В открывшемся окне кликните на Добавить GPU. Выберите образ с Ubuntu 18.04 и тариф.

Для демонстрации мы решили запустить код на двух GPU NVIDIA Tesla V100 и сравнить время выполнения с Nvidia Data Science Work Station, которая работает на двух GPU NVIDIA Quadro RTX 8000. Поэтому выбираем тариф GPU-7.

2. Зайдите на сервер, используя соединение по SSH с параметром -L и туннелированием. Это позволит в дальнейшем подключиться к JupyterLab через браузер на вашем компьютере:

Где 123.123.123.123 — IP сервера.

3. После успешного подключения выполните команды ниже, чтобы загрузить и запустить образ с Rapids и всем необходимым ПО. В этом примере мы выбрали конфигурацию с Ubuntu 18.04, CUDA 10.0 и Python 3.7. Вы можете поменять версии и скопировать команды для установки на сайте Rapids.

4. Зайдите в директорию utils и запустите JupyterLab:

5. Теперь в адресной строке браузера введите localhost:8000/lab?. Должно открыться окно JupyterLab.

Настройка данных

В этом примере мы рассмотрим модифицированную версию DBSCAN demo. DBSCAN - это алгоритм кластеризации, который может автоматически разбивать данные на группы без указания числа кластеров. Похожая реализация есть в Scikit-Learn.

Начнём с импортирования необходимых библиотек:

Функция make_circles создаст сложное распределение данных, напоминающее две окружности.

Зададим набор данных из 100 000 точек и отобразим его в виде графика:

DBSCAN на CPU

Запустить DBSCAN на CPU можно с помощью Scikit-Learn. Импортируем его и настроим некоторые аргументы:

Теперь можем применить DBSCAN к нашим круговым данным. Параметр %%time перед функцией позволит Jupyter Notebook измерить время ее выполнения:

Для 100 000 точек время выполнения на CPU составило 10.3 секунды. Получившиеся кластеры выглядят так:

DBSCAN с Rapids на GPU

А теперь пришло время ускориться! 

Конвертируем наши данные в pandas.DataFrame и используем их для создания cudf.DataFrame. Это делается всего двумя командами:

Затем импортируем и инициализируем версию DBSCAN из cuML для ускорения на GPU. Формат и параметры функции cuML-версии DBSCAN такие же, как и в Scikit-Learn.

Наконец, запустим функцию прогнозирования для DBSCAN GPU и измерим время выполнения.

Время выполнения на двух NVIDIA Tesla V100 снизилось до 814 миллисекунд! По сравнению с CPU ускорение получается 12-кратным, но чаще всего код таких программ не оптимизирован для выполнения на CPU. Поэтому сравним производительность с двумя GPU NVIDIA Quadro RTX 8000: они показывают результат в 4.22 секунды. Процессоры Tesla V100 по сравнению с Quadro RTX 8000 достигли ускорения в 5 раз.

Результаты 2x NVIDIA Tesla V100

Суперускорение с Rapids!

Степень ускорения, которую мы получаем с Rapids, зависит от количества обрабатываемых данных. Однако существует дополнительная задержка, связанная с передачей данных между CPU и GPU. Она становится менее существенной, когда мы обрабатываем большие датасеты. 

Разберёмся на простом примере.

Создадим массив случайных чисел Numpy и применим к нему DBSCAN. При этом сравним скорость выполнения, увеличивая и уменьшая количество точек данных. Так мы увидим, как объем данных влияет на степень ускорения.

Пример кода для набора данных размером 10000х100 точек:

В примере датасет состоит из миллиона точек. На рисунке вы можете увидеть, что его обработка на GPU Tesla выполняется за 142 миллисекунды, а на CPU — 18.3 секунды. Quadro RTX справляется с той же задачей примерно за 1.5 секунды (оценка сделана по графику из статьи с помощью сравнения скоростей CPU), то есть Tesla оказалась быстрее неё почти в 11 раз.

Таким образом, с увеличением размера данных до определённой степени растёт и ускорение, получаемое с GPU.

⌘⌘⌘

Теперь вы знаете, какую высокую скорость обработки данных можно получить с мощными GPU. Для дальнейшего погружения в Data Science рекомендуем ознакомиться с книгой Python для сложных задач: наука о данных и машинное обучение (перевод книги Python Data Science Handbook). 

С оригинальной статьёй и результатами работы программ на GPU NVIDIA Quadro RTX 8000 можно ознакомиться на сайте towardsdatascience.com.

Три слова, которые поймут только айтишники

Три слова, которые поймут только айтишники

Если вы не разработчик, но работаете в IT-компании, или в вашем окружении есть программисты, то, скорее всего, часто слышите странные...
Read More
Customer development: почему при выборе идеи нужно учитывать мнение клиентов

Customer development: почему при выборе идеи нужно учитывать мнение клиентов

Вместе с менеджером по продуктам REG.RU Никитой Атучиным разбираем, почему MVP — не всегда хорошее решение для старта бизнеса. Если вы...
Read More
Как выбрать и создать первый ИИ-проект

Как выбрать и создать первый ИИ-проект

Искусственный интеллект постепенно меняет самые разные отрасли промышленности, как это происходило с электричеством 100 лет назад. Он помогает руководителям фирм...
Read More
Улучшаем изображение с плохим освещением с помощью нейросети

Улучшаем изображение с плохим освещением с помощью нейросети

Что такое фотография с точки зрения физики? Это отпечаток, возникающий на светочувствительной матрице при отражении от объекта источника света: солнца,...
Read More
Как ускорить Data Science с помощью GPU

Как ускорить Data Science с помощью GPU

Аналитикам данных нужны вычислительные мощности. Обрабатываете ли вы большой датасет в Pandas или перемножаете множество матриц с Numpy — вам...
Read More
Стэнфордский курс: лекция 5. Свёрточные нейронные сети

Стэнфордский курс: лекция 5. Свёрточные нейронные сети

На прошлой лекции мы узнали, как метод обратного распространения ошибки помогает находить градиент для сложных функций, а также провели параллели...
Read More
Джон Макафи: создатель антивируса McAfee и один из самых неоднозначных IT-предпринимателей XX века

Джон Макафи: создатель антивируса McAfee и один из самых неоднозначных IT-предпринимателей XX века

В 1987 году Джон Макафи запустил программу, названную в честь себя, — McAfee Virus Scan. ПО быстро стало лидирующим решением для...
Read More
Интерпретация строения мозга с помощью рекуррентных нейронных сетей

Интерпретация строения мозга с помощью рекуррентных нейронных сетей

Коннектомика — область науки, изучающая работу мозга с помощью анализа и построения карты нейронных связей. Она помогает лучше понять сложную...
Read More
Учим нейросети рассуждать о том, что они видят

Учим нейросети рассуждать о том, что они видят

Ребёнок, который никогда не видел розового слона, всё равно может его описать, в отличие от компьютера. Способность обобщать информацию и...
Read More
Всем игрокам приготовиться: обзор доменов в играх

Всем игрокам приготовиться: обзор доменов в играх

Компьютерные игры становятся всё более похожими на реальную жизнь. За последние годы в них значительно улучшилась графика, искусственный интеллект неигровых...
Read More