Hugging Face、tokenizers v1のリリース候補を公開 v0.23比で3〜30倍の高速化
tokenizers v1: encode, decode and scaling, measured
Hugging Faceはtokenizers v1のリリース候補をcrates.ioで公開した。Apple M4 Maxの単一スレッドでv0.23より3〜30倍高速にエンコードし、8ワーカーでは線形の76%でスケールする。トークンIDはv0.23と同一で、APIも変わらない。
高速化は複数の変更の組み合わせによる。正規表現エンジンの代わりに、SIMD命令でビット列演算により分割位置を求めるbitcannonを採用した。繰り返し出る単語はスレッドローカルのキャッシュで再マージを省き、マージループは呼び出し側が持つスクラッチバッファを使ってアロケータに触れない。プリトークンのバッチを1回のモデル呼び出しで処理する点も効いている。ただしbitcannonは対応する分割パターンに限られ、対象外のトークナイザは従来の正規表現経路のままとなる。
計測は10のモデルファミリで行われ、最も遅い側がt5-base、最も速い側がgpt2である。ベンチマークはtokbenchリポジトリで再実行でき、各エンジンで同一のタイミングループを使う、語彙のロードを除外する、出力IDのFNV-1aハッシュをベースラインと照合する、物理コアに固定する、といった条件を設けている。同じ文書の繰り返しエンコードと別々の文書のストリームではキャッシュの効き方が違うため、主要な結果は別々の文書で測定したと説明している。
導入は `cargo add tokenizers --pre` で行える。エンコードだけが必要なら `--no-default-features --features http` でトレーニング実装を外せる。バッチ処理は `encode_batch` がコア間でスケールする。Pythonバインディングは同じコードを包むが、呼び出しごとのオーバーヘッドがあり、今回の計測には含まれない。
今後は1.0.0までに対応モデルファミリの拡大、オフセットとマスクの任意化、正規化処理の見直し、Pythonバインディングの簡素化、ExecuTorchやllama.cpp向けの推論専用C・C++バインディングなどを予定している。1.0.0以降はGPUでのエンコードとバッチデコードを検討しており、リリース候補が安定した後はtransformersライブラリなどへの反映に進む。
出典: Hugging Face Blog · huggingface.co