GigaToken: 1000x 더 빠른 언어 모델 토큰화 달성
GigaToken: 1000x 더 빠른 언어 모델 토큰화 달성
GigaToken은 고성능 토큰화 라이브러리로, HuggingFace와 Tiktoken과의 드롭인 교체를 목표로 설계되었으며, 고급 CPU 하드웨어에서 최대 24 GB/s의 처리량을 달성합니다. 이는 대규모 데이터셋 처리 시간을 크게 줄여, 듀얼 소켓 AMD EPYC 시스템에서 약 6.5시간 이내에 전체 Common Crawl 데이터셋(약 130조 토큰)의 토큰화를 가능하게 할 수 있습니다.
기술 구현 및 성능 향상
// GigaToken은 토큰화 과정에서 가장 계산 비용이 높은 부분에 집중하여 속도를 달성합니다. 구체적으로 사전 토큰화와 캐싱입니다.
SIMD 및 사전 토큰화
대부분의 토크나이저는 사전 토큰화를 Regex 엔진에 아웃소싱합니다. GigaToken은 SIMD(Single Instruction, Multiple Data)를 사용하고 분기를 최소화한 altamente 최적화된 구현으로 이를 대체합니다. 이 접근 방식은 라이브러리가 x86 및 ARM 아키텍처 모두에서 바이트 수준에서 극도로 효율적으로 텍스트 데이터를 처리할 수 있게 합니다.
최적화된 캐시 계층 구조
사전 토큰 매핑 캐시는 사전 토큰 분포가 긴 꼬리 형태를 띠고 캐시가 빠르게 증가할 수 있기 때문에 성능 병목의 주요 원인입니다. GigaToken은 이전에 본 단어에 대한 인코딩된 토큰을 효율적으로 조회할 수 있는 특수화된 캐시 계층 구조를 구현하여 중복 계산을 줄입니다.
런타임 오버헤드 최소화
처리량을 최대화하기 위해 GigaToken은 Python 런타임과의 상호작용을 최소화하고 스레드 간 통신을 피합니다. 핵심 로직을 Rust로 구현하고 Rust 구현이 파일로부터 데이터를 직접 읽도록 함으로써 Python 데이터 구조를 전달하는 데 따른 오버헤드를 우회합니다.
벤치마크 및 하드웨어 성능
GigaToken의 성능 향상은 네이티브 API를 사용할 때 가장 두드러집니다. 이는 최대 병렬 처리와 직접 파일 읽기를 허용하기 때문입니다.
고성능 서버 하드웨어 (AMD EPYC 9565)
듀얼 소켓 144코어 AMD EPYC 9565 프로세서에서 GigaToken은 일반적인 토크나이저에 대해 다음과 같은 처리량을 달성합니다:
| 토크나이저 | GigaToken 처리량 | HuggingFace 대비 |
|---|---|---|
| GPT-2 | 24.53 GB/s | 989x |
| Phi-4 | 24.00 GB/s | 801x |
| Llama 3 / 3.1 / 3.2 | 22.15 GB/s | 457x |
| DeepSeek V3 / R1 / V4 | 19.69 GB/s | 750x |
| Qwen 2 / 2.5 | 19.12 GB/s | 19.12 GB/s |
소비자 하드웨어 (Apple M4 Max)
16코어 Apple M4 Max에서 GigaToken은 유사한 규모의 속도 향상을 보여줍니다:
| 토크나이저 | GigaToken 처리량 | HuggingFace 대비 |
|---|---|---|
| GPT-2 | 8.79 GB/s | 1,268x |
| OLMo 2 / 3 | 7.56 GB/s | 1,299x |
| Llama 3 / 3.1 / 3.2 | 7.60 GB/s | 676x |
| Phi-4 | 7.76 GB/s | 1,012x |
데스크톱 하드웨어 (AMD Ryzen 7 9800X3D)
16코어 AMD Ryzen 7 9800X3D에서 처리량은 GPT-2 기준 6.27 GB/s에서 Gemma 3 기준 1.12 GB/s까지 범위를 보입니다.
사용법 및 호환성
GigaToken은 기존 워크플로에 통합하는 두 가지 주요 방법을 제공합니다:
호환 모드
이 모드는 GigaToken이 HuggingFace 또는 Tiktoken과의 드롭인 교체로 작동하도록 허용합니다. 정확한 출력 일치를 보장하지만, 호환성을 유지하는 오버헤드로 인해 성능 비용이 발생합니다. 사용자는 상당한 속도 향상을 기대할 수 있지만, 네이티브 API에서 보이는 전체 1000x gain은 달성하지 못합니다.
네이티브 GigaToken API
최대 성능을 위해 네이티브 API를 사용합니다. 이 API는 HuggingFace 모델 이름을 받아들이고、TextFileSource를 활용하여 Rust에서 데이터를 직접 읽어 Python 오버헤드를 건너뜁니다.
import gigatoken as gt
tokenizer = gt.Tokenizer("Qwen/Qwen3-8B
)
file_source = gt.TextFileSource(["owt_train.txt"], separator=b"<|endoftext|>
)
tokens = tokenizer.encode_files(file_source)
제한 사항 및 알려진 문제
BPE 토크나이저에 대해 altamente 최적화되었지만, GigaToken에는 몇 가지 알려진 제한 사항이 있습니다:
- SentencePiece: SentencePiece 기반 모델(예: Google 모델 또는 BERT 스타일 모델)의 토큰화는 altamente 최적화되지 않아 처리량이 느려집니다.
- WordPiece: WordPiece 토큰화는 아직 지원되지 않습니다.
- OS Support: Windows 지원은 테스트되지 않았으며, Windows 사용 시 WSL을 권장합니다.
- Python ABI: 현재 구현은 ABI3를 사용하며, 저자는 각 Python 버전에 특화하여 오버헤드가 제한된 경우의 속도를 두 배로 높일 계획입니다.
커뮤니티 토론
업계 전문가들은 토큰화가 일반적으로 총 추론 시간의 작은 비율(종종 <0.1%)을 차지한다고 지적하지만, 훈련 데이터의 대규모 사전 토큰화가 필요한 동일한 애플리케이션에서는 중요합니다.
"이것은 awesome하지만, 토큰화는 일반적으로 총 추론 시간의 <0.1%를 차지합니다. presumably 토큰화만 필요한 많은 애플리케이션이 존재하며, 이는 그런 경우에 매우 유용할 것입니다!"