Terality — автоматически масштабируемая альтернатива Pandas +1


К старту флагманского курса по Data Science делимся туториалом по библиотеке Terality, которая сильно облегчит работу с действительно большими наборами данных даже на маломощных машинах. За подробностями приглашаем под кат.


Мы избалованы выбором в работе с данными. Инструмент номер один — Pandas, затем идут Dask, Vaex, Datatable, cuDF и так далее. К этому списку добавим Terality, как будто всего этого недостаточно. 

Возникает вопрос: Terality компенсирует скорость Pandas ценой её простоты и гибкости? Нет. Terality — это злой кузен Pandas, рождённый с суперсилой. У него похожий синтаксис, но работает он молниеносно и не зависит от мощности вашей машины. Звучит слишком хорошо, чтобы быть правдой? Тогда читайте. Эта статья не оплачена и отражает мой собственный взгляд. 

Что же такое Terality, и как он работает? 

Terality — это бессерверный движок обработки данных, выполняемый на гигантских кластерах. Вы сможете работать с наборами данных аномальных размеров с молниеносной скоростью, не беспокоясь о масштабировании ресурсов на кластерах или какой-то инфраструктуре. Я говорю о двух вещах:

  1. Ограничений по памяти, а значит, и по размеру набора данных, практически нет. 

  2. Чтобы обрабатывать гигабайты данных даже на машине 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 вы сможете на наших курсах:

Узнайте подробности здесь.

Профессии и курсы




К сожалению, не доступен сервер mySQL