<?xml version="1.0" encoding="utf-8" standalone="yes"?><rss version="2.0" xmlns:atom="http://www.w3.org/2005/Atom" xmlns:content="http://purl.org/rss/1.0/modules/content/"><channel><title>LLM Infrastructure on Hypho - AI Agent 技术博客</title><link>https://blog.hypho.cn/tags/llm-infrastructure/</link><description>Recent content in LLM Infrastructure on Hypho - AI Agent 技术博客</description><image><title>Hypho - AI Agent 技术博客</title><url>https://blog.hypho.cn/papermod-cover.png</url><link>https://blog.hypho.cn/papermod-cover.png</link></image><generator>Hugo -- 0.148.2</generator><language>zh-cn</language><lastBuildDate>Fri, 24 Jul 2026 10:02:54 +0800</lastBuildDate><atom:link href="https://blog.hypho.cn/tags/llm-infrastructure/index.xml" rel="self" type="application/rss+xml"/><item><title>GigaToken 能把 LLM Tokenization 做到 GB/s 吗？先别急着替换 tiktoken</title><link>https://blog.hypho.cn/posts/gigatoken-llm-tokenization-gb-s-production/</link><pubDate>Fri, 24 Jul 2026 10:02:54 +0800</pubDate><guid>https://blog.hypho.cn/posts/gigatoken-llm-tokenization-gb-s-production/</guid><description>GigaToken 在 Hacker News 上因为“比 HuggingFace Tokenizers 快约 1000 倍”的基准引发关注。本文从 LLM tokenization 的工程瓶颈、Rust/SIMD 优化、Python 数据传递开销、与 tiktoken/HuggingFace 的兼容取舍出发，判断它更适合哪些生产场景。</description><content:encoded><![CDATA[<p>Tokenization 这件事平时很不起眼，直到你真的开始处理 TB 级训练语料、做离线 embedding、或者给日志回放系统补算 token 成本，才会发现它不是“模型前面那一点点预处理”。</p>
<p>我看到 <a href="https://news.ycombinator.com/item?id=49010167">GigaToken 在 Hacker News 上拿到 600 多分</a>时，第一反应其实不是“又一个性能神话”，而是：如果它的数字成立，LLM 数据管线里有一类被我们默认接受的慢步骤，可能确实该重新算账了。</p>
<p>项目本身很直接。<a href="https://github.com/marcelroed/gigatoken">GigaToken</a> 是一个 Rust 写的语言模型 tokenizer，README 里给出的目标是“Language model tokenization at GB/s”，并且提供两种用法：一种是自己的高速 API，让 Rust 直接读文件；另一种是兼容 HuggingFace Tokenizers 或 tiktoken 的包装 API。作者在基准里声称，在 144 核 AMD EPYC 机器上，GPT-2 tokenizer 可以跑到 24.53 GB/s，而 HuggingFace Tokenizers 是 24.8 MB/s，tiktoken 是 36.0 MB/s；在 Apple M4 Max 上，GPT-2 也能到 8.79 GB/s。</p>
<p>这个数量级很夸张，所以我不建议只看“1000x”这个标题。</p>
<p>更有价值的问题是：它到底优化了什么？以及这些优化在你的生产链路里会不会被别的瓶颈吃掉？</p>
<h2 id="tokenization-为什么会慢">Tokenization 为什么会慢</h2>
<p>LLM tokenization 通常不是简单的 <code>split()</code>。以 BPE/Byte-level BPE 这类 tokenizer 为例，流程大概包括预切分、字节或 unicode 归一、查表、merge ranking、特殊 token 处理，以及把结果打包成 Python 侧可消费的数据结构。很多工程团队会默认使用 <a href="https://github.com/huggingface/tokenizers">HuggingFace Tokenizers</a> 或 <a href="https://github.com/openai/tiktoken">OpenAI tiktoken</a>，它们本身已经不是慢吞吞的纯 Python 实现，而是 Rust/C++ 等底层实现加 Python binding。</p>
<p>问题在于，底层快不代表整条路径快。</p>
<p>如果你的输入是一堆 Python 字符串列表，tokenizer 即使内部很快，也要不断跨 Python/Rust 边界、创建对象、复制数据、返回嵌套 list。用人话说就是：真正拖慢你的不一定是“怎么切词”，而是“为了切词，把数据搬来搬去”。</p>
<p>GigaToken 的 README 其实把这个边界说得很清楚：兼容模式可以少改代码，但最高性能来自自己的 API，尤其是 <code>TextFileSource</code> 这种让 Rust 直接读文件的方式。也就是说，它不是魔法，而是把 tokenization 从“Python 调库处理一批字符串”改成“底层 runtime 直接吃大文件并行处理”。</p>
<p>这点对生产判断很关键。</p>
<p>如果你的 workload 是在线请求，每次只 tokenize 用户输入的几 KB 文本，网络、排队、模型推理、数据库查询通常才是大头。GigaToken 在这里可能不会让端到端延迟出现肉眼可见的变化。反过来，如果你在做预训练数据清洗、RAG 文档批量入库、embedding 回填、审计日志重算、或者每天给海量 prompt 计算 token 账单，tokenization 就可能从“隐形步骤”变成“资源黑洞”。</p>
<p>这也是我认为它值得写的原因：它不是又一个 Agent 框架，而是打到了 LLM 基础设施里一个非常具体、可测量的成本点。</p>
<h2 id="兼容替换不等于无脑替换">“兼容替换”不等于“无脑替换”</h2>
<p>GigaToken 提供了 HuggingFace 和 tiktoken 兼容模式，这对落地很友好。比如你已有的代码依赖 <code>encode_batch</code>，理论上可以用 <code>gt.Tokenizer(hf_tokenizer).as_hf()</code> 包一层；如果依赖 tiktoken，也可以走 <code>as_tiktoken()</code>。</p>
<p>但我会把这件事拆成两层看。</p>
<p>第一层是输出一致性。Tokenizer 一旦用于训练、评测或计费，就不能“差不多”。一个特殊 token 的处理差异、一个 unicode 边界的差异，都可能让训练样本长度、截断位置、成本统计全部错位。GigaToken README 说兼容模式投入了不少工作来保证输出和 HuggingFace Tokenizers 一致，但这类承诺在生产里仍然要自己抽样验证，尤其是中文、emoji、代码、日志、混合语言、特殊控制 token。</p>
<p>第二层是性能收益。兼容模式为了保持现有 API，仍然要付出 Python 数据结构传递的成本，所以 README 也明确说它“不一定有 1000x”。说白了就是：你越想少改代码，越不可能拿满性能红利；你越愿意把数据管线改成文件/流式批处理，越可能接近它的设计上限。</p>
<p>我会建议这样试：先不要替换线上 tokenizer，而是在离线批处理任务里做影子对比。选 100 万到 1000 万条真实文本，分别跑原 tokenizer 和 GigaToken，比较三件事：token 序列是否完全一致、吞吐是否提升、CPU/内存/IO 哪个先打满。只有当这三件事都过关，再考虑把它纳入正式 pipeline。</p>
<h2 id="它更像数据基础设施工具不是推理加速器">它更像数据基础设施工具，不是推理加速器</h2>
<p>这里容易有一个误解：tokenization 快了，模型推理就会快很多。</p>
<p>多数情况下不会。</p>
<p>推理链路里，尤其是长输出任务，主要成本仍然在 prefill/decode、KV cache、显存带宽和调度上。之前我在写 <a href="https://blog.hypho.cn/posts/dflash-ddtree-speculative-decoding-llm-inference/">DFlash speculative decoding</a> 时强调过，真正能影响生成速度的，往往是解码阶段的算法和内存访问模式；tokenizer 只是入口。你把入口从 30 MB/s 提到几 GB/s，可能只是在 2 秒请求里省下几十毫秒。</p>
<p>但数据链路完全不同。RAG 入库、离线评测、语料清洗、训练样本打包，这些任务的共同点是：文本量巨大，模型推理不一定在同一条路径上，tokenization 本身就可能占据大量 CPU 时间。对这类场景，GigaToken 的价值更接近一个高性能 ETL 组件。</p>
<p>这和本地模型部署也有关。很多团队搭了 <a href="https://blog.hypho.cn/posts/local-llm-ollama-llama-cpp/">Ollama / llama.cpp 这类本地 LLM 环境</a> 后，很快会遇到另一个问题：模型能跑了，但围绕模型的数据准备、缓存、评测、成本统计仍然是散的。Tokenizer 加速不是最性感的部分，却是把“能跑 demo”变成“能稳定处理数据”的一块砖。</p>
<h2 id="我会怎么判断能不能上生产">我会怎么判断能不能上生产</h2>
<p>如果我是团队里负责这条链路的人，我不会被“1000x”说服，也不会因为它新就排斥。我会用几个很朴素的标准判断。</p>
<p>首先，看项目是否真实活跃。GitHub API 显示 <code>marcelroed/gigatoken</code> 是 Rust 项目，最近 push 在 2026 年 7 月 23 日，star 已超过 2000；仓库包含 Rust/Python 工程文件和 README，不是白皮书阶段。这至少说明它不是一个只有概念的页面。</p>
<p>其次，看你的数据形态。GigaToken 最适合大文件、大批量、重复分布明显的文本。HN 评论里也有人提到，它的优化方向包括 SIMD 化预切分、减少分支、缓存 pretoken 映射、降低 Python 交互成本。这里我引用 HN 是因为它补充了 README 之外的实现解释，但最终仍应以代码和你自己的 benchmark 为准。</p>
<p>再次，看可回滚性。Tokenizer 是基础设施里很“低层”的东西，一旦出错会污染上游训练数据或下游统计。我的建议是保留原 tokenizer 作为 oracle：新旧双跑一段时间，发现不一致直接报警；先用于离线任务，再进入线上请求；先处理非关键数据，再处理训练样本或计费数据。</p>
<p>最后，看维护面。引入一个高性能 Rust 扩展，意味着你要关心 wheel、平台、CPU 指令集、容器镜像、CI 构建和安全更新。如果团队没有能力处理这些，继续用成熟的 HuggingFace Tokenizers/tiktoken 可能更稳。性能优化不是免费的，只是成本从运行时转移到了工程维护上。</p>
<h2 id="结论值得试但别把它当成万能加速按钮">结论：值得试，但别把它当成万能加速按钮</h2>
<p>GigaToken 真正有意思的地方，不是“比谁快 1000 倍”这个营销味很重的数字，而是它提醒我们：LLM 基础设施里还有很多默认被忽略的 CPU 路径。模型越来越大，大家都盯着 GPU、KV cache、推理调度，但数据进入模型之前的那段路，也可能浪费了大量机器时间。</p>
<p>我的判断是：如果你有大规模离线 tokenization、RAG 批量入库、训练语料预处理、prompt 成本回放这类需求，GigaToken 值得拉下来做一次严肃 benchmark；如果你只是普通在线聊天应用，先别急着替换 tiktoken，收益大概率不在最痛的地方。</p>
<p>工程上最怕的是把工具的最佳基准，当成自己系统的真实收益。</p>
<p>GigaToken 可以很快，但你要先确认：你的瓶颈，真的在 tokenization。</p>
]]></content:encoded></item></channel></rss>