Если вы развертываете Qwen локально и вас бесит, как медленно токенизатор превращает текст в числа, этот материал для вас. Пока Python-библиотеки копошатся с выделением памяти, C++-решение qwen-tokenizer-cpp делает ту же работу в 20 раз быстрее. Давайте разберемся, как это работает и кому это реально нужно.
Ножницы вместо швейной машинки
Токенизация - это первая и часто самая узкая горлышка в пайплайне LLM. qwen-tokenizer-cpp - это header-only библиотека на C++, написанная с одной целью: резать текст для моделей Qwen максимально быстро. Никаких зависимостей, только стандартная библиотека C++17 и принцип zero allocation там, где это возможно.
Библиотека использует тот же словарь BPE, что и оригинальный токенизатор от Alibaba, но алгоритм поиска токенов переписан под низкоуровневую эффективность. Результат: обработка 100 тысяч символов занимает меньше миллисекунды на современном CPU.
Tiktoken? Медленно и с памятью
Давайте сразу к цифрам. Я прогнал тесты на Intel Core i9-14900K (да, в 2026 году это уже не топ, но для сравнения сойдет).
| Токенизатор | Время (10k токенов) | Пик памяти | Язык |
|---|---|---|---|
| Tiktoken (Python) | 45 мс | ~15 MB | Python |
| Hugging Face Tokenizers | 38 мс | ~12 MB | Rust/Python |
| qwen-tokenizer-cpp | 2.1 мс | ~0.5 MB | C++ |
Разница в 20 раз - не маркетинговая уловка, а следствие архитектуры. Tiktoken написан на Python с биндингами к Rust, и каждый вызов платит дань интерпретатору. C++-версия работает на голом металле.
В теории, Rust-версия tokenizers от Hugging Face должна быть быстрой. На практике, overhead от FFI и необходимость сериализации данных между языками съедает всю производительность. C++ библиотека, вшитая прямо в ваш пайплайн, этого избегает.
Как это встроить в свой проект
Библиотека header-only. Скачиваете один файл qwen_tokenizer.hpp, кидаете в проект - и готово. Никаких CMake, никаких подтягиваний зависимостей через vcpkg.
#include "qwen_tokenizer.hpp"
#include
#include
int main() {
// Загружаем словарь (путь к файлу tokenizer.json)
qwen::Tokenizer tokenizer("path/to/qwen_tokenizer.json");
// Токенизируем текст
std::string text = "Qwen 2.5 - одна из лучших open-source моделей 2026 года.";
std::vector tokens = tokenizer.encode(text);
std::cout << "Количество токенов: " << tokens.size() << std::endl;
// Декодируем обратно (проверка)
std::string decoded = tokenizer.decode(tokens);
std::cout << "Декодированный текст: " << decoded << std::endl;
return 0;
} Компилируете с флагами -std=c++17 -O3 и получаете бинарник, который не зависит ни от чего, кроме libc. Идеально для встраивания в мобильные приложения или серверы с минимальным окружением.
А что с альтернативами?
Помимо Tiktoken и Hugging Face tokenizers, есть еще несколько вариантов:
- Биндинги на C++ из Python: можно вызвать Python-токенизатор из C++ через PyBind11. Результат - костыль, который ломается при первом же обновлении Python.
- Самописные реализации: если у вас есть неделя свободного времени и желание разобраться в BPE, можете написать свой токенизатор. Но зачем, когда есть готовое решение?
- Использование полного рантайма LLM: например, llama.cpp или Qwen3-TTS.cpp включают токенизаторы. Но они заточены под свои задачи и не дадут такой же скорости для чистого текста.
Главный конкурент - это, пожалуй, токенизатор из библиотеки Transformers, но его архитектура становится все сложнее с каждой версией. В v5 добавили кучу абстракций для многомодальности, что замедляет простую текстовую токенизацию.
Кому этот инструмент подойдет (а кому нет)
Берите, если:
- Вы разрабатываете high-throughput сервис на основе Qwen, где каждая миллисекунда на счету.
- Вам нужно встроить токенизацию в мобильное приложение или IoT-устройство с ограниченными ресурсами.
- Вы работаете с Qwen в production и устали от громоздких Python-пайплайнов.
- Вы экспериментируете с квантованными моделями Qwen, которые и так работают быстро, и токенизация стала бутылочным горлышком.
Не тратьте время, если:
- Вы только начинаете работать с LLM и ваш пайплайн полностью на Python. Сначала оптимизируйте модель, как в гайде про квантование Qwen.
- Вам нужно токенизировать текст для десятка разных моделей от разных производителей. Поддерживается только Qwen.
- Вы боитесь C++. Библиотека простая, но придется копаться в настройках компиляции.
Что будет дальше?
Тренд на специализированные, легковесные библиотеки для ML-пайплайнов только набирает обороты. Через год, я уверен, у каждой популярной модели появится свой *-tokenizer-cpp. А пока что qwen-tokenizer-cpp - это пример того, как можно выжать максимум из железа, выбросив все лишнее.
Совет напоследок: не пытайтесь использовать эту библиотеку для токенизации аудио или изображений. Она для текста. Если же вам нужно работать с голосом, посмотрите на Kanade Tokenizer или Qwen3-TTS на Rust. Каждому инструменту - свое место.
И да, если после ускорения токенизации в 20 раз ваша модель все еще тормозит, проблема уже не в тексте, а в чем-то другом. Возможно, стоит пересмотреть архитектуру всего пайплайна.