К старту флагманского курса по Data Science делимся туториалом по библиотеке Terality, которая сильно облегчит работу с действительно большими наборами данных даже на маломощных машинах. За подробностями приглашаем под кат.
Мы избалованы выбором в работе с данными. Инструмент номер один — Pandas, затем идут Dask, Vaex, Datatable, cuDF и так далее. К этому списку добавим Terality, как будто всего этого недостаточно.
Возникает вопрос: Terality компенсирует скорость Pandas ценой её простоты и гибкости? Нет. Terality — это злой кузен Pandas, рождённый с суперсилой. У него похожий синтаксис, но работает он молниеносно и не зависит от мощности вашей машины. Звучит слишком хорошо, чтобы быть правдой? Тогда читайте. Эта статья не оплачена и отражает мой собственный взгляд.
Что же такое Terality, и как он работает?
Terality — это бессерверный движок обработки данных, выполняемый на гигантских кластерах. Вы сможете работать с наборами данных аномальных размеров с молниеносной скоростью, не беспокоясь о масштабировании ресурсов на кластерах или какой-то инфраструктуре. Я говорю о двух вещах:
Ограничений по памяти, а значит, и по размеру набора данных, практически нет.
Чтобы обрабатывать гигабайты данных даже на машине c 4 Гб оперативной памяти, нужно только хорошее соединение с интернетом.
Terality — это пакет с тем же синтаксисом, что и Pandas. Чтобы переключиться на Terality, нужно изменить всего одну строку кода.
Пакет отправляет запрос движку Terality, где вы можете вызвать функции Pandas. Он обрабатывает данные и команды, отправляя результат вам. Установка займёт около минуты. Будет нужно установить пакет и ввести ваш ключ к API движка. Сделать это можно по ссылке.
Подготовка набора данных
Pandas появилась в январе 2008 года, когда заботой специалистов по науке о данных были игрушечные наборы данных. Сегодня люди работают с монстрами и обнаруживают, что у Pandas не хватает духу, чтобы приручить их. Компания Terality готова решить эту проблему.
Чтобы проиллюстрировать это, возьмём выборку из набора данных в 60 миллионов строк и 18 столбцов.
import pandas as pd
df = pd.read_csv("data/train.csv")
large_df = df.sample(6 * 10 ** 7, replace=True) # 60 million rows
large_df.to_parquet(
"data/tps_may_large.parquet", row_group_size=len(df) // 15, engine="pyarrow"
)
Данные сохраним в Parquet, потому что записывать их в CSV было бы оптимистично до глупости. Файл займёт около 7 Гб, что по современным стандартам довольно мало:
from pathlib import Path
size = Path("data/tps_may_large.parquet").stat().st_size
size_in_gb = size / 1024 ** 3
>>> round(size_in_gb, 2)
7.1
Terality против Pandas — загрузка данных
Начнём со сравнения скорости загрузки файла Parquet в рабочее пространство. Производительность Pandas сильно зависит от центрального процессора вашей машины. Моя AMD Ryzen 9 3900X с 12 ядрами — один из последних процессоров, она быстрее Google Colab или бесплатных процессоров Kaggle. Так что можно ожидать от моей машины достойного отпора виртуальным серверам.
Начнём со сравнения скорости загрузки файла Pandas в рабочее пространство:
import pandas as pd
%%time
df = pd.read_parquet("data/tps_may_large.parquet")
Что касается Terality, я читаю данные с Amazon S3:
import terality as te
%%time
df_te = te.read_parquet("s3://sample-bucket-for-medium/tps_may_large.parquet")
Даже если вы можете работать с локальными файлами, Terality лучше работает с Amazon S3 или Google Cloud. Как я уже упоминал, скорость Terality зависит от скорости вашего интернета. Чтение файла Parquet из памяти означает отправку 7 Гб данных в движок, что далеко от идеала. И вот мои результаты:
Terality немного позади из-за скорости интернета и мощности моего процессора. Продолжая сравнение, выполним другие тяжёлые операции.
Общие операции Pandas
До того как показать мои локальные результаты, давайте посмотрим на известный бенчмарк с набором данных в 50 Гб. Вот результат сложной операции группировки:
Держаться удаётся только Terality, в то время как другие разрываются от неприятных ошибок памяти. То же самое верно для оператора объединения:
Конечно, не все обладают роскошными компьютерами со 128 Гб памяти, поэтому я просто покажу эксперименты на моей скромной машине в 32 Гб:
Группировка
%%time
df.groupby("cat2").mean()
Сортировка
%%time
df.sort_values(by="cont5", ascending=False)
Новый столбец
%%time
df["new"] = df["cont0"].apply(lambda x: np.sqrt(np.exp(x)))
df["new"].sample(5)
145053 1.40283
286303 1.27540
103920 1.16384
85100 1.29126
216857 1.17710
Name: new, dtype: float64
Замена
%%time
df.replace(["A", "B", "C"], ["AA", "BB", "CC"], inplace=True)
Как я уже сказал, у меня достаточно хорошая машина, но она всё равно проигрывает во всех операциях.
Ловушки и стоимость
Хотя синтаксис Terality идентичен синтаксису Pandas, некоторые функции Pandas ещё не реализованы.
Вы можете ожидать около 80–90% всех методов фреймов данных и рядов, они будут работать с фреймами данных Terality. Большинство функций глобального пространства имён Pandas вида pd.some_function
тоже работают. Учтите, что Terality всё ещё в бете, а это немалый подвиг. Возможно, вы уже догадались, что Terality — условно бесплатная программа. Бесплатный тарифный план включает 200 Гб.
Сегодняшние наборы данных занимают до 68 Гб памяти [подсчёт с выполнением глубокой интроспеции], смотрите df.info(memory_usage='deep')
, так что свой бесплатный тарифный план я израсходовал достаточно быстро.
Однако команда Terality была достаточно заботлива, чтобы обновить мой план, позволив закончить эксперименты для этой статьи. Когда я написал эту статью, Terality обновил свои тарифные планы, как показано на скриншоте.
Заключение
Да, Terality великолепен — никакой другой инструмент не приблизился настолько к сходству с Pandas. Этот движок без ограничений по памяти просто совершенен. Но Terality — не игрушка для досуга.
Тарифный план в 200 Гб не такой щедрый, как вы думаете, потому что считается каждый вызов интерфейса программирования приложений, а не просто чтение данных. Вот моя статистика за время, пока я писал эту статью:
Прежде всего я предлагаю узнать, как выжать лучшее из самого Pandas и сделать его как можно более быстрым. Только когда вы начнёте получать ошибки памяти и обнаружите себя ожидающим даже простейших вычислений, настанет момент поиска альтернатив. И тогда Terality окажется в топе как самый быстрый и простой инструмент, у которого практически нет кривой обучения. А продолжить погружение в Data Science и Python вы сможете на наших курсах:
Узнайте подробности здесь.
Профессии и курсы
Data Science и Machine Learning
Python, веб-разработка
Мобильная разработка
Java и C#
От основ — в глубину
А также
Комментарии (4)
dolfinus
24.01.2022 02:02+2давайте посмотрим на известный бенчмарк с набором данных в 50 Гб.
Потеряли ссылку на сам бенчмарк из оригинальной статьи: https://h2oai.github.io/db-benchmark/. Там хоть объясняется, что и как бенчмаркали.
Ну и в целом сравнение, где у всех остальных реализаций поголовно "out of memory", выглядит очень странно. Стоило бы сравнить на меньших объемах датасетов, чтобы хоть какие-то цифры были. Ну и "not implemented" у Spark выглядит смешно, уж groupBy и join там конечно есть.
wibotwi
24.01.2022 04:59+6Очень странная статья, выглядит как реклама без внятного объяснения.
Я так и не понял, она автоматом мои данные отправляет чужому дяде, там обрабатывает и присылает обратно результат? Но это же не секьюрно. Или там можно мой кластер указать? Но тогда чем отличается от Dask?
mithdradates
Статья написана так, будто Terality - это тот же Dask, который запустили на кластере и написали небольшую обертку чтобы обмениваться с ним данными. Это действительно и есть вся новизна Terality? Такое ощущение возникает от того, что практически ничего не сказано про устройство самого Terality (если я не прав и что-то проморгал, то поправьте), а только про то, что он шлёт данные на кластер и там считает. Если так, то вся его полезность будет зависеть от того как эта квота высчитывается - если любая операция с данными будет идти в счёт квоты (условно сделали groupby на 50 гб датасете и у нас от квоты отняло около того же - а судя по статьи так и есть), то ещё непонятно дешевле ли окажется Terality чем аренда кластера в том же GC.
Или всё же есть какие-то принципиальные различия в устройстве и Terality, например, эффективнее того же Dask? В таком случае, зачем эта обвязка в виде облачных вычислений - почему бы не сделать это доп. опцией?