tokenizers v1: encode, decode and scaling, measured
Back to Articles tokenizers v1: encode, decode and scaling, measured Published September 21, 2026 Update on GitHub Upvote 1 Arthur Zucker ArthurZ Follow Simon Brandeis sbrandeis Follow Luc Georges mcpotato Follow Lysandre lysandre Follow The tokenizer has not historically been the bottleneck within ML workflows.
Compute-wise, tokenization is light compared to the heavy modeling happening in the rest of the pipeline.Yet, in some cases, it has rapidly become key to accelerating (or slowing down) your machine learning work.As models become faster and workloads scale, that balance begins to shift.
Training on massive datasets, serving many concurrent requests, or repeatedly processing long inputs can put enough pressure on the tokenizer that it starves the model of data.This is why we have chosen to heavily focus on performance for the upcoming version 1 of tokenizers.
Tokenization should be light and should scale with your workflow.Your GPUs should never sit idle waiting for the CPU to complete its tokenization.In this article, we look at what makes v1 faster than v0.23, often by tens of times.This work was entirely possible thanks to the rest of the ecosystem.
Tokenization is a very active area of open source work, and libraries such as gigatoken, tiktoken, kitoken, tokie, fastokens, wordchipper and ai-tokenizer, as well as many others, have each pushed on what a fast tokenizer can be.
We read that work, and several of the ideas below reached us because another project showed they were worth trying.Before this refactor, tokenizers was nowhere near the performance it could have had, so contributing to it may not have seemed worth it.
With this refactor, we hope to make clear that we intend tokenizers to be a library worth contributing to.We also thank IBM, NVIDIA, and the ExecuTorch team for contributing patches and helping us test across a wide range of hardware to broaden platform support.
Results We showcase results for the release candidate of tokenizers v1 against other widely used alternatives.We go over single-threaded, multi-threaded, scaling across threads, per-model comparison, per-language comparison, latency, decoding throughput, memory heap, as well as crate size.
We run this from the tokbench repository, and add a command to rerun the benchmarks on your hardware if you would like to do so.What V1 Is v1 will produce the same token IDs as v0.23.
The goal was to preserve the output, the API, the vocabulary and the merge ranks, and improve everything that can be improved.That includes breadth.The library stays general across tokenizer families rather than specialising on BPE, so v1 loads everything v0.23 loaded.
A tokenizer converts text into the list of integers a model reads.tokenizers runs that conversion in four stages.Normalization applies operations such as lowercasing or Unicode normalization to the raw text.Pre-tokenization splits the text into smaller pieces called pre-tokens.
The model turns each pre-token into tokens and maps them to IDs in its vocabulary.Post-processing adds any special tokens the model expects.The model stage is where most of the work described here happens.Eight of the ten model families measured in this article use byte pair encoding, or BPE.
BPE starts from the bytes of a pre-token and repeatedly joins the highest ranked adjacent pair until no ranked pair remains.The ranking is learned when the tokenizer is trained and ships with it, so the same text always produces the same IDs.A merge never crosses a pre-token boundary.
The other two families use WordPiece and Unigram, the two other model types the library supports.The tokenization pipeline page documents the four stages.Tokenization algorithms documents BPE, WordPiece and Unigram.Each stage was worked on.
These are the changes that mattered: change what it does workspace split one crate became a workspace: tk-encode is the required runtime, and tk-serialize, tk-convert and tk-train are linked only when an application needs them no-alloc model the merge working set lives in a caller-owned scratch buffer; the loop never touches the allocator bitcannon the split pattern becomes Boolean operations over bitstreams, using SIMD instructions to find splits instead of a regex engine merge-loop rewrite the pieces being merged form an intrusive doubly-linked list inside one preallocated buffer, so a merge updates two indices instead of moving data word cache a thread-local memo from pre-token bytes to finished ids, so a repeated word is merged once native parallelism one shared tokenizer encodes from many threads at once; each thread draws its scratch buffer and word cache from its own sub-pool, so threads no longer queue on a single lock (#2365) The Split: Bitstreams Instead Of A Regex BPE models use a regular expression to split the input text into smaller, easier to process chunks called pre-tokens.
Merges happen inside a pre-token and never across the boundary between two of them, so this split decides what the rest of the pipeline sees.That regular expression is a fixed parameter of the model.
It ships with the tokenizer and never changes at runtime, so there is no need for a general-purpose regex engine to interpret it on every encode.An equivalent splitting function can be written by hand, once, for the pattern a given model actually uses.
A hand-written function can then use the SIMD instructions (single instruction, multiple data) of a modern CPU, which apply one operation to many bytes at once and suit UTF-8 text well.
bitcannon views the input's bytes as parallel streams of bits, so boundaries fall out of boolean operations across whole registers instead of a scan that advances one character at a time.It decides 64 bytes per register operation.
The same idea drives Parabix for text processing and simdjson for JSON.This depends on recognising the pattern.A handful of grammars cover most byte-level BPE models, and a tokenizer whose pattern is not among them keeps the regex path and none of this speed-up.
That is why the gains above vary as much as they do.The Word Cache Real text contains many repeated words.Because BPE always produces the same token IDs for a given pre-token, v1 can save the result after processing it once.
A thread-local cache maps each pre-token's bytes to its token IDs, allowing later occurrences to skip the merge process.Naturally, as the input grows, the number of unique words can grow more slowly than the total number of words.Repeated words then account for an increasing share of the input.
New words still appear, which accounts for the occasional misses in the animation below.
Reproduce the shared-prefix result with: tokbench measure prefix-sharing \ --engine pipeline \ --engine hf-tokenizers \ --compare-to pipeline-no-cache \ --corpus agenticswe Caching works best when the input contains repeated pre-tokens.
Input with few repeated pre-tokens can pay for lookups without receiving many hits.The Merge Loop The next major cost comes from the BPE merge loop.For each pre-token, the loop repeatedly finds the highest-priority adjacent pair and merges it.
The previous implementation allocated new memory for every call and built a new priority queue for every pre-token.v1 reuses a scratch buffer owned by the caller, removing those repeated allocations.
It stores symbols in a flat array and links adjacent symbols by their positions in that array, which makes updates during merging cheaper.It also processes a batch of pre-tokens in a single model call.
Each candidate pair is also packed into a single 64-bit value, with the merge rank in the high bits.Comparing two candidates is then just comparing two integers, and "no merge here" is the largest possible value, so the loop finds its next merge without a branch.
Method Small differences in benchmark design can produce large differences in tokenizer performance.We used the following rules to keep the comparison consistent across engines.
rule why one timing loop every engine runs the identical loop; no per-engine fast path load excluded vocabulary load is timed separately, never inside encode id-hash verified FNV-1a over the output ids must match the baseline exactly common cells only medians are over cells every engine ran and verified complete sweep per process each repeat starts in a new process and retains every cell physical-core pinning workers are pinned to eight distinct physical cores, never sibling SMT threads independent Jobs separate Jobs measure host-to-host variation Repeatedly encoding one document can be faster than encoding a stream of distinct documents on the same build.
The first approach measures performance when the entire document is already represented in the cache.The second measures performance on new input while allowing previously seen pre-tokens to remain cached.
Both conditions are sometimes described as "warm," even though they measure different workloads.Our headline results use distinct documents, and the complete corpus is too large to fit in the cache.
Tokenizer benchmarks should identify which workload they use because the choice can dominate the result.What This Adds Up To Across the ten model families v1's encode path covers, it encodes text 3 to 30 times faster than v0.23 with one thread on an Apple M4 Max.
The low end is t5-base, the high end gpt2.It scales at 76% of linear across eight workers.Throughout these changes, v1 produces exactly the same token IDs as the released library.
The overall improvement comes from several changes working together: a hand-written splitter in place of a regex engine, a cache that answers a repeated word without merging it again, a merge loop that never touches the allocator, and one model call per batch of pre-tokens instead of one per pre-token.
Each reduces the work done at a different point in the pipeline.The next priority is support for more model families.We will move additional models onto the new merge loop before 1.0.0.
Once the release candidates stabilize, the next step will be bringing about the improvements within the transformers library and the rest of the ecosystem which depend on the tokenizers library.This post is generated from tokbench results and will be updated as support expands.
Getting It A release candidate for v1 is on crates.io.The API you call is the one you already call, so the only thing that changes is which build you install.It is the ordinary install: cargo add tokenizers --pre Training is behind a default-on feature that pulls a C++ dependency with it.
If you only need to encode, turn it off to exclude the training implementation: cargo add tokenizers --pre --no-default-features --features http Encoding is unchanged: same call, same ids.
use tokenizers::tokenizer::{Result, Tokenizer}; fn main() -> Result<()> { let tokenizer = Tokenizer::frompretrained("deepseek-ai/DeepSeek-V4-Flash", None)?; let encoding = tokenizer.encode("The tokenizer is no longer the bottleneck.", false)?; println!("{:?}", encoding.
getids()); // [671, 17840, 9160, 344, 1119, 5827, 270, 111127, 16] println!("{:?}", encoding.gettokens()); // ["The", "Ġtoken", "izer", "Ġis", "Ġno", "Ġlonger", "Ġthe", "Ġbottleneck", "."] Ok(()) } ` For a batch, encodebatch is what scales across cores.It is the call the scaling view above measures.
`rust let encodings = tokenizer.encodebatch(documents, false)?; Every figure in this post was measured against this crate.The Python bindings wrap the same code and are built from bindings/python, but they add per-call overhead that none of these measurements include.
Progress Towards V1 The benchmarks in this post cover the completed release-candidate work listed first.The remaining sections show what is still required for 1.0.0 and what we plan to explore afterward.Release Candidate: Implemented This work is in the Rust pre-release on crates.
io: cargo add tokenizers --pre workspace split: divide the single crate into tk-encode, tk-serialize, tk-conve
Related
相關文章

鴻蒙 PC 生態首款 AI 編程智能體工作臺,阿里 Qoder 支持鴻蒙電腦
作者:沁滄(實習) 責編:沁滄 評論: 9 月 21 日消息,阿里 Qoder 今日宣佈,Qoder 登陸鴻蒙 PC 應用市場,是鴻蒙 PC 生態首款 AI 編程智能體工作臺。據介紹,Qoder 團隊與鴻蒙團隊緊密配合,重點解決了幾個關鍵問題:讓 Qoder 的完整任務閉環 —— 從理解意圖、拆解步驟、調用工具到交付結果 —— 在鴻蒙系統上流暢運行,確保核心體驗不打折。

百度文庫網盤宣佈AI辦公出海,庫庫AI全球月活超4000萬
通用智能體“庫庫AI”全球AI辦公月活已超4000萬,百度文庫網盤去年推出的海外一站式AI辦公平臺Oreate AI同步煥新為庫庫AI海外版“Kooko”,海外用戶一年內突破1000萬。作為百度文庫網盤三年前佈局的通用AI辦公產品,庫庫AI前身GenFlow於2025年4月上線1.

月之暗面發佈 Kimi Code Desktop 桌面客戶端,macOS 和 Windows 版同步上線
作者:遠洋 責編:遠洋 評論: 9 月 21 日消息,今天月之暗面 Kimi 發佈了 Kimi Code Desktop,macOS 和 Windows 版同步上線,可訪問 kimi.com/ code 安裝使用。作為 Kimi Code 官方桌面客戶端,它將 Kimi Code 智能編程服務能力帶到桌面應用中。
5499元起,vivo X500系列三機齊發:動態影像成核心戰略,首發2nm旗艦芯
作者 | 雲鵬 編輯 | 李水青 9月21日上海現場報道,剛剛vivo正式發佈X500系列手機,包括X500、X500 Pro、X500 Pro Max三款機型,起售價分別為5499元、6499元、6999元。 發佈會上,vivo副總裁、產品副總裁黃韜宣佈該系列是vivo影像進入下一個10年的開篇之作,並首次完整落地藍圖動態影像技術棧。 系統層面,OriginOS 7升級了不少AI個性化功能,比如用戶上傳一張寵物照片,AI即可生成高精度的3D建模萌寵互動主題。
公眾號插圖、秋招物料、潮玩設計,實測商湯SenseNova U1 Pro:生圖模型走向真實任務交付
作者 | 畢偉豪 編輯|漠影 時常會有人感慨,各種生圖模型讓人眼花繚亂,但一到真正交稿時,還是免不了反覆“抽卡”。好不容易挑到一張滿意的圖,改個字、換個元素,又得重新開始。 抽到一張好看的圖,和完成一項工作,畢竟不是一回事。 在真實工作中,做一張圖往往只是任務的一部分:公眾號文章需要封面和多張配圖,企業招聘需要海報、易拉寶、摺頁等一整套物料,設計過程中還可能隨時需要改文字、換人物服裝、調整局部元素。 這也意味著,辦公場景中的生圖需求,對模型提出的要求已經不只是畫面效果。

用 AI 造謠再收費刪帖:自媒體博主敲詐科技企業 230 萬元被抓
今年以來,上海警方共偵破涉企謠言案件百餘起,依法清理涉企不實信息 8.7 萬餘條;累計偵破涉企黑客類案件 68 起,抓獲犯罪嫌疑人 210 餘名。上海警方重點介紹了一起故意製造企業負面輿情、實施敲詐勒索的案件:犯罪嫌疑人針對一家剛剛宣佈獲得融資的科技企業,連續發佈十餘篇不實文章持續抹黑造謠,敲詐 230 萬元。