Эффективное масштабирование GPU-читалки Parquet Polars

Эффективное масштабирование Parquet Reader на GPU с использованием Polars

10 апреля 2025 года

Авторы: Прем Сагар Гали и Брендон Миллер

При работе с большими наборами данных производительность ваших инструментов обработки данных становится критически важной. Polars, библиотека с открытым исходным кодом для манипуляции данными, известная своей быстротой и эффективностью, предлагает GPU-ускоренный backend, основанный на cuDF, который может значительно повысить производительность. 

Тем не менее, для полного использования мощности GPU backend Polars важно оптимизировать процесс загрузки данных и эффективно управлять памятью, необходимой для рабочего процесса. С развитием GPU backend стали доступны дополнительные техники для поддержания высокой производительности по мере увеличения размера набора данных при использовании Parquet reader на GPU. Существующий Parquet reader на GPU в Polars (до версии 24.10) не масштабировался для больших размеров наборов данных.

В этом посте рассматривается, как обработка данных с помощью читателя Parquet с разбивкой на части, в сочетании с Унифицированной Виртуальной Памятью (UVM), может превзойти как обычные нерезервируемые читатели, так и подходы на основе CPU.

Проблемы с факторами масштабируемости и нерезервируемыми читателями

С увеличением фактора масштабируемости (SF) нерезервируемый GPU reader Polars (24.10) часто страдает. За пределами SF200 производительность значительно ухудшается. В некоторых случаях, таких как Запрос 9, нерезервируемый GPU reader выдает ошибку даже до достижения SF50. Это ограничение возникает из-за нехватки памяти при загрузке больших файлов Parquet в память GPU. Пропущенные данные в графике нерезервируемого Parquet reader подчеркивают ошибки переполнения памяти (OOM), возникающие при более высоких факторах масштабируемости.

График, на котором показано успешное выполнение запроса для всех факторов масштабируемости для версии 24.12, но отсутствие завершения с SF250 для версии 24.10 Parquet Reader для Запроса 13.
Рисунок 1. Надежность выполнения Запроса 13, сравнение Parquet Reader 24.10 и 24.12

Улучшение ввода-вывода и пиковая память с помощью чтения Parquet с разбивкой на части

Чтобы преодолеть эти ограничения памяти, становится необходимым использование читателя Parquet с разбивкой на части. Читая файл Parquet маленькими частями, уменьшается объем занимаемой памяти, что позволяет Polars GPU обрабатывать большие объемы данных. Использование читателя Parquet с разбивкой на части с лимитом чтения в 16 ГБ позволяет выполнять больше факторов масштабируемости по сравнению с нерезервируемым читателем для любого данного запроса. Для Запроса 9 разбиение на части с 16 ГБ или 32 ГБ необходимо для выполнения и достижения лучшей пропускной способности.

Результаты от изменения как размера набора данных, так и размера кусочков. Пропущенные точки от неограниченного и 32.0 ГБ размеров кусочков — это запуски, которые закончились нехваткой памяти. Размер кусочка 16.0 ГБ и меньше успешно выполнились для всех размеров наборов данных.
Рисунок 2. Сравнение пропускной способности в зависимости от размеров кусочков (лимит_pass_read_limit) для Запроса 9

Чтение еще больших наборов данных с помощью UVM

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

Для сравнения: чтение с разбивкой на части без UVM сталкивается с ошибкой OOM до достижения SF100. Чтение с разбивкой на части с UVM позволяет успешно выполнять запросы на более высоких факторах масштабируемости, но пропускная способность при этом снижается.

Рисунок 3 показывает явное преимущество. Значительно больше факторов масштабируемости успешно выполняются с читателем Parquet с разбивкой на части и включенным UVM по сравнению с нерезервируемым читателем Parquet.

График, показывающий сравнение Запроса 13 с разбивкой на части плюс UVM против CPU и нерезервируемого. Данные по пропускной способности нерезервируемого превышают все, но останавливаются на SF200. Пропускная способность UVM с разбивкой на части продолжает выполнять задачи с более высокой пропускной способностью, чем CPU, до SF400.
Рисунок 3. Сравнение пропускной способности с UVM и без UVM для Запроса 13 (чем выше, тем лучше)

Стабильность и пропускная способность

При выборе оптимального pass_read_limit важно учитывать баланс между стабильностью и пропускной способностью. Рисунки 1-3 предполагают, что 16 ГБ или 32 ГБ pass_read_limit является наилучшей комбинацией стабильности и пропускной способности.

  • 32 ГБ pass_read_limit: Все запросы были успешными, за исключением Запросов 9 и 19, которые завершились ошибками OOM
  • 16 ГБ pass_read_limit: Все запросы были успешными

GPU с разбиением на части против CPU

Когда наблюдаемая пропускная способность каждого запроса обычно остается выше, чем у CPU Polars, это позволяет завершить множество запросов, которые не завершаются без разбивки. Кажется разумным использование 16 ГБ или, возможно, 32 ГБ pass_read_limit. Установки в 16 ГБ или 32 ГБ pass_read_limit обеспечивают успешное выполнение при более высоких факторах масштабируемости по сравнению с нерезервируемым Parquet.

Заключение

Для Polars GPU читатель Parquet с разбивкой на части и UVM часто лучше, чем CPU Polars и нерезервируемый читатель Parquet, особенно при работе с большими наборами данных и высокими факторами масштабируемости. Оптимизировав процесс загрузки данных, вы можете раскрыть весь потенциал Polars GPU и достичь значительного роста производительности. В рамках последней версии cudf-polars (24.12 и выше) читатель Parquet с разбивкой на части и UVM являются стандартным подходом для чтения файла Parquet. Это привело к улучшениям, представленным выше для всех запросов и факторов масштабируемости. 

Чтобы начать работу, установите cuDF Polars.

Связанные ресурсы

Об авторах

Фото автора

О Преме Сагаре Гали
Прем Сагар Гали – старший инженер по системному программному обеспечению в NVIDIA, проживает в Остине, штат Техас, специализируется на разработке программного обеспечения для науки о данных для RAPIDS AI. У него степень магистра в области компьютерных наук из Технического университета Джорджии.Посмотреть все посты Према Сагара Гали

Фото автора

О Брендоне Миллере
Брендон Миллер – инженер-программист, который работает в NVIDIA около двух с половиной лет, в основном поддерживает библиотеку cuDF для Python. В последнее время его работа сосредоточена на компиляции Python-кода для выполнения на GPU, особенно в контексте пользовательских функций. Его образование связано с вычислительной физикой и высокопроизводительными вычислениями.Посмотреть все посты Брендона Миллера

Перейти к источнику
AI Daily

Ответить

Ваш адрес email не будет опубликован. Обязательные поля помечены *