tokenizers v1: encode, decode and scaling, measured
Quick Summary
tokenizers v1 출시 후보는 v0.23과 동일한 토큰 ID와 API를 유지하면서, Apple M4 Max의 단일 스레드 인코딩에서 10개 모델 계열에 걸쳐 3~30배의 속도 향상과 8개 작업자에서 선형 확장 대비 76%의 효율을 보고했다.
🖼️ 인포그래픽

🖼️ 4컷 인포그래픽

💡 한 줄 요약
tokenizers v1 출시 후보는 v0.23과 동일한 토큰 ID와 API를 유지하면서, Apple M4 Max의 단일 스레드 인코딩에서 10개 모델 계열에 걸쳐 3~30배의 속도 향상과 8개 작업자에서 선형 확장 대비 76%의 효율을 보고했다.
📌 핵심 요약
- 모델 속도와 처리 규모가 커지면서 토큰화가 데이터 공급의 병목이 될 수 있어, tokenizers v1은 출력·API·어휘·병합 순위를 보존하면서 성능을 개선하는 데 집중했다.
- 주요 변경은 크레이트 분리, SIMD 기반 bitcannon 분할기, 스레드별 단어 캐시, 반복 메모리 할당을 없앤 병합 루프, 사전 토큰 배치 처리, 공유 잠금 대기를 줄인 병렬 처리다.
- Apple M4 Max에서 10개 모델 계열의 단일 스레드 인코딩은 v0.23보다 3~30배 빨랐으며, 최저 향상은 t5-base, 최고 향상은 gpt2였다. 8개 작업자의 확장 효율은 선형 대비 76%였다.
- 벤치마크는 동일한 측정 루프, 로딩 시간 분리, 출력 ID 해시 검증, 공통 검증 항목 비교를 적용했다. 대표 결과는 캐시에 전체가 들어가지 않는 서로 다른 문서를 사용했으며, Python 바인딩의 호출별 오버헤드는 포함하지 않았다.
- bitcannon이 인식하지 못하는 패턴은 기존 정규식 경로를 유지하고, 반복 사전 토큰이 적으면 캐시 이점도 제한된다. Rust 출시 후보는 crates.io에서 제공되며, 1.0.0 이전에 추가 모델을 새 병합 루프로 옮기고 출시 후보 안정화 후 transformers 등으로 개선을 확산할 계획이다.
🧩 주요 포인트
- 동일한 토큰 ID·API와 기존 로딩 범위 유지 → 호환성을 보존하면서 실행 경로와 의존성 구성을 개선하는 전환이다.
- bitcannon의 패턴 지원과 단어 캐시의 적중률에 따른 차이 → 모델 계열과 입력의 반복성에 따라 실제 성능 향상 폭이 달라진다.
- 서로 다른 문서 기반 Rust 측정과 Python 호출 비용 제외 → 3~30배 및 76%라는 결과는 실제 입력·하드웨어·호출 환경을 고려해 해석해야 한다.
🧠 상세 정리
1. 토큰화 병목과 성능 개선의 배경
토큰화는 전통적으로 모델 연산에 비해 계산량이 작아 머신러닝 작업의 주된 병목으로 여겨지지 않았지만, 모델이 빨라지고 처리 규모가 커지면서 상황이 달라지고 있다. 대규모 데이터 학습, 다수의 동시 요청, 긴 입력의 반복 처리는 토크나이저에 부담을 주어 모델에 필요한 데이터 공급을 늦출 수 있다. tokenizers v1은 CPU의 토큰화가 끝나기를 기다리며 GPU가 유휴 상태에 머무는 상황을 줄이기 위해 성능 개선에 집중했다. 저자들은 gigatoken, tiktoken, kitoken, tokie, fastokens, wordchipper, ai-tokenizer 등 오픈소스 프로젝트에서 여러 아이디어를 얻었다고 밝혔다. 또한 IBM, NVIDIA, ExecuTorch 팀의 패치와 다양한 하드웨어 테스트 기여에 감사를 표하며, 이번 개편이 tokenizers에 대한 기여를 촉진하기를 기대했다.
2. 호환성을 유지하는 처리 구조와 모듈 분리
v1의 목표는 v0.23과 동일한 토큰 ID를 생성하고 API, 어휘, 병합 순위를 유지하면서 개선 가능한 실행 부분을 바꾸는 것이다. 라이브러리는 BPE에만 특화되지 않고 기존 버전이 로딩하던 토크나이저를 계속 지원하며, 측정한 10개 모델 계열 중 8개는 BPE, 나머지 2개는 WordPiece와 Unigram을 사용한다. 처리 과정은 소문자화나 유니코드 정규화를 수행하는 정규화, 텍스트를 사전 토큰으로 나누는 사전 토큰화, 토큰과 ID를 생성하는 모델 단계, 특수 토큰을 추가하는 후처리로 구성된다. BPE는 사전 토큰 내부의 인접 쌍을 정해진 순위에 따라 반복 병합하며, 병합은 사전 토큰 경계를 넘지 않는다. 구조적으로는 단일 크레이트를 워크스페이스로 나누어 tk-encode를 필수 런타임으로 두고, tk-serialize·tk-convert·tk-train은 애플리케이션이 필요로 할 때만 연결하도록 했다.
3. bitcannon의 분할 가속과 적용 범위
BPE의 사전 토큰화에 쓰이는 정규식은 토크나이저와 함께 제공되는 고정된 모델 매개변수이므로, 저자들은 매 인코딩마다 범용 정규식 엔진으로 해석할 필요가 없다고 설명한다. 알려진 패턴에는 같은 결과를 내는 전용 분할 함수를 작성하고, 현대 CPU의 SIMD 명령으로 여러 바이트를 한꺼번에 처리할 수 있다. bitcannon은 입력 바이트를 병렬 비트 스트림으로 보고 레지스터 전체에 대한 불리언 연산으로 경계를 결정하며, 레지스터 연산당 64바이트를 처리한다. 원문은 이러한 접근을 텍스트 처리의 Parabix와 JSON 처리의 simdjson에서도 활용하는 아이디어로 연결한다. 다만 이 가속은 패턴을 인식할 수 있어야 적용되며, 지원 문법에 포함되지 않는 토크나이저는 정규식 경로를 유지하므로 해당 분할 가속의 이점을 얻지 못한다.
4. 단어 캐시가 줄이는 반복 병합
실제 텍스트에는 같은 단어가 여러 번 나타나며, BPE는 동일한 사전 토큰에 항상 같은 토큰 ID를 생성하므로 한 번 계산한 결과를 재사용할 수 있다. v1은 사전 토큰의 바이트를 최종 토큰 ID에 대응시키는 스레드 로컬 캐시를 두어, 이후 같은 입력 조각이 나타나면 병합 과정을 건너뛴다. 입력이 길어질 때 고유 단어 수가 전체 단어 수보다 느리게 증가하면 반복 단어의 비중이 높아질 수 있지만, 새로운 단어가 계속 등장하므로 캐시 미스가 완전히 사라지는 것은 아니다. 반대로 반복 사전 토큰이 드문 입력에서는 캐시 조회 비용을 지불하면서도 적중으로 얻는 이득은 작을 수 있다. 원문은 agentic_swe 코퍼스에서 pipeline과 hf-tokenizers를 pipeline-no-cache와 비교하는 tokbench 명령을 제시해 공유 접두사 결과를 재현할 수 있도록 했다.
5. 병합 루프와 스레드별 작업 공간의 재설계
기존 BPE 병합 구현은 호출마다 새 메모리를 할당하고 사전 토큰마다 우선순위 큐를 새로 만들어, 실제 병합 외에도 반복적인 관리 비용을 발생시켰다. v1은 호출자가 소유한 스크래치 버퍼를 재사용하고 사전 할당된 평면 배열 안에 심볼과 양방향 연결 정보를 저장해, 데이터를 옮기는 대신 인덱스를 갱신하도록 바꿨다. 또한 여러 사전 토큰을 하나의 모델 호출로 처리하며, 각 후보 쌍은 병합 순위를 상위 비트에 넣은 단일 64비트 값으로 표현한다. 이에 따라 후보 비교는 정수 비교로 처리하고 병합 불가 상태는 최댓값으로 나타내어, 다음 병합을 찾는 과정의 분기를 없앤다. 병렬 실행에서는 하나의 토크나이저를 여러 스레드가 공유하되 각 스레드가 자체 하위 풀에서 스크래치 버퍼와 단어 캐시를 가져오므로, 단일 잠금에 줄을 서던 대기를 줄인다.
6. 벤치마크의 공정성과 캐시 상태 구분
원문은 벤치마크 설계의 작은 차이가 토크나이저 성능에 큰 차이를 만들 수 있다며, 모든 엔진에 동일한 측정 루프를 적용하고 어휘 로딩 시간은 인코딩과 분리했다. 출력 ID에 대한 FNV-1a 해시가 기준과 정확히 일치해야 하며, 중앙값은 모든 엔진이 실행하고 검증한 공통 측정 항목만으로 계산했다. 반복 측정마다 새 프로세스에서 전체 항목을 실행하고, 작업자는 SMT 형제 스레드가 아닌 서로 다른 8개 물리 코어에 고정하며, 별도 작업으로 호스트 간 변동도 측정했다. 특히 같은 문서를 반복 인코딩하면 문서 전체가 캐시에 반영된 상태를 측정할 수 있지만, 서로 다른 문서의 연속 처리는 기존 사전 토큰 캐시를 활용하면서 새로운 입력을 처리하는 조건이다. 두 조건 모두 웜 상태로 불리기도 하지만 의미가 다르며, 대표 결과는 전체 코퍼스가 캐시에 들어가지 않는 서로 다른 문서 조건을 사용했다.
7. 측정된 성능 향상과 결과의 해석
v1 인코딩 경로가 다루는 10개 모델 계열에서 Apple M4 Max의 단일 스레드 성능은 v0.23보다 3~30배 빨랐으며, 가장 낮은 향상은 t5-base, 가장 높은 향상은 gpt2에서 나타났다. 8개 작업자에서는 이상적인 선형 확장 대비 76%의 효율을 보였고, 이러한 변경 이후에도 기존 배포 라이브러리와 정확히 같은 토큰 ID를 생성한다고 보고했다. 저자들은 이 결과를 전용 분할기, 반복 단어 캐시, 할당 없는 병합 루프, 사전 토큰 배치 호출이 서로 다른 단계의 작업량을 함께 줄인 효과로 설명한다. 따라서 하나의 최적화만으로 모든 성능 향상을 설명하기보다는, 모델 패턴과 입력 특성에 따라 각 개선의 기여가 달라지는 결과로 읽어야 한다. 글은 tokbench 결과에서 생성되며 지원 범위가 늘어나면 갱신될 예정이지만, 제공된 본문에는 디코딩 처리량·메모리 힙·크레이트 크기 등에 대한 구체적인 비교 수치는 제시되어 있지 않다.
8. 설치, 측정 범위와 정식 버전까지의 계획
Rust 출시 후보는 crates.io에서 제공되며 cargo add tokenizers --pre로 설치할 수 있고, 기존 API 호출과 인코딩 결과는 유지된다고 설명한다. 학습 기능은 기본 활성화되어 C++ 의존성을 가져오므로 인코딩만 필요하면 cargo add tokenizers --pre --no-default-features --features http로 제외할 수 있다. 예제는 deepseek-ai/DeepSeek-V4-Flash를 로딩해 encode를 호출하며, 여러 코어에 걸친 배치 확장은 encode_batch가 담당하고 확장성 측정도 이 호출을 대상으로 한다. 모든 수치는 해당 Rust 크레이트에서 측정되었고, bindings/python의 Python 바인딩은 같은 코드를 감싸지만 호출별 추가 비용은 측정에 포함되지 않았다. 향후에는 1.0.0 이전에 추가 모델을 새 병합 루프로 옮기고 출시 후보 안정화 후 transformers와 다른 의존 생태계로 개선을 확산할 계획이며, 제공된 본문은 출시 후보 구현 목록의 시작 부분에서 끊겨 이후 세부 항목은 확인할 수 없다.
🧾 핵심 주장 / 시사점
- tokenizers v1은 모델 자체의 연산을 바꾸기보다 데이터 공급 지연을 줄이는 개선이며, 모델이 빨라지고 입력 처리 규모가 커질수록 그 중요성이 커질 수 있다.
- bitcannon과 단어 캐시는 각각 패턴 지원과 입력 반복성이라는 조건이 있으므로, 3~30배의 향상을 모든 모델과 입력에 동일하게 적용할 수는 없다.
- 동일한 토큰 ID 검증은 출력 호환성을 뒷받침하지만, Rust 측정에서 제외된 Python 호출 비용과 실제 문서 구성은 적용 환경의 성능을 판단할 때 별도로 고려해야 한다.
✅ 액션 아이템
- tokenizers v1 적용 시 v0.23과의 토큰 ID·API 호환성 및 실제 입력에서의 성능 향상을 검증한다.
- 사용 모델의 bitcannon 패턴 지원 여부와 반복 사전 토큰 비중을 확인해 분할 가속 및 단어 캐시의 기대 효과를 판단한다.
- 3~30배의 인코딩 향상과 76%의 확장 효율을 실제 하드웨어·입력 조건에서 재평가하고, Python 바인딩 사용 시 호출별 오버헤드를 포함한다.
❓ 열린 질문
- 실제 사용 모델과 입력에서도 tokenizers v1은 v0.23 대비 3~30배 범위의 인코딩 향상을 보이는가?
- bitcannon이 지원하지 않는 패턴이나 반복 사전 토큰이 적은 입력에서는 성능 개선 폭이 얼마나 달라지는가?
- Python 바인딩의 호출별 오버헤드를 포함하면 8개 작업자의 선형 대비 76% 확장 효율은 어떻게 달라지는가?