Forwarded from Душный NLP
QwenLong-L1 и проблемы рассуждающих моделей на длинных контекстах
Сегодня — статья от инженеров из Alibaba Group, которые сделали свою версию Qwen для ризонинга на длинных контекстах. Как сообщают авторы, их разработка сопоставима по качеству с o3, хотя имеет всего 32 миллиарда параметров.
Авторы отмечают, что при обучении модели рассуждения на длинных контекстах могут наблюдаться спады качества на ревордах. Кроме того, при RL возникает недостаточная вариативность примеров для генерации, а KL-лосс получается очень шумным.
Для обучения QwenLong делают интервенции на SFT и RL-стадии. В первом случае заявляется обучение на домене единых контекстов — том же самом, что и RL. На самой RL-стадии применяются RPO и DAPO. Инженеры используют progressive scaling, то есть увеличивают длину контекста по мере обучения. Применяют комбинированный реворд: LLM-as-a-Judge и Rule-Based.
Используется также ретроспективный сэмплинг — примеры с низким скором с предыдущих стадий повторяются на следующих. По словам авторов статьи, это хорошо сказывается на обучении.
При замерах выделили три типа поведения ризонинг-моделей в работе с длинными контекстами:
— Grounding. Модель обращается к релевантной информации в длинном контексте, чтобы поддержать рассуждение: «Позвольте сперва ознакомиться с представленным текстом…»
— Subgoal Setting. Модель разбивает комплексный вопрос на несколько более мелких, чтобы решать задачу шаг за шагом: «Чтобы разобраться, нам сперва надо…»
— Backtracking. Модель обнаруживает ошибки в генерациях и возвращается к ним, чтобы решать их итеративно: «Такой подход не сработает, потому что…»
— Verification. Модель систематически валидирует предсказанные ответы, чтобы убедиться в их корректности: «Давайте подтвердим результат, путём…»
Интересно, что на SFT модель чаще демонстрирует разные типы поведения. Однако это не приводит к росту качества ответов. Это значит, что модели недостаточно просто иметь предпосылки к тому или иному образу действия — нужно ещё и тренировать его на RL.
Разбор подготовил❣ Александр Кайгородов
Душный NLP
Сегодня — статья от инженеров из Alibaba Group, которые сделали свою версию Qwen для ризонинга на длинных контекстах. Как сообщают авторы, их разработка сопоставима по качеству с o3, хотя имеет всего 32 миллиарда параметров.
Авторы отмечают, что при обучении модели рассуждения на длинных контекстах могут наблюдаться спады качества на ревордах. Кроме того, при RL возникает недостаточная вариативность примеров для генерации, а KL-лосс получается очень шумным.
Для обучения QwenLong делают интервенции на SFT и RL-стадии. В первом случае заявляется обучение на домене единых контекстов — том же самом, что и RL. На самой RL-стадии применяются RPO и DAPO. Инженеры используют progressive scaling, то есть увеличивают длину контекста по мере обучения. Применяют комбинированный реворд: LLM-as-a-Judge и Rule-Based.
Используется также ретроспективный сэмплинг — примеры с низким скором с предыдущих стадий повторяются на следующих. По словам авторов статьи, это хорошо сказывается на обучении.
При замерах выделили три типа поведения ризонинг-моделей в работе с длинными контекстами:
— Grounding. Модель обращается к релевантной информации в длинном контексте, чтобы поддержать рассуждение: «Позвольте сперва ознакомиться с представленным текстом…»
— Subgoal Setting. Модель разбивает комплексный вопрос на несколько более мелких, чтобы решать задачу шаг за шагом: «Чтобы разобраться, нам сперва надо…»
— Backtracking. Модель обнаруживает ошибки в генерациях и возвращается к ним, чтобы решать их итеративно: «Такой подход не сработает, потому что…»
— Verification. Модель систематически валидирует предсказанные ответы, чтобы убедиться в их корректности: «Давайте подтвердим результат, путём…»
Интересно, что на SFT модель чаще демонстрирует разные типы поведения. Однако это не приводит к росту качества ответов. Это значит, что модели недостаточно просто иметь предпосылки к тому или иному образу действия — нужно ещё и тренировать его на RL.
Разбор подготовил
Душный NLP
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from gonzo-обзоры ML статей
Неужели мы наблюдаем возрождение эволюционных стратегий как альтернативы RL? Я помню ту работу 2017 года от OpenAI и Суцкевера в частности "Evolution Strategies as a Scalable Alternative to Reinforcement Learning" (https://arxiv.org/abs/1703.03864), где впервые ES показали себя достойной альтернативой RL. Я сам писал про это в начале 2017 года (https://moocaholic.medium.com/2017-the-year-of-neuroevolution-30e59ae8fe18). Но в мир LLM эти подходы так и не пришли, возможно потому что на миллиардах параметров оно сходу не работало. Свежая работа "Evolution Strategies at Scale: LLM Fine-Tuning Beyond Reinforcement Learning" (https://arxiv.org/abs/2509.24372) устраняет этот пробел. Реализация настолько простая, что непонятно, почему это сделали только в 2025-м...
https://t.me/gonzo_ML_podcasts/936
https://t.me/gonzo_ML_podcasts/936
arXiv.org
Evolution Strategies as a Scalable Alternative to Reinforcement Learning
We explore the use of Evolution Strategies (ES), a class of black box optimization algorithms, as an alternative to popular MDP-based RL techniques such as Q-learning and Policy Gradients....
Forwarded from Quant Valerian
Прочитал книгу Эффективный конфликт
По рекомендации моего товарища Андрея прочёл книгу. Многого не ждал — у меня и эмоциональный интеллект достаточно высокий, и с конфликтами я справляюсь как-то естественно хорошо, и кое-чему успел поучиться в жизни.
Но книга оказалась просто пушкой! Какие-то приёмы я знал, но всё равно извлёк тонну пользы из книги, и вообще я в восторге!
Во-первых, хорошая, стройная теория, прям настоящий фреймворк для разрешения конфликтов. Во-вторых, там есть упражнения! А на сайте их есть ещё, и это супер полезно! В-третьих, многие тезисы сопровождаются ссылками на исследования или на consensus.ai, которым я тоже регулярно грешу пользоваться.
О чем книга?
О межличностных конфликтах. Именно про случаи, когда конфликт между вами и кем-то ещё. Под конфликтом в книге понимается только негативное значение: когда кто-то пытается изменить ваш социальный статус или с помощью манипуляций получить от вас желаемое.
Здесь нет ничего про медиацию конфликтов или про то, что делать, когда к вам пришли подчиненные в ссоре. Не рассматриваются конструктивные конфликты, столь полезные в работе группы.
Что за фреймворк?
Четыре стадии конфликта: эмоциональная, показ границ, защита границ, сепарация. Переходя от стадии к стадии, мы даём визави шансы на сохранение отношений, при этом не позволяя нанести ущерб нам.
- Эмоциональная стадия это когда вам нагрубили на эмоциях.
- Показ границ используется, когда ваши личные границы нарушили ненарочно, по незнанию или по глупости.
- Защита границ применяется, когда человек точно понимает, что нарушает ваши границы, но отказывается их уважать. Чаще всего это манипуляция или прямая агрессия.
- Сепарация это последний шанс сохранить отношения. На этой стадии вы находитесь, когда понимаете, что уже готовы пойти на разрыв отношений.
Для кого может быть полезно?
Для всех! Книга рассматривает ситуации от банального хамства в общественном транспорте до манипуляций со стороны руководителя или проблемной подруги. Есть даже кейсы, когда родители передавливают с «когда уже дети?». Моя однозначная рекомендация и оценка 10/10.
По рекомендации моего товарища Андрея прочёл книгу. Многого не ждал — у меня и эмоциональный интеллект достаточно высокий, и с конфликтами я справляюсь как-то естественно хорошо, и кое-чему успел поучиться в жизни.
Но книга оказалась просто пушкой! Какие-то приёмы я знал, но всё равно извлёк тонну пользы из книги, и вообще я в восторге!
Во-первых, хорошая, стройная теория, прям настоящий фреймворк для разрешения конфликтов. Во-вторых, там есть упражнения! А на сайте их есть ещё, и это супер полезно! В-третьих, многие тезисы сопровождаются ссылками на исследования или на consensus.ai, которым я тоже регулярно грешу пользоваться.
О чем книга?
О межличностных конфликтах. Именно про случаи, когда конфликт между вами и кем-то ещё. Под конфликтом в книге понимается только негативное значение: когда кто-то пытается изменить ваш социальный статус или с помощью манипуляций получить от вас желаемое.
Здесь нет ничего про медиацию конфликтов или про то, что делать, когда к вам пришли подчиненные в ссоре. Не рассматриваются конструктивные конфликты, столь полезные в работе группы.
Что за фреймворк?
Четыре стадии конфликта: эмоциональная, показ границ, защита границ, сепарация. Переходя от стадии к стадии, мы даём визави шансы на сохранение отношений, при этом не позволяя нанести ущерб нам.
- Эмоциональная стадия это когда вам нагрубили на эмоциях.
- Показ границ используется, когда ваши личные границы нарушили ненарочно, по незнанию или по глупости.
- Защита границ применяется, когда человек точно понимает, что нарушает ваши границы, но отказывается их уважать. Чаще всего это манипуляция или прямая агрессия.
- Сепарация это последний шанс сохранить отношения. На этой стадии вы находитесь, когда понимаете, что уже готовы пойти на разрыв отношений.
Для кого может быть полезно?
Для всех! Книга рассматривает ситуации от банального хамства в общественном транспорте до манипуляций со стороны руководителя или проблемной подруги. Есть даже кейсы, когда родители передавливают с «когда уже дети?». Моя однозначная рекомендация и оценка 10/10.
books.yandex.ru
Читать «Эффективный конфликт. Как защищать интересы и управлять сложной коммуникацией». Александра Клименко, Михаил Ромашов, Юрий…
«Эффективный конфликт. Как защищать интересы и управлять сложной коммуникацией» Александра Клименко, Михаил Ромашов, Юрий Клименко читать полную версию книги на сайте или в приложении электронной онлайн библиотеки Яндекс Книги.
Forwarded from Yandex for ML
This media is not supported in your browser
VIEW IN TELEGRAM
Пока мы готовим видео с докладами, делимся записями мастер-классов. Изначально не планировали их записывать, но на конференции они вызвали ажиотаж. Мы всё поняли и сделали выводы: практический ML должен попробовать каждый.
Подписывайтесь:
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from URBAN MASH (Мария Эрцеговац)
АЛГОРИТМЫ МАРШРУТИЗАЦИИ ДЛЯ НАВИГАЦИОННЫХ СИСТЕМ
Я собрала подборку наиболее часто использованных алгоритмов построения маршрутов. Хочу обратить внимание на 2 наиболее популярных.
1️⃣ Contraction Hierarchies (CH) - используется в промышленных навигационных системах (Google Maps, OSRM). После предобработки поиск пути занимает миллисекунды даже на графах с миллионами узлов.
2️⃣ Классический A-star - это эвристический алгоритм, который сочетает стоимость пройденного пути и эвристическую оценку до цели. Быстрее Dijkstra, но требует хорошей эвристической функции. Идеален для игр и учебных проектов.
Выложила простенький код на своем гитхабе, как построить маршрут из точки А в точку Б по алгоритму a-star.
Полезные Python-библиотеки
3️⃣ BallTree - фича из МЛ, которая используется для более быстрого поиска нахождения ближайшего узла. Когда мы выгружает сеть дорог, преобразовываем его в граф (ребра + узлы), часто получается так, что наши точки не находятся внутри графа (как в моем примере Скупштина и Калемегдан в Белграде). Основная идея заключается в том, что Ball Tree - это древовидная структура данных, которая рекурсивно разделяет пространство на вложенные сферы ("шары") для эффективного поиска ближайших соседей. Сложность такого поиска O(log N) вместо O(N).
Современные API провайдеры маршрутизации
❤️ Бесплатные:
🔥 OSRM
🔥 OpenRouteService
🔥 GraphHopper
❤️ Платные (с free trial доступом):
🔥 Google Maps Directions API
🔥 HERE Maps Routing API
🔥 MapBox Directions API
🔥 TomTom Routing API
🔥 Apple MapKit JS
@urban_mash
Я собрала подборку наиболее часто использованных алгоритмов построения маршрутов. Хочу обратить внимание на 2 наиболее популярных.
Выложила простенький код на своем гитхабе, как построить маршрут из точки А в точку Б по алгоритму a-star.
Полезные Python-библиотеки
# 1. OSMnx - самый популярный для работы с OSM
import osmnx as ox
G = ox.graph_from_place('Belgrade')
route = ox.shortest_path(G, start, end)
# 2. NetworkX - базовые алгоритмы
import networkx as nx
path = nx.astar_path(G, start, end)
# 3. PySAL - географический анализ
from libpysal import weights
# 4. Scikit-learn - для BallTree
from sklearn.neighbors import BallTree
from sklearn.neighbors import BallTree
import numpy as np
# Для поиска ближайших узлов графа к координатам
nodes = np.array([[G.nodes[n]['y'], G.nodes[n]['x']] for n in G.nodes()])
tree = BallTree(nodes, metric='haversine')
def nearest_node(point):
point_rad = np.radians([[point[1], point[0]]])
dist, idx = tree.query(point_rad, k=1)
return list(G.nodes())[idx[0][0]]
Современные API провайдеры маршрутизации
@urban_mash
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from Обзоры Пива.txt
Я провел мини-ресерч в области продакт менеджмента, опросил ряд junior/middle/senior продактов из Авито и других компаний.
В исследовании фокус на пути входа aka "вката" в профессию, а не о самой профессии.
Спасибо всем, кто принял участие в ресерче!
PDF-версия в комментариях к посту
Please open Telegram to view this post
VIEW IN TELEGRAM
Forwarded from VF | Science
Сегодня выложили 2 части лекции и она немножко затянулась, примерно на 100 минут :)
На лекции мы обсудили основополагающую технологию VQ-VAE и дошли до современных подходов к обучению аудиокодеков. Попутно рассмотрели специфические для них проблемы и способы их решения — такие как недифференцируемость в процессе обучения, коллапс кодовой книги, неэффективное покрытие домена и недостаточная репрезентативность для последующих задач. Отметили тенденции в современных исследованиях, разобрали конкретные примеры актуальных аудиокодеков и подумали, как можно объединить существующие подходы для обучения собственного кодека, потенциально превосходящего текущие решения. В завершение поговорили о практических рекомендациях по обучению кодеков и дополнительной литературе по теме.
Лекцию сделал без глубокого погружения в конкретные работы, зато мы обсудили гораздо больше других мыслей и сохранили интуицию по самым важным идеям и проблемам VQ-VAE моделей. Хотелось сделать лецию с упором на актуальные идеи и дать ровно столько, чтобы вы могли решить, куда стоит углубиться самостоятельно, имея фундамент заложенный после просмотра. Пишите возникающие вопросы в чат курса DLS или мне @varfolomeefff
Предлагаю посмотреть и поделиться мнением под постом. Давно я длинные лекции не читал.
На днях выделю особенно интересные тезисы из лекции в канал и обсужу их. Интуиция на леции правда животрепещущая и есть, о чем поспорить/подумать.
Часть 1: https://youtu.be/4mVfb-mhv9k?si=k9Q2wgtsA1h2DcP0
Часть 2: https://youtu.be/kOS6qHc6K2g?si=Po-jHSLwpeO5LmkZ
#audio #perfomances
Please open Telegram to view this post
VIEW IN TELEGRAM
YouTube
Лекция. Аудио кодеки. Часть 1
Занятие ведёт Захар Варфоломеев
Ссылка на материалы занятия:
---
Deep Learning School при ФПМИ МФТИ
Каждые полгода мы запускаем новую итерацию нашего двухсеместрового практического онлайн-курса по глубокому обучению. Наборы проводятся в августе-сентябре…
Ссылка на материалы занятия:
---
Deep Learning School при ФПМИ МФТИ
Каждые полгода мы запускаем новую итерацию нашего двухсеместрового практического онлайн-курса по глубокому обучению. Наборы проводятся в августе-сентябре…
Forwarded from NGI | Влад Корнышев про AI и создание AI-продуктов
Как я использовал SGR, не подозревая об этом, и почему советую вам
Сколько бы ты ни работал в какой-либо сфере, уследить за всем просто нереально. В AI буквально каждый день появляются новые инструменты и методы работы с моделями, в частности с LLM. И иногда так бывает, что ты самостоятельно приходишь к чему-то, гордишься этим, а оказывается - про это уже написаны статьи. Так случилось и со мной.
Поле применения LLM довольно широкое, но одной из самых частых задач я бы назвал ускорение производства текстового результата: от оптимизации продуктового ресерча с анализом рыночных и пользовательских данных до частичной автоматизации с помощью AI-ассистентов.
Глобально у нас есть несколько стратегий достижения результата:
- можно просто задать задачу LLM, применяя базовый промптинг или продвинутые техники типа CoT;
- можно использовать RAG, чтобы доставать релевантный контекст из базы знаний;
- можно вдохнуть в LLM агентское поведение, добавив инструменты, и аппрувить промежуточные результаты.
У всех этих методов есть серьезные недостатки. Простой промптинг часто порождает нерепродуцируемость и разброс результатов. RAG и тулы могут упустить важные детали, значимые именно для вашей задачи, потому что модель не всегда полностью понимает, что важно именно вам как специалисту.
Снижение температуры модели помогает, но не решает проблему полностью. Работая с комплексными задачами, когда нужно поэтапно извлечь данные, структурировать и принять решения в рамках одного диалога, я нашёл метод, который позволяет “придушить” модель и получать более релевантный, контролируемый результат.
Как это сделать?
Метод прост - в системных промптах я включаю не только описание задачи, но и детальное описание процесса и критериев результата. Потом даю LLM не просто произвольный текст, а чётко типизированный шаблон вывода, например, в формате JSON Schema, где указываю строгое поле для каждого шага.
Далее этот структурированный вывод я использую как вход в следующий шаг в цепочке. То есть вместо свободного CoT я задаю схему рассуждений - последовательность этапов, типы и формат данных, которые модель должна сгенерировать на каждом этапе. Эта схема заставляет модель придерживаться логики и правил, помогает избежать ошибок и галлюцинаций.
То есть мы получаем метод, в котором вся логика вывода, переходы и схемы валидации жёстко заданы с помощью схем данных. Всё, что вам нужно - это спроектировать качественные схемы и описать логику шагов. Тогда финальные документы и результаты практически не требуют правок.
Это называется SRG
Так я радовался своему “открытию”, пока у Валеры в канале @neuraldeep не наткнулся на аббривеатуру SGR, которая обещала все то же самое 😄 Оказалось, что Schema-Guided Reasoning изобрели еще до меня 😁 Более того, про него еще статейки написали и есть куча холивара на тему того, тру это или не тру 😄 У метода есть сторонники и критики, но на мой взгляд, если нужна предсказуемость, воспроизводимость и контроль над качеством вывода LLM, это лучший подход.
Плюс SGR играет хорошо с RAG и агентскими инструментами: схема помогает управлять, когда и какой контекст доставать, как валидировать промежуточные шаги и принимать решения о следующем действии. Это снижает пропуск важного контекста и улучшает общую надежность.
Если вам надо системно и стабильно получать результат от LLM, рекомендую обратить внимание на SGR. Это не просто продвинутый промптинг - это работа с моделью на уровне структурированных данных и схем рассуждений, что кардинально повышает качество и удобство работы.
Сколько бы ты ни работал в какой-либо сфере, уследить за всем просто нереально. В AI буквально каждый день появляются новые инструменты и методы работы с моделями, в частности с LLM. И иногда так бывает, что ты самостоятельно приходишь к чему-то, гордишься этим, а оказывается - про это уже написаны статьи. Так случилось и со мной.
Поле применения LLM довольно широкое, но одной из самых частых задач я бы назвал ускорение производства текстового результата: от оптимизации продуктового ресерча с анализом рыночных и пользовательских данных до частичной автоматизации с помощью AI-ассистентов.
Глобально у нас есть несколько стратегий достижения результата:
- можно просто задать задачу LLM, применяя базовый промптинг или продвинутые техники типа CoT;
- можно использовать RAG, чтобы доставать релевантный контекст из базы знаний;
- можно вдохнуть в LLM агентское поведение, добавив инструменты, и аппрувить промежуточные результаты.
У всех этих методов есть серьезные недостатки. Простой промптинг часто порождает нерепродуцируемость и разброс результатов. RAG и тулы могут упустить важные детали, значимые именно для вашей задачи, потому что модель не всегда полностью понимает, что важно именно вам как специалисту.
Снижение температуры модели помогает, но не решает проблему полностью. Работая с комплексными задачами, когда нужно поэтапно извлечь данные, структурировать и принять решения в рамках одного диалога, я нашёл метод, который позволяет “придушить” модель и получать более релевантный, контролируемый результат.
Как это сделать?
Метод прост - в системных промптах я включаю не только описание задачи, но и детальное описание процесса и критериев результата. Потом даю LLM не просто произвольный текст, а чётко типизированный шаблон вывода, например, в формате JSON Schema, где указываю строгое поле для каждого шага.
Далее этот структурированный вывод я использую как вход в следующий шаг в цепочке. То есть вместо свободного CoT я задаю схему рассуждений - последовательность этапов, типы и формат данных, которые модель должна сгенерировать на каждом этапе. Эта схема заставляет модель придерживаться логики и правил, помогает избежать ошибок и галлюцинаций.
То есть мы получаем метод, в котором вся логика вывода, переходы и схемы валидации жёстко заданы с помощью схем данных. Всё, что вам нужно - это спроектировать качественные схемы и описать логику шагов. Тогда финальные документы и результаты практически не требуют правок.
Это называется SRG
Так я радовался своему “открытию”, пока у Валеры в канале @neuraldeep не наткнулся на аббривеатуру SGR, которая обещала все то же самое 😄 Оказалось, что Schema-Guided Reasoning изобрели еще до меня 😁 Более того, про него еще статейки написали и есть куча холивара на тему того, тру это или не тру 😄 У метода есть сторонники и критики, но на мой взгляд, если нужна предсказуемость, воспроизводимость и контроль над качеством вывода LLM, это лучший подход.
Плюс SGR играет хорошо с RAG и агентскими инструментами: схема помогает управлять, когда и какой контекст доставать, как валидировать промежуточные шаги и принимать решения о следующем действии. Это снижает пропуск важного контекста и улучшает общую надежность.
Если вам надо системно и стабильно получать результат от LLM, рекомендую обратить внимание на SGR. Это не просто продвинутый промптинг - это работа с моделью на уровне структурированных данных и схем рассуждений, что кардинально повышает качество и удобство работы.
Forwarded from VF | Science
Колаб для семинара, в котором мы обучим поверх кодов Mimi кодека классификатор голосов на мужской и женский 😄
Используем 8 кодбуков, обучаем 8 трансформер-энкодеров, делаем темпоральный пулинг по токенам, а затем атеншн пулинг между энкодерами. Потом обычный классификатор. Из прикольного - визуализация атеншна на разные уровни RVQ.
Научились работать с RVQ и в качестве упражнения можете посчитать разные статистики для кодовых книг, например perpexity по кодбуку (покажет насколько равномерно используются коды) или утилизацию кодов на разных уровнях/на первом. Или попробовать другую простенькую задачу и посмотреть как интерпретируются уровни RVQ, вероятно на разных уровнях содержится разная семантика/смысл.
https://colab.research.google.com/drive/1L6sTCrpdxybkSOOrc4G2E4AuRnQLWZQj#scrollTo=cHGzcgj8oRVi
Используем 8 кодбуков, обучаем 8 трансформер-энкодеров, делаем темпоральный пулинг по токенам, а затем атеншн пулинг между энкодерами. Потом обычный классификатор. Из прикольного - визуализация атеншна на разные уровни RVQ.
Научились работать с RVQ и в качестве упражнения можете посчитать разные статистики для кодовых книг, например perpexity по кодбуку (покажет насколько равномерно используются коды) или утилизацию кодов на разных уровнях/на первом. Или попробовать другую простенькую задачу и посмотреть как интерпретируются уровни RVQ, вероятно на разных уровнях содержится разная семантика/смысл.
https://colab.research.google.com/drive/1L6sTCrpdxybkSOOrc4G2E4AuRnQLWZQj#scrollTo=cHGzcgj8oRVi
Google
Copy of Копия блокнота
Colab notebook
Forwarded from .ml
Почему Polars blazingly-fast: дело не только в Rust
Когда данных много, pandas часто упирается в память и «однопоточность» Python, а множественные агрегации могут выполняться в течение часов или даже дней. Какие же существуют альтернативы? Давайте разберёмся, как устроен Polars и какие архитектурные решения делают его blazingly-fast.
Как оно работает
📌 Колоночный движок на Rust + Arrow-модель памяти
Polars использует модель памяти Apache Arrow для хранения данных в колоночных буферах — плотных, типизированных массивах без Python-объектов. Что важно: формат адаптирован под высокие кэш-хит-рейты и быстрое выполнение SIMD-инструкций. Ядро на Rust исполняется вне интерпретатора Python и не упирается в GIL, что позволяет эффективнее утилизировать CPU и распараллеливать вычисления.
📌 Lazy-режим и оптимизатор
Вы описываете всю трансформацию целиком, а движок сам решает порядок шагов: «проталкивает» фильтры к источнику, отбрасывает лишние столбцы ещё на чтении. По сути Python — это интерфейс, который помогает собрать программу на внутреннем оптимизированном DSL Polars. В итоге это сокращает I/O и использование памяти.
📌 Логический → физический план: как Polars оптимизирует запрос
Когда вы описываете запрос с использованием lazy frame и lazy computations, Polars строит логическое дерево и заранее проверяет типы/схему. Затем оптимизатор уплотняет работу: проталкивает select/filter к источнику, выкидывает лишнее, объединяет выражения. После этого выбираются конкретные алгоритмы и распараллеливание (какой join, как считать group_by), формируется физический план. На исполнении читаются только нужные столбцы и куски данных, при необходимости — потоково; в конце всё собирается одним collect(). Для диагностики полезно смотреть план через lf.explain() (при необходимости — с учётом движка) и включать POLARS_VERBOSE=1, чтобы видеть, как выглядит итоговое оптимизированное дерево.
Когда данных много, pandas часто упирается в память и «однопоточность» Python, а множественные агрегации могут выполняться в течение часов или даже дней. Какие же существуют альтернативы? Давайте разберёмся, как устроен Polars и какие архитектурные решения делают его blazingly-fast.
Как оно работает
📌 Колоночный движок на Rust + Arrow-модель памяти
Polars использует модель памяти Apache Arrow для хранения данных в колоночных буферах — плотных, типизированных массивах без Python-объектов. Что важно: формат адаптирован под высокие кэш-хит-рейты и быстрое выполнение SIMD-инструкций. Ядро на Rust исполняется вне интерпретатора Python и не упирается в GIL, что позволяет эффективнее утилизировать CPU и распараллеливать вычисления.
📌 Lazy-режим и оптимизатор
Вы описываете всю трансформацию целиком, а движок сам решает порядок шагов: «проталкивает» фильтры к источнику, отбрасывает лишние столбцы ещё на чтении. По сути Python — это интерфейс, который помогает собрать программу на внутреннем оптимизированном DSL Polars. В итоге это сокращает I/O и использование памяти.
📌 Логический → физический план: как Polars оптимизирует запрос
Когда вы описываете запрос с использованием lazy frame и lazy computations, Polars строит логическое дерево и заранее проверяет типы/схему. Затем оптимизатор уплотняет работу: проталкивает select/filter к источнику, выкидывает лишнее, объединяет выражения. После этого выбираются конкретные алгоритмы и распараллеливание (какой join, как считать group_by), формируется физический план. На исполнении читаются только нужные столбцы и куски данных, при необходимости — потоково; в конце всё собирается одним collect(). Для диагностики полезно смотреть план через lf.explain() (при необходимости — с учётом движка) и включать POLARS_VERBOSE=1, чтобы видеть, как выглядит итоговое оптимизированное дерево.
Forwarded from .ml
Ключевые внутренние паттерны
📝 Predicate / projection / slice pushdown
Фильтры, выбор столбцов и срезы применяются максимально близко к моменту чтения (scan_parquet/scan_csv). Проще говоря, читаем ровно то, что нужно, а не «всё подряд». Это резко ускоряет последующие join и group_by и снижает нагрузку на память.
📝 Параллельные join и group_by
Polars разбивает данные на части и обрабатывает их на нескольких ядрах, используя быстрые хэш-джоины и продуманные стратегии агрегации. Ускорение особенно заметно на широких таблицах и конвейерах с множественными агрегациями. Конкретный тип join и форма пайплайна могут влиять на распараллеливание и потребление памяти — это видно в плане.
📝 Streaming / out-of-core
Длинные пайплайны можно исполнять «потоково»: данные обрабатываются батчами, не накапливаясь целиком в памяти — это уменьшает пики памяти и стабилизирует задержки. Включается это явно: lf.collect(engine="streaming"). Важно: не все операции поддержаны в стриминге; где это невозможно, движок прозрачно перейдёт к in-memory выполнению (это нормально, но стоит контролировать план).
📝 SQL поверх выражений
Нужен знакомый синтаксис — регистрируете фреймы и используйте SQL; внутри всё равно сработает оптимизатор выражений. Это возможно благодаря SQLContext/pl.sql, что удобно для смешанных команд (аналитики + инженеры).
Анти-паттерны «под капотом»
📎 Построчные apply/map_rows на Python
Любая функция, которая ходит по строкам в Python, возвращает вас к GIL и убирает параллелизм. Если нужна UDF — старайтесь выразить логику через выражения Polars или переносить вычисления ближе к движку.
📎 Постоянное использование read_* вместо scan_*
read_* сразу загружает всё в память и ограничивает оптимизатор в pushdown-приёмах. Для конвейеров и больших наборов данных предпочитайте scan_* с lazy-планом — это откроет путь для predicate/projection/slice pushdown и стриминга. Для быстрых «снимков» и интерактивной разведки read_* допустим, но указывайте columns=[...] и другие параметры чтения, чтобы не тянуть лишнее.
📎 dtype=object/pl.Object
Polars умеет хранить Python-объекты в специальных столбцах, но это вырывает данные из arrow колоночной модели и выключает многие векторные оптимизации. Используйте только при крайней необходимости и как можно раньше приводите к нативным типам Polars.
Скорость Polars — не «магия», а архитектура
Arrow-модель памяти, lazy-планирование с агрессивными оптимизациями, потоковое исполнение там, где это возможно, и ядро на Rust, обходящее GIL. Практический эффект зависит от формулировки запроса и формата данных — корректный выбор scan_*, выражений и режима исполнения часто даёт многократный выигрыш.
В следующем посте мы расскажем, как использовать Polars в проде: от чтения паркетов до передачи фичей в модели.
💜 Этот пост написал Всеволод Богодист, Data Scientist в Точка Банк.
📝 Predicate / projection / slice pushdown
Фильтры, выбор столбцов и срезы применяются максимально близко к моменту чтения (scan_parquet/scan_csv). Проще говоря, читаем ровно то, что нужно, а не «всё подряд». Это резко ускоряет последующие join и group_by и снижает нагрузку на память.
📝 Параллельные join и group_by
Polars разбивает данные на части и обрабатывает их на нескольких ядрах, используя быстрые хэш-джоины и продуманные стратегии агрегации. Ускорение особенно заметно на широких таблицах и конвейерах с множественными агрегациями. Конкретный тип join и форма пайплайна могут влиять на распараллеливание и потребление памяти — это видно в плане.
📝 Streaming / out-of-core
Длинные пайплайны можно исполнять «потоково»: данные обрабатываются батчами, не накапливаясь целиком в памяти — это уменьшает пики памяти и стабилизирует задержки. Включается это явно: lf.collect(engine="streaming"). Важно: не все операции поддержаны в стриминге; где это невозможно, движок прозрачно перейдёт к in-memory выполнению (это нормально, но стоит контролировать план).
📝 SQL поверх выражений
Нужен знакомый синтаксис — регистрируете фреймы и используйте SQL; внутри всё равно сработает оптимизатор выражений. Это возможно благодаря SQLContext/pl.sql, что удобно для смешанных команд (аналитики + инженеры).
Анти-паттерны «под капотом»
📎 Построчные apply/map_rows на Python
Любая функция, которая ходит по строкам в Python, возвращает вас к GIL и убирает параллелизм. Если нужна UDF — старайтесь выразить логику через выражения Polars или переносить вычисления ближе к движку.
📎 Постоянное использование read_* вместо scan_*
read_* сразу загружает всё в память и ограничивает оптимизатор в pushdown-приёмах. Для конвейеров и больших наборов данных предпочитайте scan_* с lazy-планом — это откроет путь для predicate/projection/slice pushdown и стриминга. Для быстрых «снимков» и интерактивной разведки read_* допустим, но указывайте columns=[...] и другие параметры чтения, чтобы не тянуть лишнее.
📎 dtype=object/pl.Object
Polars умеет хранить Python-объекты в специальных столбцах, но это вырывает данные из arrow колоночной модели и выключает многие векторные оптимизации. Используйте только при крайней необходимости и как можно раньше приводите к нативным типам Polars.
Скорость Polars — не «магия», а архитектура
Arrow-модель памяти, lazy-планирование с агрессивными оптимизациями, потоковое исполнение там, где это возможно, и ядро на Rust, обходящее GIL. Практический эффект зависит от формулировки запроса и формата данных — корректный выбор scan_*, выражений и режима исполнения часто даёт многократный выигрыш.
В следующем посте мы расскажем, как использовать Polars в проде: от чтения паркетов до передачи фичей в модели.
💜 Этот пост написал Всеволод Богодист, Data Scientist в Точка Банк.