Не тормози! Используй DASK!

Чем больше у нас данных, тем больше возможностей извлечь из них полезную в работе информацию. Однако сбор данных - это только часть задачи, первый этап. Необходимо решить и где их хранить, и как обработать.

Обычно для этого используются проверенные временем инструменты, например, Pandas и NumPy. Они эффективны и пользуются большим доверием.

По мере увеличения объёма данных мы начинаем сталкиваться с физическими ограничениями этих инструментов. Отчасти эта проблема решается увеличением объёма оперативной памяти. Но это не всегда возможно и только отодвигает проблему, не решая её принципиально. Также хотелось бы иметь возможность обрабатывать данные параллельно на нескольких компьютерах или используя несколько процессоров/ядер. Для решения задач можно было бы перейти к более масштабируемому решению, такому как Spark, но, зачастую, такая доработка требует много времени.

Разве не было бы замечательно, если бы вы могли сделать это в своей системе локально, а при необходимости и масштабировать до кластера? В этом может помочь Dask.

Что такое Dask?

Dask – это гибкая библиотека для масштабирования и распараллеливания вычислений на Python на одной машине или в кластере, которая полностью интегрируется с Jupyter notebook.

Dask предоставляет знакомые высокоуровневые интерфейсы для расширения экосистемы SciPy (NumPy, Pandas, Scikit-Learn) для случаев, когда объём данных превышает объём памяти и для распределённых окружений, а также интерфейсы более низкого уровня для распараллеливания пользовательских алгоритмов и рабочих процессов.

Первоначально он создавался именно для преодоления ограничений хранения на одной машине и расширения вычислительных возможностей Pandas, NumPy и Scikit-Learn, но позднее появилась возможность применение в качестве распределённой системы.

В Dask имеются массивы, эквивалентные массивам в NumPy, датафреймы как в Pandas, а аналогом Scikit-Learn является Dask-ML.

У Dask есть два основных достоинства:

1. Масштабируемость.

Dask масштабирует Pandas, Scikit-Learn и NumPy изначально с помощью python и устойчиво работает на кластерах с несколькими ядрами или может быть уменьшен до одной машины.

2. Планирование задач (Scheduling)

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

В Dask есть два семейства планировщиков задач:

· планировщик для одного компьютера - предоставляет базовые функции для локального процесса или пула потоков. Этот планировщик был создан первым и используется по умолчанию. Он прост в использовании, хотя его можно использовать только на одной машине);

· распределённый планировщик - более сложен, предлагает больше функций, но требует больше усилий для настройки. Может работать локально или распределено на кластере.

Dask также предоставляет оперативную и отзывчивую панель инструментов, которая показывает несколько показателей, таких как прогресс, использование памяти и т. д., которые обновляются каждые 100 мс.

Установка

Dask можно установить локально с помощью Conda / pip или клонировать из репозитория git.

conda install dask

conda install dask-core (Only installs core)

Dask-core - это установка mini dask, которая устанавливает только пакеты ядра. (Аналогично может быть установлен с помощью pip). Вы также можете установить только DataFrame Dask или массивы Dask, если вам нужно только масштабирование Pandas, NumPy с помощью Dask DataFrame и массивов Dask соответственно.

python -m pip install dask

python -m pip install "dask[dataframe]" # Install requirements for dask dataframe

python -m pip install "dask[array]" # Install requirements for dask array

Другие варианты запуска

Если вы ищете быстрый способ запустить Dask, попробуйте SaturnCloud, который предлагает бесплатный план.

Можно использовать notebook с Dask, а можно создать Dask cluster и подключаться к нему удалённо. В том числе можно использовать совместно с Google Colab, см. статью Как подключиться к Saturn Cloud из Google Colab.

Dask DataFrame против Pandas DataFrame

Сразу нужно оговориться, что если для вашей задачи достаточно возможностей Pandas, то следует воздержаться от использования Dask. Имея это в виду, ниже представлен пример импорта CSV файла в Pandas и Dask с использованием Jupyter notebook:

Dask выполняет ленивые вычисления во многом так же, как Spark, что по сути означает, что он не выполняет задание до тех пор, пока не будет запрошено действие. Вычисления не производятся, пока не будет вызван метод compute (в данном случае).

Например, мне это потребовалось при анализе страховых продуктов.

Пример кода, загружающий все csv-файлы за 2021 год и вычисляющий средние значения по месяцам:

Другой вариант использования, когда датасет представляет собой набор *.csv файлов с данными за каждый месяц:

files = ['2020_01_data.csv', '2020_02_data.csv', '2020_03_data.csv', '2020_04_data.csv', ... ]

В списке months перечислены месяцы months = [1, 2, 3,....].

В данном случае файлы будут загружаться в многопоточном режиме после вызова dask.compute, каждый файл будет загружаться только один раз.

Dask ML

Эквивалент Scikit-Learn в Dask - это Dask-ML. Вот как мы можем использовать XGBoost Regressor (популярный алгоритм градиентного бустинга для регресии) в Dask:

from dask_ml.xgboost import XGBRegressor model = XGBRegressor(...) model.fit(train, train_labels)

Dask Vs Spark

Чем Dask отличается от Spark и какой из этих инструментов предпочтительнее? Пожалуй, нет чёткого правила, которое бы определяло, что следует использовать Dask или Spark. Но выбор можно сделать на основе предлагаемых ими функций и того, что больше соответствует требованиям вашей задачи и доступных ресурсов.

Некоторое, не претендующее на полноту, сравнение приведено в таблице:

Вывод

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

Дополнительные ресурсы:

● Шпаргалка по Dask (ссылка)

● Обзор Dask в 16 минутном видео (ссылка)

● Более подробный обзор Dask (40 минут) (ссылка)

● Почти четырехчасовое видео Parallel and Distributed Computing in Python with Dask | SciPy 2020 (ссылка)

● Это руководство было представлено на конференции SciPy 2020 (ссылка)

● Еще один туториал (ссылка)

● Learn from BigData Files on Low Memory (ссылка)

0
2 комментария
Дмитрий Момотов

Полезно!

Ответить
Развернуть ветку
Роман Клевцов

Нужно попробовать

Ответить
Развернуть ветку
Читать все 2 комментария
null