MÓDULO 7 · HUGGING FACE · LECCIÓN 01 · 25 MIN

El Hub y el pipeline de una línea

pipeline("sentiment-analysis") no es una función de análisis de sentimiento: es un resolutor. Elige un modelo, descarga sus pesos, monta el tokenizador que le corresponde, ejecuta el forward y decodifica la salida a etiquetas legibles. Las cinco líneas que ves esconden cuatro decisiones, y la primera —qué modelo— la toma HuggingFace por ti si no la tomas tú.
01 — Qué hay dentro
Cuatro etapas encadenadas, ninguna visible
from transformers import pipeline

clasificador = pipeline("sentiment-analysis")
resultado = clasificador("El servicio fue terrible, no lo recomiendo")
# [{'label': 'NEGATIVE', 'score': 0.9994}]
texto
→
tokenizador
→
modelo
→
softmax + mapeo
→
label + score

Antes de la primera flecha hay una etapa más, la que no se dibuja: resolver la tarea a un modelo concreto. "sentiment-analysis" es un nombre de tarea, no un modelo. Alguien tiene que decidir cuál.

Las tres siguientes van en bloque por una razón: el tokenizador convierte texto a enteros con el vocabulario de ese modelo, y el post-proceso traduce índices a etiquetas con el config.json de ese modelo. Mezclar piezas de dos modelos distintos no da error: da números sin significado.

02 — El defecto
Una decisión sin dueño

Si llamas a pipeline sin model=, la librería te avisa:

No model was supplied, defaulted to <algún modelo> and revision <algún hash>

Eso no es ruido. Es la librería diciéndote que ha elegido por ti. En un prototipo da igual; en cuanto alguien más ejecute tu código, o cambie la versión de la librería, ese defecto puede moverse y tus resultados con él, sin que tú hayas tocado nada.

La forma con dueño es explícita:

clasificador = pipeline(
    "sentiment-analysis",
    model="distilbert/distilbert-base-uncased-finetuned-sst-2-english",
)
// model= fija qué red. revision="<commit sha>" fija además qué versión de sus pesos: es el lockfile del modelo.
03 — Entorno
El token y la caché son cosas distintas
Para qué sirveCuándo hace falta
Token hf_... Autenticarte contra el Hub Modelos privados, modelos gated (con licencia que hay que aceptar) y subir cosas
Caché local Guardar los pesos ya descargados Siempre. Sin ella, descargas en cada ejecución

El token va en .env, nunca en el código, y .env va en .gitignore. No es higiene estética: hay bots escaneando repositorios públicos en busca de credenciales.

import os
from dotenv import load_dotenv

load_dotenv()
HF_TOKEN = os.getenv("HUGGING_FACE_TOKEN")

La caché vive bajo el directorio de HuggingFace en tu HOME y se mueve con la variable de entorno HF_HOME. Si el modelo se descarga en cada ejecución, no es que «no se guarde»: o la carpeta no tiene permisos de escritura, o HF_HOME apunta a otro sitio.

04 — El otro camino
Qué ganas y qué pierdes con el atajo
pipeline()AutoTokenizer + AutoModel…
Líneas de código28-10
Control de batching y paddingNingunoTotal
Acceso a los logits crudosNoSí
Reutilizar el tokenizadorImplícitoExplícito
Bueno paraPrototipo, demo, exploraciónProducción, evaluación, cualquier cosa que mida

No es una escalera de principiante a experto: son dos herramientas. pipeline para saber si la tarea es viable; las clases Auto en cuanto necesites medir algo.

Auditoría

La guía usa pipeline('sentiment-analysis') sin modelo en su ejemplo principal, y en su propia tabla de troubleshooting clasifica la advertencia resultante como «Normal en este ejercicio». Es la misma guía diciendo dos cosas: el código enseña una práctica y la tabla la disculpa.

Da además tres cifras sin fecha ni fuente: «más de 500.000 modelos», «primera vez: ~268 MB» y «$0.002-0.03 por 1K tokens» en APIs comerciales. Envejecen a velocidades distintas y ninguna se puede verificar desde el PDF. Antes de repetirlas: ¿cuántos modelos hay hoy en el Hub, cuánto pesa de verdad el que has fijado, y de qué proveedor y qué modelo salió ese precio?

Y una que no es una cifra. La guía dice «gratis». Gratis de descargar no es gratis de ejecutar: ¿quién paga la CPU o la GPU donde corre?

05 — Ahora tú
Mide la descarga y mide la caché

Coge el ejemplo de sentimiento y fija el modelo con model=. Ejecútalo dos veces seguidas midiendo el total de cada una con time python script.py. La diferencia entre la primera y la segunda es exactamente el coste de la descarga, y ya no tienes que creerte ninguna cifra sobre ello.

Después mira cuánto ocupa tu caché de HuggingFace en disco y compáralo con los ~268 MB que promete la guía. Apunta el número real: lo vas a necesitar en cuanto decidas cuántos modelos puedes permitirte tener a mano.