DEV Community

Cover image for Gigatoken tokeniza a 24,53 GB/s: hasta 989 veces más rápido que HuggingFace
lu1tr0n
lu1tr0n

Posted on • Originally published at elsolitario.org

Gigatoken tokeniza a 24,53 GB/s: hasta 989 veces más rápido que HuggingFace

El tokenizador gigatoken, publicado en GitHub por el desarrollador marcelroed, procesa el corpus OpenWebText completo (11,9 GB) en menos de medio segundo: 24,53 GB/s con GPT-2, frente a los 24,8 MB/s de HuggingFace Tokenizers en el mismo servidor. La diferencia, casi mil veces, ocurre pese a que HuggingFace Tokenizers y tiktoken ya corren sobre Rust multihilo puro.

TL;DR

  • Gigatoken alcanza 24,53 GB/s tokenizando GPT-2 en un AMD EPYC 9565 de 144 núcleos, 989 veces más rápido que HuggingFace Tokenizers.- Contra tiktoken, la librería de OpenAI, la diferencia es de 681 veces (36,0 MB/s de tiktoken frente a 24,53 GB/s de gigatoken).- En un Apple M4 Max de 16 núcleos llega a 8,79 GB/s con GPT-2, 1.268 veces más rápido que HuggingFace en esa misma máquina.- Soporta más de 15 familias de tokenizadores: Llama 3, Qwen 3, DeepSeek V3, GLM 5, Kimi K2, GPT-OSS y Nemotron 3, entre otras.- Se instala igual en Linux, macOS y Windows con pip install gigatoken, sin compilar Rust manualmente.- Ofrece modo de compatibilidad directa (as_hf() y as_tiktoken()) para reemplazar tokenizadores existentes sin cambiar el resto del código.- El speedup no es uniforme: familias como Gemma 4 y Mistral 7B v0.3 rinden solo 7 a 14 veces más rápido, no cerca de 1.000.

Introducción a gigatoken

Gigatoken es un proyecto open source en Rust, con bindings a Python, que se presenta como reemplazo directo (drop-in) de HuggingFace Tokenizers y tiktoken. El repositorio, mantenido por el usuario marcelroed, acumula 1.200 estrellas, 46 forks y 357 commits en la rama main. Su promesa central es simple: tokenizar texto a velocidades de gigabytes por segundo en lugar de megabytes por segundo, sin cambiar el resultado final del tokenizado.

El proyecto incluye, además del código en src/, archivos como design_doc.md y pretokenizer_optimization_log.md en la raíz del repositorio, lo que sugiere un desarrollo documentado paso a paso sobre cómo se optimizó cada etapa del pretokenizador.

Qué pasó con el tokenizador gigatoken

El README del proyecto publica dos tablas de benchmarks completas: una corrida en un servidor AMD EPYC 9565 de doble socket (144 núcleos) y otra en una laptop con Apple M4 Max (16 núcleos). Ambas usan el mismo corpus, owt_train.txt de OpenWebText, con 11,9 GB de texto plano, y miden cuántos bytes por segundo procesa cada tokenizador al codificar ese archivo completo con distintos vocabularios: GPT-2, Llama 3, Qwen 3, DeepSeek V3, GLM 5, Kimi K2, GPT-OSS, entre otros quince.

En el servidor EPYC, gigatoken tokeniza GPT-2 a 24,53 GB/s. HuggingFace Tokenizers, evaluado en la misma máquina y el mismo archivo, llega a 24,8 MB/s: gigatoken es 989 veces más rápido. Contra tiktoken, la librería oficial de OpenAI, la diferencia es de 681 veces (36,0 MB/s de tiktoken frente a los 24,53 GB/s de gigatoken).
Gigatoken procesa 11,9 GB de texto en menos de un segundo en un EPYC de 144 núcleos.

Contexto e historia

La tokenización es el primer paso de cualquier pipeline de entrenamiento de modelos de lenguaje: convierte texto crudo en la secuencia de identificadores numéricos que consume la red neuronal. Cuando el dataset de entrenamiento pesa cientos de gigabytes o terabytes, ese primer paso puede convertirse en un cuello de botella que retrasa horas de cómputo en GPU esperando datos.

HuggingFace Tokenizers, la librería de referencia del ecosistema Transformers, ya está escrita en Rust y ya es multihilo: no es una implementación ingenua en Python puro. Lo mismo pasa con tiktoken, la librería de OpenAI para los vocabularios de la familia GPT. El propio README de gigatoken lo aclara de entrada: \"Note that both HF tokenizers and tiktoken are already running multithreaded Rust!\". La brecha de rendimiento, entonces, no viene de cambiar Python por Rust, eso ya estaba hecho, sino de otra capa de optimización debajo.

