- さまざまなCPUと広く使われているトークナイザーに対応し、テキストをGB/s単位で処理するTiktokenおよびHuggingFace Tokenizersの代替ツール
- 正規表現エンジンが担っていた事前トークン化をSIMDで最適化し、分岐・スレッド通信・Pythonとの相互作用を減らしつつ、過去に見た単語のトークンマッピングを効率的にキャッシュする
- 11.9GBのOpenWebTextベンチマークで、GPT-2のスループットはAMD EPYC 9565で24.53GB/s、Apple M4 Maxで8.79GB/s、Ryzen 7 9800X3Dで6.27GB/sを記録
- HuggingFace・Tiktoken互換モードは既存コードをほぼそのまま維持できるが、出力一致のコストにより性能は低下し、Rustがファイルを直接読むGigatoken APIが最大の並列性と最高速度を提供する
- WordPieceとファイル出力はまだ未対応で、SentencePiece最適化とWindows検証も不足しているため、現時点ではBPEトークナイザーとLinux・macOSまたはWSL環境により適している
対応範囲と使い方
- Gigatokenは言語モデル向けの高速トークナイザーで、現代的なx86・ARM CPUと、ほぼすべての一般的なトークナイザーを対象としている
pip install gigatokenでインストールし、独自APIとHuggingFace Tokenizers・Tiktokenの互換モードを提供する- 互換モードは既存のトークナイザーをラップし、それぞれ
.as_hf()または.as_tiktoken()に変換する- HuggingFace Tokenizersと出力が正確に一致するよう、相当な処理を適用している
- 互換性処理には無視しにくい性能コストがあり、独自APIの約1,000倍高速化には及ばないが、全体として既存実装より高速
- 独自APIは
"Qwen/Qwen3-8B"のようなHuggingFaceモデル名とTextFileSourceを受け取り、ファイルを直接エンコードする- Rust実装がデータを直接読み取り、不要なオーバーヘッドを避けて並列性を最大化する
- Pythonのデータ構造を渡すと、Python側でデータを読むコストが残る
速度を高める実装
- 最大の改善は、通常は正規表現エンジンに任せる事前トークン化をSIMDベースで直接高度化した点から来ている
- 分岐を最小化し、すでに見た単語のエンコード済みトークンを探す事前トークンマッピングキャッシュを重点的に最適化している
- キャッシュは急速に大きくなり、事前トークン分布がロングテール形状のため扱いが難しい
- Pythonとの相互作用およびスレッド間通信を減らし、追加の性能を確保している
- 特定のCPUや単一のトークナイザーに合わせた実装ではなく、現代的なx86・ARM CPUと複数のトークナイザーの組み合わせをそれぞれ最適化しており、結果もCPUとトークナイザー全般で一貫している
11.9GB OpenWebTextベンチマーク
- AMD EPYC 9565 144コア環境でのGPT-2のスループットは24.53GB/sで、HuggingFace Tokenizersの24.8MB/sより989倍、Tiktokenの36.0MB/sより681倍高速
- 主要なBPE系はおおむね約15.49〜24.00GB/sを記録
- SentencePieceベースの項目は約2.51〜4.82GB/sで相対的に遅い
- Apple M4 Max 16コアでGPT-2は8.79GB/sで、HuggingFace比1,268倍、Tiktoken比140倍
- OLMo 2/3はHuggingFace比1,299倍、Qwen 2/2.5は1,105倍を記録
- AMD Ryzen 7 9800X3D 16コアでGPT-2は6.27GB/sで、HuggingFace比106倍、Tiktoken比68倍
- 主要なBPE系は約4.21〜6.09GB/s、相対的に最適化が進んでいない系統は約1.12〜2.84GB/s
測定条件と解釈
- OWT(OpenWebText)はCommon Crawl文書を抽出して得られるテキストをおおよそ代表するものとして、ベンチマークデータに選ばれた
- Gigatokenはファイル全体を事前に分割せずに処理するため、分割境界の探索と自動並列化まで直接実行する
- 比較対象は
<|endoftext|>基準で事前に分割されたデータを処理する- HuggingFaceの
encode_batch_fastは先頭100MBを使用 - Tiktokenの
encode_ordinary_batchは先頭1GBを使用 - どちらの実装もキャッシュしないため、処理中の速度はおおむね一定であり、この比較条件を使用している
- HuggingFaceの
- Tiktokenの結果は公式対応トークナイザーにのみ含まれる
- 各行は、語彙・マージ・事前トークナイザーが同一の、1つの固有トークナイザーを表す
- Llama、Qwen、DeepSeek、GLM、Nemotron、Kimi、Phi、Gemma系の複数バージョンと派生モデルが同じトークナイザー行にまとめられている
- 最も遅い項目は、Gigatokenでまだ十分に最適化されていないSentencePieceベースのトークナイザー
対応可否の検証と大規模処理
- インストールなしで
uvx --with tokenizers gigatoken benchコマンドにより、HuggingFaceモデルリポジトリのトークン化を検証し、時間を測定できる - GPT-2の検証例では、20,401件の文書の出力が一致した
- Apple M4 Maxでは11,920.51MBを1.432秒、8,327.05MB/sで処理し、HuggingFaceより1,353.13倍高速だった
- AMD EPYC 9565では同じデータを0.486秒、24,532.45MB/sで処理し、989.21倍高速だった
- EPYCの処理率なら、130兆トークン規模のCommon Crawl全体を6.5時間未満でトークン化できる
- 例ではStanford CS336 OWTサンプルを使用し、CLIはデフォルトで検証とHuggingFace比較にファイル先頭100MBを利用する
- macOSでの初回実行はセキュリティ検査のためRustコードが遅くなる可能性があり、正確な測定にはコマンドを2回実行する必要がある場合がある
- 出力不一致や遅いケースはGitHub Issueで報告するよう求めている
既知の制約
- Pythonの反復処理はRustで実行するが、内部のCPythonバージョン別APIより遅いABI3を使用している
- Pythonバージョン別の特化を計画しており、初期実験ではオーバーヘッドが支配的なケースで2倍高速になった
- Gigatoken APIにはまだファイル出力シンクが実装されていない
- WordPieceは対応していない
- SentencePieceベースのトークン化は、一般的なBPEより最適化レベルが低い
- 主にGoogleモデルとBERT系が使うという理由で、現時点での優先度も低い
- Windowsでのテストが十分ではないため、現時点ではWSLの使用を推奨している
AIの使用範囲
- コードベースの大部分はAIなしで直接書かれており、プロジェクトのGit履歴で確認できる
- プロジェクト最終段階ではAIを次の作業に活用した
- ユーザー向けAPIの実装
- より多くのトークナイザー向けの事前トークナイザー一般化・移植と互換性拡大
- パディング、切り詰め、Unicode正規化対応
- AVX512・AVX2・NEON間のSIMD戦略の移植
- 分岐削除と事前トークンキャッシュ階層の改善による最後の約4倍の性能向上
- リファクタリングとコード再利用の改善
1件のコメント
Hacker Newsの反応
「コードの大半はAIなしで自分で書いたし、Git履歴でも確認できる」とのことで、人間のプログラミングは終わったという宣言も色あせる
特定のCPUや1つのトークナイザーだけではなく、最新のx86・ARMと複数のトークナイザーの組み合わせ全体を過剰なくらい最適化して、一貫した性能を得たということ
通常は正規表現エンジンに任せる事前トークン化をSIMDで直接最適化し、分岐を最小化し、さらに既出単語のエンコード結果を高速に引けるよう事前トークンのマッピングキャッシュも改善している。この分野のキャッシュはすぐ巨大化し、分布の裾も長いため扱いが難しい
Pythonとの相互作用やスレッド間通信も最小化している
創造的なプログラミングで信じがたい速度を出す simdjson を思い出す。広く使われれば電力・コスト・炭素排出を大きく減らせるので、Rustクレートも配布してくれたらうれしいし、必要なら自分も手伝いたい
経済性や環境を考えるなら、リクエストのバッチ処理のほうが効果が大きい。最も高価なのはGPU利用率の低下で、処理をバッチ向きに整えれば現状のOAIでも50%節約できる。すべての応答が即時でなくてよいなら、一部は数日待ってもよく、ツール呼び出しはタイムアウトせず、LLM自体には壁時計時間というものがない
リポジトリをクローンして見てみたが、事前トークン化の正規表現置き換えとキャッシュ最適化は一般的にも有用なアプローチだ。トークン化コミュニティ全体がこうした高速化の秘訣を知りたがるはずで、本当に素晴らしい仕事
素晴らしい成果だが、トークン化は通常、推論全体時間の 0.1%未満。ただし、トークン化自体が必要なアプリケーションには非常に有用そう
小さいモデルや高速なGPUほど効果は大きく、READMEに載せる前に追加検証が必要。ベンチマーク出典は fastokens
出典: https://www.gartner.com/en/newsroom/press-releases/2026-07-2...
推論時点より、オフラインの事前学習データ準備でさらに有用に見える。学習コーパスとして数テラバイトのテキストをトークン化するときに時間とコストを節約でき、データセット調整の反復サイクルも短縮できる
実行時間全体の0.1%を占める部分を 1,000倍高速化するために工学力を注ぎ込む姿こそ、いかにもソフトウェア開発者らしい振る舞い
https://x.com/mitchellh/status/2074225453217505494
LLMは1,000倍改善の限界にずっと近いが、基本的なPyTorch演算でさえ単純な書き直しより2倍遅いことは珍しくなく、より良いスケジューリングアルゴリズムが5〜10倍の改善を出すこともある。高速トークン化によって、これまで実現不可能で無視されていた別の機能が開けるかもしれない
グラフの数値を理解しようとしばらく見つめてしまうほど、信じがたい性能
ClickHouseにもまさに必要な機能なので、https://github.com/ClickHouse/ClickHouse/issues/108247 で試してみる予定
READMEはコアあたり性能をもっと強調するとよさそうだし、実際のアルゴリズムには完全ハッシュテーブル照合が役立つのかも気になる
だとすると、推論パイプラインのほかの部分にはまだ1,000倍最適化の余地がどれだけ残っているのか気になってくる