NVIDIA Developer сообщает, что корпоративные приложения становятся все более требовательными. Агентный ИИ увеличил потребность в огромных объемах корпоративных данных с частыми и сложными запросами по все более крупным наборам данных. Для удовлетворения этого спроса требуется большая пропускная способность данных без пропорционального увеличения затрат. NVIDIA cuDF решает эту задачу, используя массовую параллельность и высокоскоростную память графических процессоров (GPU) для аналитики данных. В частности, плагин NVIDIA cuDF для Apache Spark приносит это ускорение в Apache Spark, ведущую платформу для обработки и аналитики больших данных, обеспечивая лучшую производительность по общим затратам в крупных рабочих нагрузках. Пользовательские функции (UDF) долгое время были проблематичными для ускоренных движков запросов, вводя накладные расходы во время выполнения из-за их непрозрачной природы. Хотя UDF часто можно заменить более производительным кодом, переписывание UDF долгое время было трудоемким процессом, требующим тщательной проверки. В этой статье описывается, как использовать агентов для переписывания UDF в эквиваленты, ускоренные с помощью GPU, за считанные минуты, достигая ускорений более чем в 22 раза в заданиях Apache Spark. Мы представим навыки cuDF для Apache Spark, набор навыков для быстрого преодоления узких мест UDF для полного цикла разработки, от тестирования до бенчмаркинга и интеграции. Проблема UDF заключается в том, что cuDF достигает бесшовного ускорения GPU отчасти благодаря декларативному интерфейсу программирования Apache Spark. Абстракции SQL / Dataframe мощны, потому что они отделяют то, что должен произвести запрос, от того, как система должна его выполнять. Это позволяет плагину cuDF прозрачно параллелизовать операции построчно, используя огромные возможности SIMD графических процессоров, без каких-либо изменений в коде пользователя. Однако Apache Spark также поддерживает UDF: пользовательские процедуры для расширения встроенной функциональности. Хотя они полезны для реализации индивидуальной бизнес-логики, UDF нарушают декларативную абстракцию — они содержат произвольный пользовательский код, который система не может обрабатывать или параллелизировать в общем смысле. Во время выполнения ускоритель GPU должен преобразовать данные из колонного в построчный формат и возвращаться к ЦП для выполнения UDF построчно. Таким образом, в ускоренном запросе UDF имеет следующие недостатки: UDF накладывает накладные расходы на передачу данных из-за возврата к ЦП, а также упускает потенциальное ускорение вычислений, если бы она была написана с использованием ускоренных примитивов GPU. Ускорение UDF с помощью небольшого, целенаправленного изменения кода позволяет многим UDF быть переписанными в форму, которую можно ускорить с помощью GPU, используя правильные примитивы. Переписывание UDF устраняет накладные расходы, связанные с возвратом к ускорителю, и может дать ускорение более чем в 20 раз. Мы описываем три подхода к переписыванию UDF: подход SQL с низкой сложностью, который лучше всего подходит для простой реляционной логики; подход cuDF со средней сложностью, предоставляющий больше гибкости и контроля за выполнением; и подход CUDA с высокой сложностью, обеспечивающий максимальную гибкость и контроль на уровне ядра для наиболее сложной или критически важной логики. Чтобы сделать эти подходы конкретными, рассмотрим простой UDF на Scala, который преобразует температуру из Цельсия в Фаренгейт. Переписывание UDF с использованием SQL является самым прямым решением для простых UDF. Это делает функцию видимой в дереве выражений Spark. Во время планирования запроса плагин cuDF заменит эти выражения на соответствующие реализации для GPU, сохраняя данные и выполнение полностью на GPU. Когда примитивов SQL недостаточно или они нежелательны, UDF может работать непосредственно с колоннами GPU, используя интерфейс RapidsUDF, контракт, предоставленный плагином cuDF. Этот контракт требует одного метода, evaluateColumnar. Плагин cuDF распознает экземпляры интерфейса RapidsUDF и передает GPU-резидентный ColumnVector в функцию evaluateColumnar. Функция затем компилирует операции из Java API для операций cuDF для обработки колонки параллельно. Этот подход предоставляет более богатый API для более сложной обработки. Для высоко сложной логики, которую нельзя эффективно составить из существующих операций cuDF, RapidsUDF может вызывать пользовательское ядро CUDA через Java Native Interface (JNI). Несмотря на преимущества производительности, переписывание UDF может потребовать значительных усилий со стороны инженеров. Оно требует тщательного выбора API, семантической проверки и измерения производительности, в то время как колонные API могут быть незнакомы практикам с меньшим опытом в векторизованном программировании. К счастью, большая часть этой работы хорошо подходит для кодирующих агентов. С правильными ограничениями агент может искать незнакомые API, реализовывать кандидатные переписывания и быстро итеративно работать, в то время как исполняемые тесты и измерения производительности определяют, является ли каждое изменение приемлемым. Навыки cuDF для Apache Spark разбивают переписывание на четыре сфокусированных цикла обратной связи. Каждый навык определяет как работу, которую необходимо выполнить, так и доказательства, необходимые перед переходом к следующему этапу. Надежное выполнение агента начинается с надежной среды разработки. Навыки предоставляют полный шаблон проекта, содержащий необходимую для разработки от начала до конца конструкцию, специфичную для cuDF и Spark. Это включает в себя тестовые и бенчмаркинговые конструкции, закодированные процедуры для проверки выходных данных и конфигурацию сборки. Кодируя эти знания в код, агент может сосредоточиться на UDF, а не многократно восстанавливать специализированную инфраструктуру. Навыки также предоставляют лучшие практики для программирования на GPU с cuDF, включая управление памятью и конфигурацию. Основной потребительский технологический компания использовала этот рабочий процесс для преобразования более 30 UDF, используемых в производственных потоках данных, в реализации, ускоренные с помощью GPU. Переписывания сохранили поведение оригинальных UDF на ЦП, устраняя дорогостоящие возвраты от ускоренных рабочих нагрузок. В качестве примера, следующий бенчмарк показывает производительность до и после переписывания UDF в одной из таких рабочих нагрузок: время выполнения оператора было сокращено с 274,55 до 12,78 часов, что составляет 22-кратное ускорение для рабочей нагрузки с 600 миллиардами строк. Этот конкретный UDF влиял на более чем 3000 заданий и в этом задании показал 22-кратное ускорение при реализации как RapidsUDF, поддерживаемого cuDF. С помощью агентов эти достижения в производительности становятся гораздо более достижимыми, позволяя практикам итеративно переписывать в пределах часов, а не дней или недель, не жертвуя корректностью. Преобразование UDF в реализации на GPU может разблокировать значительные ускорения и способствовать общему снижению затрат в ускоренных потоках данных на GPU. С помощью навыков агентов процесс переписывания может быть сделан простым и надежным. Чтобы начать, установите навыки cuDF для Apache Spark на GitHub, либо напрямую, либо с использованием установщика навыков npx: npx skills add NVIDIA/cudf-spark --skill ‘*’. Для более глубокого изучения рабочего процесса и практических уроков из его создания смотрите сессию Data + AI Summit, «Кодирование с AI-агентами для суперзарядки ваших UDF Spark с ускорением GPU». Чтобы узнать больше об ускорении GPU для Apache Spark, следуйте руководству по началу работы с плагином cuDF для Apache Spark, чтобы разблокировать лучшую производительность и общие затраты в ваших потоках Spark. Посетите нашу веб-страницу, чтобы узнать больше о NVIDIA cuDF: обработка структурированных данных с ускорением GPU, или вы можете прочитать документацию для получения дополнительной информации о плагине NVIDIA cuDF для Apache Spark. Материал подготовлен нейросетью на основе оригинальной публикации. ИИ может ошибаться в деталях (цифры, имена, даты, цитаты) — для важной информации сверяйтесь с первоисточником.