💭 Clave: HuggingFace Tokenizers y tiktoken ya son Rust multihilo. La ventaja de gigatoken no viene de reescribir en un lenguaje más rápido, sino de reducir el overhead alrededor del núcleo de tokenización.

Detalles técnicos y rendimiento del tokenizador gigatoken

Gigatoken ofrece dos formas de usarlo. El modo de compatibilidad envuelve un tokenizador de HuggingFace o de tiktoken ya existente con as_hf() o as_tiktoken(), para que el código actual siga funcionando sin cambios, reproduciendo la salida exacta del tokenizador original. El propio proyecto advierte que ese modo tiene un costo de rendimiento no despreciable frente a su propia API nativa, aunque sigue siendo mucho más rápido que la librería original en cualquier escenario.

La API nativa de gigatoken, con gt.Tokenizer y un TextFileSource, deja que el código Rust lea los archivos directamente desde disco, sin pasar cadenas de texto por la frontera Python/Rust, que es donde se pierde tiempo en el modo de compatibilidad. Esa es la diferencia estructural detrás de los números de la tabla.
TokenizerGigatokenHF Tokenizerstiktokenvs HFGPT-224,53 GB/s24,8 MB/s36,0 MB/s989×Phi-424,00 GB/s29,9 MB/s, 801×GPT-OSS23,96 GB/s49,7 MB/s42,8 MB/s482×Llama 3 / 3.1 / 3.222,15 GB/s48,5 MB/s, 457×DeepSeek V3 / R1 / V419,69 GB/s26,2 MB/s, 750×GLM 520,97 GB/s74,8 MB/s, 280×Gemma 44,82 GB/s334,1 MB/s, 14×Mistral 7B v0.33,57 GB/s354,7 MB/s, 10×
La tabla completa del EPYC incluye veinte familias de tokenizadores; el patrón se repite en todas: los tokenizadores de vocabulario tipo BPE clásico, como GPT-2, Llama, DeepSeek o Qwen, rinden entre 400 y 990 veces más rápido, mientras que familias con reglas de pretokenización más pesadas, como Gemma o Mistral, se quedan en un rango de 7 a 14 veces. Es una diferencia real, pero muy lejos del titular de \"1000x\".

En hardware de consumo, un Apple M4 Max de 16 núcleos, gigatoken tokeniza GPT-2 a 8,79 GB/s: 1.268 veces más rápido que HuggingFace Tokenizers, que llega a 6,9 MB/s, y 140 veces más rápido que tiktoken, que llega a 62,8 MB/s. Con Qwen 2 / 2.5, alcanza 6,37 GB/s frente a 5,8 MB/s de HuggingFace, una diferencia de 1.105 veces, la mayor de toda la tabla del M4 Max.

flowchart TD
A["Archivo de texto (owt_train.txt)"] --> B["TextFileSource en Rust"]
B --> C["Nucleo de tokenizacion Gigatoken"]
C --> D[("Tokens de salida")]
subgraph "API nativa"
B
C
end
Enter fullscreen mode Exit fullscreen mode

Cómo empezar

Gigatoken se instala igual en las tres plataformas porque se distribuye como paquete de Python con el núcleo ya compilado en Rust:

# Linux / macOS (bash o zsh)
pip install gigatoken

# Windows (PowerShell)
pip install gigatoken

# Windows (cmd.exe)
pip install gigatoken
Enter fullscreen mode Exit fullscreen mode

Con el paquete instalado, el modo de compatibilidad permite reemplazar un tokenizador existente sin tocar el resto del pipeline:

import gigatoken as gt
from transformers import AutoTokenizer

hf_tokenizer = AutoTokenizer.from_pretrained("Qwen/Qwen3-8B")
tokenizer = gt.Tokenizer(hf_tokenizer).as_hf()

tokens = tokenizer.encode_batch([
    "El modelo procesa el corpus de entrenamiento",
    "y genera los identificadores de cada token"
])
Enter fullscreen mode Exit fullscreen mode

Para exprimir todo el rendimiento, la API nativa evita el paso intermedio por objetos de Python:

import gigatoken as gt

tokenizer = gt.Tokenizer("Qwen/Qwen3-8B")
file_source = gt.TextFileSource(
    ["corpus_entrenamiento.txt"],
    separator=b""
)
tokens = tokenizer.encode_files(file_source)
Enter fullscreen mode Exit fullscreen mode

Esta es la ruta que evita el overhead de pasar datos por la frontera Python/Rust: el archivo se lee directamente desde el lado de Rust, con paralelismo máximo entre los núcleos disponibles.

