Hugging Face tokenizers v1 リリースノート

Hugging Face は tokenizers v1 のリリース候補版をリリースしました。このバージョンは、モデルの速度とワークロードが拡大する中で、トークン化がボトルネックにならないように、極限のパフォーマンス最適化を重視しています。Apple M4 Max では、v1 は 10 のモデルファミリーで v0.23 より 3 ~ 30 倍高速にテキストをエンコードしており、特に GPT-2 で最も顕著な向上が見られます。

コア技術的最適化

v1 のパフォーマンス向上は、計算量の大部分が発生するモデル段階に特化したトークン化パイプラインの完全な再設計によって実現されています。このライブラリは v0.23 と完全に互換性があり、同一のトークン ID、API、語彙を生成します。

SIMD を活用した分割(Bitcannon)

BPE モデルは通常、入力テキストをプリトークンに分割するために正規表現を使用します。v1 では汎用的な正規表現エンジンの代わりに、「bitcannon」と呼ばれる手書きの分割関数を導入しました。この関数は SIMD(Single Instruction, Multiple Data)命令を使用しており、入力バイトを並列なビットストリームとして扱い、レジスタ全体でブール演算を実行して境界を特定します。1 回のレジスタ操作で 64 バイトを処理できます。このアプローチは、GPT-2、cl100k、o200k、Tekken、DeepSeek を含む、ほとんどのバイトレベル BPE モデルに適用可能です。

ワードキャッシュ

重複した計算を回避するために、v1 ではスレッドローカルなワードキャッシュを実装しました。BPE は任意のプリトークンに対して決定論的なトークン ID を生成するため、ライブラリはプリトークンのバイトを最終的な ID にマッピングするようになりました。テキスト内で単語が繰り返された場合、トークナイザーはマージ処理を完全にスキップし、キャッシュから結果を取得します。

アロケーションフリーのマージループ

BPE マージループは、繰り返しのメモリ割り当てを排除するように再設計されました。主な変更点は以下の通りです:

  • スクラッチバッファ: マージの作業セットは、呼び出し元が所有するスクラッチバッファに配置されるため、ループ中にアロケータにアクセスする必要がなくなりました。
  • イントラスイブな双方向リスト: シンボルはフラットな配列に格納され、位置でリンクされます。これにより、マージはデータの移動ではなく 2 つのインデックスの更新で実現できます。
  • 整数比較: 候補ペアは 64 ビット値にパックされ、上位ビットにマージランクが格納されます。これにより、分岐なしで単純な整数比較で次のマージを検出できます。

パフォーマンスとスケーラビリティ

tokbench リポジトリを用いたベンチマークでは、v1 は 8 つのワーカーで線形スケーリングの 76% を達成しています。また、バイナリサイズと依存関係のオーバーヘッドを削減するため、ライブラリはワークスペース構造に再設計されています:

  • tk-encode:エンコードに必要なランタイム。
  • tk-serialize、tk-convert、tk-train:特定の機能が必要な場合にのみリンクされるオプションのクレート。

実装ロードマップ

リリース候補版の機能

コアのエンコード高速化に加え、現在のリリース候補版には以下の機能が含まれます:

  • 再利用可能なバッファに直接バイトを書き込むことで、中間文字列を回避する並列デコード。
  • Node.js バインディング。
  • role_to_token のサポート。
  • 複数のプリトークンスパンを 1 回の呼び出しで処理するバッチモデル呼び出し。

v1.0.0 およびそれ以降への道筋

安定版の 1.0.0 リリースに向けて、以下のアップデートが予定されています:

  • 統一されたエンコード: 学習検証時に tk-encode を使用して、学習と推論の間に一貫性を確保。
  • バインディングの改善: ロックの削減と free-threaded CPython のサポートを実現した、よりシンプルな Python バインディング。また、llama.cpp および ExecuTorch 用の推論専用 C/C++ バインディングも提供予定。
  • 最適化されたメタデータ: オフセットとマスクの計算をオプションとして提供し、トークン ID のみのパスを軽量化。

1.0.0 リリース後、Hugging Face は tok-devices というオプションコンポーネントの検討を進める予定です。これは GPU を活用したエンコードとバッチデコードを可能にし、大規模なバッチにおいてテキストとトークン ID をデバイス上に保持する仕組みです。

Sources