HN 日本語サマリー

← 一覧へ戻る
AI・機械学習

GigaToken: 言語モデルのトークン化を約1000倍高速化

GigaToken: ~1000x faster Language model tokenization (github.com)

565 pointsby syrusakbary114 コメント

要約

GigaTokenは、HuggingFaceのトークナイザーと比較して約1000倍高速な、言語モデル向けの新しいトークナイザーライブラリです。既存のHuggingFace TokenizersやTiktokenとの互換性モードも提供しつつ、Rustによるネイティブ実装でGB/sのスループットを実現します。これにより、大規模なテキストデータの処理速度が劇的に向上します。

全文翻訳

GigatokenはHuggingFaceのトークナイザーよりも約1000倍高速で、ドロップイン置換可能です。テキストデータをGB/sでトークン化しましょう!HFトークナイザーとtiktokenは既にマルチスレッドRustで動作していることに注意してください!Gigatokenとは?Gigatokenは言語モデリングにおいて最も高速なトークナイザーです。幅広いCPUハードウェアと、ほぼ全ての一般的に使用されるトークナイザーをサポートしています。詳細なスループット数については、ベンチマークセクションを参照してください。インストールpip install gigatoken使用方法Gigatokenは、独自のAPIを使用するか、HuggingFace TokenizersまたはTiktokenとの互換モードで使用できます。互換モード(最も簡単)import gigatoken as gt # 既存のHuggingFace Tokenizersの使用法から最小限の変更(互換モード)hf_tokenizer = ... tokenizer = gt.Tokenizer(hf_tokenizer).as_hf() # tokenizerはhf_tokenizerと同じコンテキストで使用できます tokens = tokenizer.encode_batch(["This is a test string", "And here is another"]) # またはtiktokenと併用 tiktokenizer = ... tokenizer = gt.Tokenizer(tiktokenizer).as_tiktoken() # 既存のtiktokenトークナイザーのように動作します tokens = tokenizer.encode_batch(["This is a test string", "And here is another"]) この設定では、HuggingFace Tokenizersで得られる出力と完全に一致するように、かなりの労力が費やされていますが、パフォーマンスの低下は無視できません。それでも、Gigatoken APIで得られる1000倍の速度には及ばないものの、全体的に大幅に高速なパフォーマンスが期待できます。Gigatoken API(最速)import gigatoken as gt tokenizer = gt.Tokenizer("Qwen/Qwen3-8B") # HFモデル名を受け入れます file_source = gt.TextFileSource(["owt_train.txt"], separator=b"<|endoftext|>") tokens = tokenizer.encode_files(file_source) Gigatoken APIを使用すると、Rust実装が直接データを読み込み、可能な限りオーバーヘッドをスキップしながら、最大の並列処理を可能にします。このAPIを介してPythonのデータ構造を渡すと、Pythonからの読み込みのオーバーヘッドが発生することに注意してください。ベンチマークowt_train.txt(11.9 GB)でのエンコードスループット — AMD EPYC 9565 72コアプロセッサ x 2ソケット(144コア)Tokenizer gigatoken HF tokenizers tiktoken vs HF vs tiktoken GPT-2 24.53 GB/s 24.8 MB/s 36.0 MB/s 989× 681× Phi-4 24.00 GB/s 29.9 MB/s — 801× — GPT-OSS 23.96 GB/s 49.7 MB/s 42.8 MB/s 482× 560× OLMo 2 / 3 23.06 GB/s 27.7 MB/s — 833× — Nemotron 3 22.79 GB/s 49.4 MB/s — 462× — Qwen 3 22.16 GB/s 34.2 MB/s — 648× — Llama 3 / 3.1 / 3.2 22.15 GB/s 48.5 MB/s — 457× — GLM 5 20.97 GB/s 74.8 MB/s — 280× — Llama 3.3 20.82 GB/s 48.3 MB/s — 431× — Llama 4 20.77 GB/s 72.7 MB/s — 286× — GLM 4 20.61 GB/s 72.3 MB/s — 285× — Phi-4-mini 20.05 GB/s 27.6 MB/s — 726× — DeepSeek V3 / R1 / V4 19.69 GB/s 26.2 MB/s — 750× — Qwen 2 / 2.5 19.12 GB/s 27.7 MB/s — 691× — Kimi K2 18.85 GB/s — — — — Qwen 3.5 / 3.6 15.49 GB/s 27.7 MB/s — 558× — Gemma 4 4.82 GB/s 334.1 MB/s — 14× — ModernBERT 4.18 GB/s 26.9 MB/s — 155× — Mistral 7B v0.3 3.57 GB/s 354.7 MB/s — 10× — TinyLlama / Phi-3 (Llama 2) 3.48 GB/s 323.6 MB/s — 11× — CodeLlama 3.47 GB/s 347.4 MB/s — 10.0× — Gemma 3 3.43 GB/s 357.2 MB/s — 9.6× — Gemma 1 2.51 GB/s 342.2 MB/s — 7.3× — owt_train.txt(11.9 GB)でのエンコードスループット — Apple M4 Max(16コア)Tokenizer gigatoken HF tokenizers tiktoken vs HF vs tiktoken GPT-2 8.79 GB/s 6.9 MB/s 62.8 MB/s 1,268× 140× Nemotron 3 7.82 GB/s 10.9 MB/s — 715× — Phi-4 7.76 GB/s 7.7 MB/s — 1,012× — Llama 3 / 3.1 / 3.2 7.60 GB/s 11.2 MB/s — 676× — OLMo 2 / 3 7.56 GB/s 5.8 MB/s — 1,299× — Llama 3.3 7.50 GB/s 15.7 MB/s — 479× — Phi-4-mini 6.97 GB/s 7.2 MB/s — 964× — Kimi K2 6.88 GB/s — — — — Llama 4 6.81 GB/s 11.6 MB/s — 590× — Qwen 2 / 2.5 6.37 GB/s 5.8 MB/s — 1,105× — Qwen 3 6.36 GB/s 6.9 MB/s — 918× — Qwen 3.5 / 3.6 6.31 GB/s 6.3 MB/s — 994× — GPT-OSS 6.20 GB/s 20.2 MB/s 87.2 MB/s 306× 71× GLM 4 6.17 GB/s 15.8 MB/s — 392× — DeepSeek V3 / R1 / V4 5.68 GB/s 7.2 MB/s — 788× — GLM 5 5.55 GB/s 12.2 MB/s — 456× — ModernBERT 2.64 GB/s 5.8 MB/s — 452× — Mistral 7B v0.3 1.99 GB/s 95.1 MB/s — 21× — Gemma 4 1.82 GB/s 85.2 MB/s — 21× — CodeLlama 1.73 GB/s 80.2 MB/s — 22× — TinyLlama / Phi-3 (Llama 2) 1.69 GB/s 80.1 MB/s — 21× — Gemma 1 1.42 GB/s 85.7 MB/s — 17× — Gemma 3 1.38 GB/s 82.2 MB/s — 17× — owt_train.txt(11.9 GB)でのエンコードスループット — AMD Ryzen 7 9800X3D 8コアプロセッサ(16コア)Tokenizer gigatoken HF tokenizers tiktoken vs HF vs tiktoken GPT-2 6.27 GB/s 59.0 MB/s 92.1 MB/s 106× 68× Phi-4 6.09 GB/s 55.4 MB/s — 110× — OLMo 2 / 3 6.06 GB/s 55.4 MB/s — 109× — Phi-4-mini 5.80 GB/s 54.6 MB/s — 106× — GPT-OSS 5.68 GB/s 79.6 MB/s 112.7 MB/s 71× 50× Qwen 3 5.34 GB/s 54.4 MB/s — 98× — Qwen 2 / 2.5 5.30 GB/s 51.7 MB/s — 103× — Llama 3.3 5.26 GB/s 79.9 MB/s — 66× — Llama 3 / 3.1 / 3.2 5.24 GB/s 79.5 MB/s — 66× — Kimi K2 5.23 GB/s — — — — Qwen 3.5 / 3.6 5.22 GB/s 51.6 MB/s — 101× — Nemotron 3 5.20 GB/s 79.0 MB/s — 66× — GLM 5 5.05 GB/s 79.5 MB/s — 63× — GLM 4 5.04 GB/s 79.5 MB/s — 63× — Llama 4 5.03 GB/s 78.2 MB/s — 64× — DeepSeek V3 / R1 / V4 4.21 GB/s 51.6 MB/s — 82× — ModernBERT 2.84 GB/s 52.1 MB/s — 54× — Mistral 7B v0.3 1.47 GB/s 91.6 MB/s — 16× — Gemma 4 1.45 GB/s 78.8 MB/s — 18× — CodeLlama 1.38 GB/s 85.2 MB/s — 16× — TinyLlama / Phi-3 (Llama 2) 1.37 GB/s 84.9 MB/s — 16× — Gemma 1 1.14 GB/s 84.9 MB/s — 13× — Gemma 3 1.12 GB/s 83.0 MB/s — 13× — ベンチマーク詳細OWT(openwebtext)は、CommonCrawlドキュメントから抽出されたテキストを大まかに代表しているため選択されました。Gigatokenはファイル全体を分割せずにエンコードするため、他のトークナイザーよりも多くの作業を行い、分割境界を見つけ、自動的に並列化します。HuggingFaceトークナイザー(encode_batch_fast)は最初の100 MBを取得し、tiktoken(encode_ordinary_batch)は最初の1 GBを取得しますが、どちらも<|endoftext|>で事前に分割されています。これは、比較対象のトークナイザーはいずれもキャッシュを行わないため、処理中の速度がおおよそ均一であるため公平です。Tiktokenの行は、現在公式にサポートされているトークナイザーのみが埋められています。最も遅い行はSentencePieceベースのトークナイザーであり、Gigatokenではあまり最適化されていません。各行は、代表的なリポジトリで測定された、1つの異なるトークナイザー(同一の語彙/マージ/プリトイケナイザー)です。ここに表示されていないトークナイザーは、おそらく既存のトークナイザーに基づいています。例:Llama 3 / 3.1 / 3.2 — Llama 3 / 3.1 / 3.2、DeepSeek-R1-Distill-Llama、Hermes 3、Saiga、その他のLlama-3ファインチューン Llama 3.3 — Llama 3.3、Llama-3.1-Nemotron-Nano-VL、SmolLM3、Kanana 1.5、jina-embeddings-v5、Ultravox Qwen 2 / 2.5 — Qwen 2および2.5(CoderおよびVLを含む)、Qwen3-Coder、Qwen3-VL、DeepSeek-R1 Qwen蒸留、MiMo V2.5、MiniCPM-o 2.6、InternVL3 Qwen 3 — Qwen 3(EmbeddingおよびRerankerを含む)、Qwen2.5-Omni、Qwen3-VL-Embedding、MiMo V2.5 Pro、jina-reranker-m0、pplx-embed、MOSS-TTS、Zeta DeepSeek V3 / R1 / V4 — DeepSeek V3 / V3.1 / V3.2、R1、V4 FlashおよびPro、DeepSeek-VL2 GLM 4 — GLM 4.1V、4.5、および4.7 GLM 5 — GLM 5 / 5.2およびGLM-4.7-Flash Nemotron 3 — Nemotron 3 Nano、Super、およびUltra Kimi K2 — Kimi K2 / K2.5 / K2.6 / K2.7、Kimi-Linear、Kimi-VL、Moonlight Phi-4-mini — Phi-4-miniおよびPhi-4-multimodal TinyLlama / Phi-3 (Llama 2) — TinyLlama、Phi-3-mini、Phi-3.5-miniおよびPhi-3.5-vision(Llama 2語彙) Gemma 3 — Gemma 3(270M–27B)およびEmbeddingGemma Gemma 4 — Gemma 4(dense、MoE、およびEシリーズ)およびDiffusionGemma FAQ Q: 特定のCPUとトークナイザーのために過剰に最適化しましたか?なぜそんなに速いのですか?いいえ、それらのすべての組み合わせに対して過剰に最適化しました!結果はCPU(最新のx86およびARM)および特定のトークナイザー全体で非常に一貫しています。主な改善点は、SIMDを使用して正規表現エンジン(プリトイケナイゼーション)にアウトソースされる実装を大幅に最適化し、分岐を最小限に抑え、その他のトリックを使用すること、およびプリトイケンのマッピングのキャッシュを大幅に最適化することです(単語が以前に見られた場合、そのエンコードされたトークンを効率的に検索します)。キャッシュは、キャッシュが非常に速く成長し、プリトイケンの分布が非常にロングテールであるため、このドメインでは非常に難しい問題です。一部のゲインは、インタラクションの最小化からも得られます。