💡 Tip: antes de migrar un pipeline entero, corré el modo de compatibilidad sobre un lote pequeño y comparalo token por token contra la salida de tu tokenizador actual: el proyecto documenta trabajo específico para igualar esa salida byte a byte con HuggingFace Tokenizers.

Impacto y análisis

Para un equipo que entrena o hace fine-tuning de un modelo propio sobre un corpus de cientos de gigabytes, el tiempo de tokenización deja de ser un paso trivial cuando la librería tarda minutos u horas en preparar los datos antes de que la GPU empiece a trabajar. Pasar de megabytes por segundo a gigabytes por segundo cambia ese paso de horas a segundos en datasets grandes, siempre que el resto del pipeline (lectura de disco, mezcla de shards, escritura de los tokens resultantes) no se convierta en el nuevo cuello de botella.

La limitación más honesta está en la propia tabla de benchmarks: la ganancia no es uniforme. Familias como Gemma 4, Mistral 7B v0.3 o Gemma 1, con reglas de pretokenización más complejas, rinden entre 7 y 14 veces más rápido, no cerca de mil. Cualquiera que evalúe gigatoken para su propio vocabulario debería correr el benchmark con su tokenizador específico antes de asumir el número más grande de la tabla.
La ventaja de gigatoken varía de 7x a 989x según la familia de tokenizador.
El otro costo a considerar es el modo de compatibilidad: reproducir exactamente la salida de HuggingFace Tokenizers o tiktoken exige lógica adicional que reduce el rendimiento frente a la API nativa. Para equipos que ya tienen pipelines maduros construidos sobre esas librerías, el modo de compatibilidad es el punto de entrada razonable, aunque no entregue el número más alto de la tabla.

Qué sigue

El repositorio no publica un roadmap público en el README más allá del propio código: archivos como design_doc.md y pretokenizer_optimization_log.md, visibles en el árbol del repositorio, sugieren que el proyecto documenta sus decisiones de optimización internamente a medida que agrega soporte para nuevas familias de tokenizadores. La lista actual ya cubre generaciones recientes como GLM 5, Qwen 3.5/3.6 y Nemotron 3, lo que indica mantenimiento activo más allá del lanzamiento inicial.

Lo que todavía no está documentado públicamente, según el propio README, es el comportamiento en cargas de trabajo distintas a la tokenización de un archivo de texto plano completo: streaming incremental, tokenización en el momento de la inferencia, donde importa más la latencia por request que el throughput agregado, o soporte para formatos de dataset como Parquet o WebDataset.

📖 Resumen en Telegram: Ver resumen

Probalo vos: corré pip install gigatoken y comparalo contra tu tokenizador actual sobre tu propio corpus antes de migrar nada a producción.

Preguntas frecuentes

¿Qué es gigatoken?

Es una librería de tokenización para modelos de lenguaje escrita en Rust, con bindings a Python, publicada por el desarrollador marcelroed en GitHub. Su objetivo es reemplazar a HuggingFace Tokenizers o tiktoken sin cambiar el resto del código.

¿Qué tan rápido es comparado con HuggingFace Tokenizers?

En el benchmark publicado con GPT-2 sobre un servidor AMD EPYC 9565, gigatoken alcanza 24,53 GB/s frente a los 24,8 MB/s de HuggingFace Tokenizers, una diferencia de 989 veces. En un Apple M4 Max llega a 8,79 GB/s, 1.268 veces más rápido que HuggingFace en la misma máquina.

¿Sirve con cualquier tokenizador de HuggingFace?

El modo de compatibilidad (as_hf()) envuelve un tokenizador de HuggingFace ya existente y busca reproducir su salida exacta. El README documenta soporte explícito para más de 15 familias, entre ellas Llama 3, Qwen 3, DeepSeek V3, GLM 5, GPT-OSS y Kimi K2.

¿Cómo se instala gigatoken?

Con pip install gigatoken, igual en Linux, macOS y Windows, porque el núcleo en Rust ya viene compilado dentro del paquete de Python.

¿El modo de compatibilidad es igual de rápido que la API nativa?

No. El propio proyecto advierte que el modo de compatibilidad con HuggingFace o tiktoken tiene un costo de rendimiento no despreciable frente a la API nativa de gigatoken, que evita pasar datos por la frontera Python/Rust.

¿Gigatoken reemplaza a tiktoken de OpenAI?

Ofrece un modo as_tiktoken() para usarlo como reemplazo directo. En el benchmark de GPT-2 sobre EPYC, gigatoken es 681 veces más rápido que tiktoken, que procesa 36,0 MB/s.

Referencias

📱 ¿Te gusta este contenido? Únete a nuestro canal de Telegram @programacion donde publicamos a diario lo más relevante de tecnología, IA y desarrollo. Resúmenes rápidos, contenido fresco todos los días.

Top comments (0)