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을 채택했다. 반복해서 나오는 단어는 스레드 로컬 캐시로 재병합을 생략하며, 병합 루프는 호출자가 가진 스크래치 버퍼를 사용해 할당기를 건드리지 않는다. 프리토큰 배치를 한 번의 모델 호출로 처리하는 점도 효과를 내고 있다. 다만 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