- 다양한 CPU와 널리 쓰이는 토크나이저를 지원하며, 텍스트를 GB/s 단위로 처리하는 Tiktoken 과 HuggingFace Tokenizers 대체 도구
- 정규식 엔진이 맡던 사전 토큰화를 SIMD로 최적화하고 분기·스레드 통신·Python 상호작용을 줄이며, 이전에 본 단어의 토큰 매핑을 효율적으로 캐싱함
- 11.9GB OpenWebText 벤치마크에서 GPT-2 처리량은 AMD EPYC 9565에서 24.53GB/s, Apple M4 Max에서 8.79GB/s, Ryzen 7 9800X3D에서 6.27GB/s를 기록함
- HuggingFace·Tiktoken 호환 모드는 기존 코드를 거의 그대로 유지하지만 출력 일치 비용으로 성능이 낮아지며, Rust가 파일을 직접 읽는 Gigatoken API가 최대 병렬성과 최고 속도를 제공함
- WordPiece와 파일 출력은 아직 지원하지 않고 SentencePiece 최적화와 Windows 검증도 부족해, 현재는 BPE 토크나이저와 Linux·macOS 또는 WSL 환경에 더 적합함
지원 범위와 사용 방식
- Gigatoken은 언어 모델용 고속 토크나이저로, 현대적인 x86·ARM CPU와 거의 모든 일반적인 토크나이저를 대상으로 함
pip install gigatoken으로 설치하며 자체 API와 HuggingFace Tokenizers·Tiktoken 호환 모드를 제공함- 호환 모드는 기존 토크나이저를 감싸 각각
.as_hf()또는.as_tiktoken()으로 변환함- HuggingFace Tokenizers와 출력이 정확히 일치하도록 상당한 작업을 적용함
- 호환성 처리에는 무시하기 어려운 성능 비용이 있어 자체 API의 약 1,000배 가속에는 미치지 못하지만, 전반적으로 기존 구현보다 빠름
- 자체 API는
"Qwen/Qwen3-8B"같은 HuggingFace 모델 이름과TextFileSource를 받아 파일을 직접 인코딩함- Rust 구현이 데이터를 직접 읽어 불필요한 오버헤드를 건너뛰고 병렬성을 극대화함
- Python 자료구조를 전달하면 Python에서 데이터를 읽는 비용이 남음
속도를 높이는 구현
- 가장 큰 개선은 보통 정규식 엔진에 맡기는 사전 토큰화를 SIMD 기반으로 직접 고도화한 데서 나옴
- 분기를 최소화하고, 이미 본 단어의 인코딩 토큰을 찾는 사전 토큰 매핑 캐시를 집중적으로 최적화함
- 캐시는 빠르게 커지고 사전 토큰 분포가 긴 꼬리 형태여서 다루기 어려움
- Python과의 상호작용 및 스레드 사이 통신을 줄여 추가 성능을 확보함
- 특정 CPU나 토크나이저 하나에 맞춘 구현이 아니라 현대적인 x86·ARM CPU와 여러 토크나이저 조합을 각각 최적화했으며, 결과도 CPU와 토크나이저 전반에서 일관적임
11.9GB OpenWebText 벤치마크
- AMD EPYC 9565 144코어 환경의 GPT-2 처리량은 24.53GB/s로, HuggingFace Tokenizers의 24.8MB/s보다 989배, Tiktoken의 36.0MB/s보다 681배 빠름
- 주요 BPE 계열은 대체로 약 15.49~24.00GB/s를 기록함
- SentencePiece 기반 항목은 약 2.51~4.82GB/s로 상대적으로 느림
- Apple M4 Max 16코어에서 GPT-2는 8.79GB/s로 HuggingFace 대비 1,268배, Tiktoken 대비 140배임
- OLMo 2/3는 HuggingFace 대비 1,299배, Qwen 2/2.5는 1,105배를 기록함
- AMD Ryzen 7 9800X3D 16코어에서 GPT-2는 6.27GB/s로 HuggingFace 대비 106배, Tiktoken 대비 68배임
- 주요 BPE 계열은 약 4.21~6.09GB/s, 상대적으로 덜 최적화된 계열은 약 1.12~2.84GB/s임
측정 조건과 해석
- OWT(OpenWebText)는 Common Crawl 문서를 추출한 뒤 얻는 텍스트를 대략 대표해 벤치마크 데이터로 선택됨
- Gigatoken은 전체 파일을 미리 나누지 않고 처리하므로 분할 경계 탐색과 자동 병렬화까지 직접 수행함
- 비교 대상은
<|endoftext|>기준으로 미리 분할된 데이터를 처리함- HuggingFace
encode_batch_fast는 첫 100MB를 사용함 - Tiktoken
encode_ordinary_batch는 첫 1GB를 사용함 - 두 구현 모두 캐싱하지 않아 처리 과정의 속도가 대체로 일정하므로 이 비교 조건을 사용함
- HuggingFace
- Tiktoken 결과는 공식 지원 토크나이저에만 포함됨
- 각 행은 어휘·병합·사전 토크나이저가 동일한 하나의 고유 토크나이저를 대표함
- Llama, Qwen, DeepSeek, GLM, Nemotron, Kimi, Phi, Gemma 계열의 여러 버전과 파생 모델이 같은 토크나이저 행에 묶임
- 가장 느린 항목은 Gigatoken에서 아직 충분히 최적화되지 않은 SentencePiece 기반 토크나이저임
지원 여부 검증과 대규모 처리
- 설치 없이
uvx --with tokenizers gigatoken bench명령으로 HuggingFace 모델 저장소의 토큰화를 검증하고 시간을 측정할 수 있음 - GPT-2 검증 예시에서는 20,401개 문서의 출력이 일치함
- Apple M4 Max에서 11,920.51MB를 1.432초, 8,327.05MB/s로 처리해 HuggingFace보다 1,353.13배 빨랐음
- AMD EPYC 9565에서 같은 데이터를 0.486초, 24,532.45MB/s로 처리해 989.21배 빨랐음
- EPYC 처리율이라면 130조 토큰 규모의 Common Crawl 전체를 6.5시간 미만에 토큰화할 수 있음
- 예시는 Stanford CS336 OWT 샘플을 사용하며, CLI는 기본적으로 검증과 HuggingFace 비교에 파일의 첫 100MB를 이용함
- macOS의 첫 실행은 보안 검사 때문에 Rust 코드가 느려질 수 있어 정확한 측정을 위해 명령을 두 번 실행해야 할 수 있음
- 출력 불일치나 느린 사례는 GitHub Issue로 보고하도록 요청함
알려진 제약
- Python 반복 처리는 Rust에서 수행하지만 내부 CPython 버전별 API보다 느린 ABI3를 사용함
- Python 버전별 특화를 계획하고 있으며 초기 실험에서는 오버헤드 지배 사례가 2배 빨라짐
- Gigatoken API에는 아직 파일 출력 싱크가 구현되지 않음
- WordPiece는 지원하지 않음
- SentencePiece 기반 토큰화는 일반적인 BPE보다 최적화 수준이 낮음
- 주로 Google 모델과 BERT 계열이 사용한다는 이유로 현재 우선순위도 낮음
- Windows 테스트가 충분하지 않아 현재는 WSL 사용을 권장함
AI 사용 범위
- 코드베이스 대부분은 AI 없이 직접 작성했으며, 프로젝트 Git 기록에서 이를 확인할 수 있음
- 프로젝트 최종 단계에서는 AI를 다음 작업에 활용함
- 사용자용 API 구현
- 더 많은 토크나이저를 위한 사전 토크나이저 일반화·이식과 호환성 확대
- 패딩, 잘라내기, Unicode 정규화 지원
- AVX512·AVX2·NEON 사이의 SIMD 전략 이식
- 분기 제거와 사전 토큰 캐시 계층 개선을 통한 마지막 약 4배 성능 향상
- 리팩터링과 코드 재사용 개선