Токенизация — узкое горлышко любого LLM-пайплайна. Вы жмете «токенизировать», ставите чайник, возвращаетесь — а оно все еще думает. Знакомо? Особенно когда батч на миллион строк. tiktoken от OpenAI хорош, но он однопоточный и написан на Python. HuggingFace tokenizers быстрее, но тоже не используют все ядра процессора. И тут появляется ztok — токенизатор, написанный на Zig, с поддержкой трех форматов, мультипоточностью и заявленным ускорением в 2-5 раз. Звучит как сказка? Давайте проверим.
Что под капотом?
Zig — язык, который позиционируется как «лучший C». Он компилируется в нативный код, не имеет рантайма и дает полный контроль над памятью. ztok берет это и добавляет сверху настоящую многопоточность: при токенизации большого текста он дробит его на чанки и разбрасывает по ядрам. Результат — линейное ускорение до числа потоков.
При этом ztok умеет читать модели трех типов:
- tiktoken — файлы
.tiktokenот OpenAI (GPT-4, GPT-4o, o1 и т.д.). - HuggingFace tokenizers —
tokenizer.json(WordPiece, BPE, Unigram). - SentencePiece —
.modelфайлы (LLaMA, Mistral, Qwen).
То есть один бинарник заменяет три разных инструмента. И не просто заменяет — он их обгоняет.
Кстати, если вы хотите понять, как устроены токенизаторы изнутри, советую прочитать нашу статью «Токенизаторы в Transformers v5: ломаем чёрный ящик и собираем свой». Там мы разбираем, из каких частей состоит современный токенизатор и как их кастомизировать.
Сравнение с альтернативами: кто кого?
Давайте честно: tiktoken — медленный. Он написан на Python с небольшими C++ вставками, но вся магия однопоточная. SentencePiece быстрее, но тоже не умеет в параллель. HuggingFace tokenizers на Rust — шустрые, но их многопоточность ограничена: вы можете создать пул воркеров, но это не то же самое, что разделить один большой текст на чанки и скормить каждому ядру.
ztok делает именно это. В его бенчмарках на 8-ядерном процессоре токенизация 10 ГБ текста занимает 12 секунд против 45 у tiktoken и 28 у HF tokenizers. Разница — в 3-4 раза. Конечно, это синтетика, но даже на реальных датасетах ускорение заметно.
А что насчет токенизатора от Qwen на C++, который мы тестировали в отдельной статье? Тот давал 20-кратное ускорение, но только для одной конкретной модели (Qwen). ztok универсален: подсунули файл токенизатора — он работает, будь то LLaMA, GPT или Qwen3. Универсальность стоит нескольких процентов скорости, но это разумный компромисс.
Как попробовать? (и убедиться, что это не маркетинг)
Установка — одна команда (предполагаем, что у вас есть Go или Zig, но автор предоставляет бинарники):
# Linux / macOS
curl -L https://github.com/ztok/releases/download/v0.2.0/ztok-x86_64-linux.tar.gz | tar xz
./ztok --help
Дальше берем токенизатор — например, от GPT-4o (файл cl100k_base.tiktoken) или от LLaMA 3 (tokenizer.model) — и токенизируем файл:
# Токенизация в файл с id
./ztok encode --model cl100k_base.tiktoken --input text.txt --output tokens.bin
Если нужно декодировать обратно:
./ztok decode --model cl100k_base.tiktoken --input tokens.bin --output text.txt
--threads 4, чтобы вручную задать число потоков. По умолчанию ztok берет все доступные ядра. Если у вас 24 ядра — солнце, воздух и вода для токенизации.Кроме CLI, ztok предоставляет C API и Zig-модуль. Это значит, что вы можете встроить его прямо в свой инференс-движок. В частности, Ziggy-LLM — еще один проект на Zig для работы с GGUF — уже использует ztok для препроцессинга. Пара — ztok + Ziggy-LLM — дает полностью нативный пайплайн: от токенизации до инференса.
Кому это реально нужно?
- Инженерам данных, которые крутят пайплайны для претрейнинга. Каждый час простоя — деньги. ztok сокращает время этапа токенизации в несколько раз.
- Разработчикам инференс-движков, которые хотят встроить быструю токенизацию без лишних зависимостей (Zig компилируется в статическую библиотеку).
- Всем, кто использует tiktoken и страдает от его скорости на больших объемах. Просто замените вызов — и получите прирост.
Кому НЕ подойдет: если вам нужно токенизировать пару предложений — разницы не заметите. Но если вы перегоняете датасет размером с Википедию — ztok ваш выбор.
Важный нюанс: ztok пока не поддерживает специальные токены типа <|im_start|> в кастомных шаблонах. Если ваш пайплайн использует сложные шаблоны разговора (chat template) — придется либо подождать обновления, либо костылить вручную. Проект молодой, но развивается активно.
Кстати, про развитие: недавно Multi-Token Prediction показал, что можно ускорять не только токенизацию, но и сам генеративный шаг. А Token Superposition от Nous Research и вовсе предлагает переосмыслить саму природу токенов. Но пока эти технологии не вошли в продакшн, ztok — самое практичное, что вы можете внедрить уже сегодня. И да, он написан на Zig, а не на Rust. Не потому что модно, а потому что метко.