gigatoken: HuggingFace보다 약 1000배 빠른 GB/s급 LLM 토크나이저

gigatoken 소개

대규모 언어 모델을 학습할 때는 수십 기가바이트에서 수 테라바이트에 이르는 텍스트를 토큰으로 변환해야 합니다. 이 토큰화 단계는 GPU 학습만큼 눈에 띄지는 않지만, 데이터가 커질수록 전체 파이프라인에서 무시할 수 없는 시간을 차지합니다. HuggingFace tokenizers나 tiktoken이 이미 멀티스레드 Rust로 구현되어 있는데도, 대용량 코퍼스를 한 번 토큰화하는 데 상당한 시간이 드는 이유입니다.

gigatoken은 이 토큰화를 초당 기가바이트(GB/s) 단위로 처리하는 것을 목표로 하는 Rust 기반 토크나이저입니다. 개발자는 이를 "~1000x faster than HuggingFace's tokenizers, drop-in replacement" 라고 소개하며, 언어 모델링을 위한 가장 빠른 토크나이저라고 설명합니다. 다양한 CPU 하드웨어를 지원하고, 널리 쓰이는 대부분의 토크나이저와 호환됩니다.

gigatoken이 강조하는 점은 이것이 기존 도구를 완전히 대체하는 별개의 방식이 아니라 드롭인 교체(drop-in replacement) 라는 것입니다. 기존 HuggingFace나 tiktoken 코드에 최소한의 변경만으로 끼워 넣을 수 있고, 더 빠른 속도가 필요하면 gigatoken 고유 API로 전환할 수 있습니다.

gigatoken의 처리량

아래 그림은 Apple M4 Max(16 스레드) 에서 12GB 텍스트(owt_train.txt) 를 GPT-2 토크나이저로 처리했을 때의 처리량을 비교한 것입니다. gigatoken의 막대가 GB/s 단위인 반면, tiktoken과 HuggingFace tokenizers는 MB/s 단위에 머무릅니다.

저장소의 벤치마크는 같은 12GB 코퍼스를 여러 토크나이저와 CPU에서 측정한 수치를 함께 제공합니다. 아래는 AMD EPYC 9565(144 코어) 기준 일부 발췌입니다.

토크나이저 gigatoken HF tokenizers HF 대비
GPT-2 24.53 GB/s 24.8 MB/s 989×
Qwen 3 22.16 GB/s 34.2 MB/s 648×
Llama 3 / 3.1 / 3.2 22.15 GB/s 48.5 MB/s 457×
DeepSeek V3 / R1 19.69 GB/s 26.2 MB/s 750×
Gemma 3 3.43 GB/s 357.2 MB/s 9.6×

수치에서 보이듯 배속은 토크나이저마다 크게 다릅니다. GPT-2 계열에서는 약 1000배에 가까운 차이가 나지만, Gemma 계열처럼 한 자릿수 배속에 머무는 경우도 있습니다. 배속 비교 대상인 HF tokenizers와 tiktoken 역시 이미 멀티스레드 Rust로 동작한다는 점을 함께 고려해서 읽는 것이 좋습니다.

gigatoken 설치 및 사용법

gigatoken은 pip로 설치합니다.

pip install gigatoken

가장 간단한 사용법은 호환 모드입니다. 기존 HuggingFace나 tiktoken 토크나이저를 감싸면, 원래 쓰던 것과 같은 방식으로 쓰면서 더 빠른 속도를 얻습니다.

import gigatoken as gt

# HuggingFace 호환 모드
tokenizer = gt.Tokenizer(hf_tokenizer).as_hf()
tokens = tokenizer.encode_batch(["This is a test string", "And here is another"])

# tiktoken 호환 모드
tokenizer = gt.Tokenizer(tiktokenizer).as_tiktoken()
tokens = tokenizer.encode_batch(["This is a test string", "And here is another"])

개발자는 호환 모드가 HuggingFace tokenizers와 출력을 정확히 일치시키는 데 상당한 공을 들였으며, 그 대신 일부 성능 손해가 있다고 밝힙니다. 최대 속도가 필요하면 gigatoken 고유 API로 파일을 직접 읽게 해 오버헤드를 줄입니다.

import gigatoken as gt

tokenizer = gt.Tokenizer("Qwen/Qwen3-8B")  # HF 모델 이름을 그대로 받음
file_source = gt.TextFileSource(["owt_train.txt"], separator=b"<|endoftext|>")
tokens = tokenizer.encode_files(file_source)

이 방식은 Rust 구현이 데이터를 직접 읽어 병렬성을 최대한 활용합니다. 다만 파이썬 자료구조를 이 API로 넘기면 파이썬에서 읽어 오는 오버헤드는 여전히 발생합니다.

gigatoken의 라이선스

gigatoken은 MIT 라이선스로 공개되어 있어 개인 및 상업적 목적으로 자유롭게 사용할 수 있습니다.

:github: gigatoken 프로젝트 GitHub 저장소

더 읽어보기




이 글은 GPT 모델로 정리한 글을 바탕으로 한 것으로, 원문의 내용 또는 의도와 다르게 정리된 내용이 있을 수 있습니다. 관심있는 내용이시라면 원문도 함께 참고해주세요! 읽으시면서 어색하거나 잘못된 내용을 발견하시면 덧글로 알려주시기를 부탁드립니다. :hugs:

:pytorch:파이토치 한국 사용자 모임:south_korea:이 정리한 이 글이 유용하셨나요? 회원으로 가입하시면 주요 글들을 이메일:love_letter:로 보내드립니다! 텔레그램(Telegram)이나 Slack/Discord/Teams/Dooray/GoogleChat 등으로도 새 글 알림을 받으실 수 있습니다. :smiley:

:wrapped_gift: 아래:down_right_arrow:쪽에 좋아요:+1:를 눌러주시면 새로운 소식들을 정리하고 공유하는데 힘이 됩니다~ :star_struck: