Долгое время токенизация оставалась «тихим» этапом в конвейере обработки естественного языка. В то время как модели глубокого обучения требовали огромных вычислительных ресурсов для обучения и инференса, предварительная обработка текста считалась легкой задачей, не влияющей на общую производительность системы. Однако по мере того как сами модели становились быстрее, а объемы данных — колоссальными, этот баланс начал меняться. Сегодня токенизатор может стать узким местом, которое заставляет мощные GPU простаивать в ожидании данных от CPU. Именно поэтому команда Hugging Face полностью переписала библиотеку tokenizers, выпустив версию 1.0, которая обещает не просто оптимизацию, а фундаментальный пересмотр подхода к обработке текста.
В этой статье мы подробно разберем, что именно изменилось в архитектуре библиотеки, почему новые методы позволяют ускорить процесс в разы и как это влияет на разработку ML-систем в реальных условиях. Мы рассмотрим технические детали, от замены регулярных выражений на битовые операции до внедрения локального кэширования, и оценим практическую пользу этих изменений для разработчиков, работающих с большими языковыми моделями (LLM).
01Почему токенизация стала проблемой?
Раньше токенизация воспринималась как вспомогательный процесс. Однако современные сценарии использования LLM предъявляют к ней жесткие требования. Представьте себе сервис, который обрабатывает тысячи параллельных запросов или систему, обучающуюся на терабайтах текста. В таких условиях даже небольшая задержка на этапе преобразования текста в токены накапливается и приводит к заметному снижению пропускной способности всей системы. GPU, способные обрабатывать миллионы параметров за миллисекунду, начинают ждать, пока CPU завершит разбивку текста на токены. Это неэффективное распределение ресурсов.
Новая версия 1.0 создана с одной главной целью: сделать токенизацию настолько легкой и масштабируемой, чтобы она никогда не становилась препятствием для работы модели. Важно отметить, что эта работа не была выполнена в вакууме. Команда Hugging Face активно изучала решения других проектов, таких как gigatoken, tiktoken, kitoken и других. Многие из описанных ниже оптимизаций стали возможны благодаря идеям, которые уже доказали свою эффективность в других open-source библиотеках. Теперь же они объединены в единый, высокопроизводительный движок.

02Архитектурные изменения: от монолита к модулям
Одним из первых и важных шагов в рефакторинге стало разделение единогоcrate (пакета) на рабочее пространство (workspace). Теперь библиотека состоит из нескольких независимых компонентов: tk-encode (основной рантайм для кодирования), tk-serialize, tk-convert и tk-train. Это изменение позволяет приложениям подключать только те части библиотеки, которые им действительно нужны. Если вам требуется только инференс (кодирование текста), вы можете исключить модуль обучения, что значительно уменьшает размер итогового бинарного файла и время компиляции.
Кроме того, была внедрена концепция «no-alloc model». В старой реализации каждый шаг токенизации мог требовать выделения новой памяти в куче (heap), что создавало нагрузку на сборщик мусора и замедляло выполнение. В новой версии рабочее пространство для слияний (merge working set) живет в буфере, принадлежащем вызывающей стороне. Цикл обработки никогда не обращается к аллокатору памяти, что исключает накладные расходы на управление памятью во время критически важного цикла токенизации.
03Битовые потоки вместо регулярных выражений
Самое значительное архитектурное изменение касается этапа разделения текста на пре-токены (pre-tokens). Алгоритмы BPE (Byte Pair Encoding), которые лежат в основе большинства современных моделей, используют регулярные выражения для разделения входного текста. В старой версии библиотеки для этого использовался общий движок регулярных выражений, который интерпретировал паттерн на каждом шаге. Это было неэффективно, так как паттерн фиксирован для каждой модели и не меняется во время выполнения.

В версии 1.0 команда внедрила технологию bitcannon. Вместо использования общего движка регулярных выражений, для каждого поддерживаемого паттерна пишется специализированная функция, которая использует SIMD-инструкции (Single Instruction, Multiple Data) современных процессоров. Bitcannon рассматривает байты входного текста как параллельные потоки битов. Границы токенов определяются с помощью булевых операций над целыми регистрами процессора, а не путем посимвольного сканирования. Это позволяет обрабатывать данные за одну операцию.
Эта идея не нова: аналогичные подходы используются в библиотеках Parabix для обработки текста и simdjson для парсинга JSON. Однако применение их к токенизации BPE дало впечатляющие результаты. Важно отметить, что это ускорение работает только для моделей, чьи паттерны разделения попадают в заранее определенный набор грамматик (например, GPT-2, cl100k, o200k, Tekken, DeepSeek). Для моделей с нестандартными паттернами библиотека сохраняет обратную совместимость, используя старый путь через регулярные выражения, но для большинства популярных моделей это дает кратный прирост скорости.
04Магия кэширования: Word Cache
Реальный текст, будь то код, статьи или диалоги, содержит огромное количество повторяющихся слов и фраз. Поскольку алгоритм BPE детерминирован (одни и те же входные данн
Источник: Hugging Face ↗
