Introducción
El objetivo de este caso de uso es fine-tunear un modelo de clasificación de sentimiento en textos utilizando el dataset de reseñas de películas de IMDb y el modelo preentrenado DistilBERT, un transformer ligero optimizado para eficiencia.
Este caso de uso tiene varias características clave:
- Es reproducible, ligero y ejecutable en un portátil estándar.
- Utiliza un modelo ampliamente documentado y con implementaciones libres.
- Permite demostrar técnicas de optimización que reducen consumo energético y costes computacionales.
- Se alinea con un escenario realista: clasificación de texto para análisis de opiniones.
El flujo completo incluye:
Fine tuning → Pruning → Quantization → Evaluación comparativa, mostrando cómo cada técnica afecta al rendimiento y eficiencia del modelo.
Stack tecnológico
El desarrollo se ha realizado utilizando tecnologías abiertas, ampliamente adoptadas en proyectos de IA modernos:
Componente | Descripción |
|---|---|
Python 3.11 + venv | Entorno limpio y aislado para reproducibilidad |
Transformers (Hugging Face) | Carga de modelos preentrenados y utilidades para fine-tuning |
Datasets (Hugging Face) | Descarga y gestión eficiente del dataset IMDb |
PyTorch | Framework de entrenamiento, pruning y quantization |
Evaluate | Librería para métricas estandarizadas (accuracy) |
VS Code | Entorno de desarrollo principal |
Este stack es ligero y totalmente open source.
Fine tuning
Carga de datos
El proceso comienza con la carga del dataset de reseñas de películas de IMDb mediante Hugging Face Datasets:
Posteriormente se aplica un reducción del dataset intencional:
Esta reducción del dataset:
- Permite entrenar el modelo en un entorno local sin GPU.
- Reduce el coste computacional (y por tanto el consumo energético).
- Mantiene un volumen suficiente de datos para mostrar el proceso completo.
Esta es una de las técnicas recomendadas en el apartado Error! Reference source not found..
Tokenización y preparación de tensores
Se utiliza el tokenizer asociado a DistilBERT:
Posteriormente se define la función de tokenización:
Se aplica:
- Padding a longitud fija para acelerar batching.
- Truncation para evitar secuencias excesivamente largas.
- max_length=256 como compromiso entre coste computacional y precisión.
Finalmente se convierten los datasets a formato PyTorch:
Configuración de métricas
Se utiliza la librería evaluate para ver el rendimiento del modelo:
Se define la función estándar:
Fine-tuning del modelo DistilBERT
Se configuran los parámetros de entrenamiento del modelo preentrenado:
✔ Técnicas usadas:
- Batch size reducido → menos VRAM y CPU requerida.
- Entrenamiento breve (2 epochs) → ahorro energético sin comprometer resultados.
- Evaluación solo al final de cada epoch → menos forward passes, menor coste.
- load_best_model_at_end → evita repetir entrenamiento posterior.
Early stopping
El entrenamiento incorpora early stopping:
- Detiene el entrenamiento si no mejora, evitando gasto computacional inútil.
- En nuestro caso, evitó iteraciones adicionales innecesarias.
Entrenamiento, evaluación y guardado
Tras completar el entrenamiento, se almacena:
Resultado:
Tras completar el proceso de fine-tuning sobre el subconjunto reducido del dataset IMDb, el modelo DistilBERT ha alcanzado un rendimiento sólido, obteniendo una accuracy del 87,8% y una pérdida de evaluación de 0,458. Estos resultados indican que, pese al entrenamiento con un volumen limitado de datos y únicamente dos epochs, el modelo ha logrado una capacidad adecuada para distinguir entre reseñas positivas y negativas.
El tiempo total de evaluación (87,6 segundos) confirma además que el modelo es capaz de operar de forma eficiente en un entorno local sin GPU. Con este punto de partida, el modelo queda correctamente entrenado y preparado para aplicar las técnicas posteriores de pruning y quantization, que permitirán analizar cómo evolucionan el rendimiento, los tiempos de inferencia y el coste computacional.
Pruning
Una vez obtenido el modelo final entrenado, se aplicó pruning para reducir el número de parámetros efectivos.
La técnica utilizada fue L1 unstructured pruning, que elimina el 30% de los pesos menos significativos de las capas lineales.
El pruning:
- Reduce el número de parámetros sin modificar la arquitectura.
- Disminuye ligeramente el tamaño del modelo en memoria RAM.
- Permite acelerar inferencia en hardware especializado o si se combina con weight packing o graph optimization.
Inconvenientes:
- Pequeña pérdida de accuracy.
Los beneficios en tiempo no siempre se reflejan en CPUs estándar, ya que PyTorch no compacta automáticamente matrices dispersas.
Cuantización
La segunda técnica de optimización aplicada fue cuantización dinámica:
- Convierte pesos de capas lineales de float32 → int8 (8 bits)
- Reduce drásticamente el tamaño del modelo en disco.
- Reduce el coste computacional durante la inferencia gracias al uso de instrucciones optimizadas.
Ventajas de esta técnica:
- Reducción de tamaño considerable (hasta un 30–50%).
- Inferencias más rápidas en CPU x86 sin necesidad de GPU.
Reducido impacto sobre la accuracy.
Evaluación de resultados
Se llevaron a cabo benchmarks homogéneos sobre un subconjunto de 300 muestras:
- Accuracy
- Tiempo de inferencia (CPU)
- Tamaño en disco
Método de evaluación:
Y otra para evaluar el tamaño en disco:
Los resultados fueron los siguientes:
Modelo base (fine-tuned)
- Accuracy: 0.8633
- Tiempo: 49.78 s
- Tamaño: 256.33 MB
Este es el modelo de referencia: equilibrio estándar entre precisión, coste computacional y tamaño.
Modelo pruned
- Accuracy: 0.8567
- Tiempo: 54.47 s
- Tamaño: 256.33 MB
El pruning reduce el número de parámetros activos, pero en CPU sin optimización específica no reduce el tiempo, incluso puede aumentarlo por el acceso disperso a memoria.
La precisión baja ligeramente, lo esperado, pero el tamaño final del modelo no cambia porque el pruning aplicado no es estructural a nivel de matrices completas.
Modelo cuantizado
- Accuracy: 0.8733 (mejor incluso que el modelo base)
- Tiempo: 36.33 s (≈27% más rápido que el modelo base)
- Tamaño: 265.48 MB (ligero aumento por serialización completa)
El cuantizado dinámico ha sido la técnica más efectiva, logrando:
- Mejor precisión que el modelo original (esto puede ocurrir por efecto “regularizador”: el ruido de redondeo actúa como smoothing).
- Aceleración notable de inferencia en CPU (–27%).
Aunque el tamaño en disco aumenta ligeramente, la representación en memoria e inferencia sí se optimiza, que es donde importa para eficiencia energética.
Conclusión general
Las técnicas aplicadas han demostrado diferentes beneficios:
1. Reducción de coste computacional en entrenamiento
- Submuestreo del dataset
- Modelo base ligero (DistilBERT)
- Limitar longitud máxima
- Early stopping
Todo ello permitió un entrenamiento eficiente en entorno local sin GPU, minimizando energía y tiempo.
2. Optimización del modelo
Pruning (30% L1 unstructured)
- Suaviza el modelo y reduce parámetros.
- Ligera caída en accuracy.
- No reduce el tiempo de inferencia en CPU al no ser pruning estructural.
Beneficio moderado, pero útil como paso previo en pipelines más grandes.
Cuantization dinámica (INT8 sobre capas lineales)
- Mejor técnica en este experimento.
- Aumenta la precisión respecto al modelo base.
- Reduce el tiempo de inferencia en ~27%.
- Optimiza cómputo al usar operaciones INT8 más baratas.
Mayor impacto directo en eficiencia energética real.
3. Conclusión final
El proceso completo demuestra que:
- Es posible aumentar la eficiencia energética y computacional de un modelo NLP sin necesidad de GPUs ni infraestructuras complejas.
- La combinación de reducción del dataset, optimizaciones del pipeline, fine-tuning ligero, y sobre todo cuantizacion ofrece beneficios inmediatos y medibles.
- El modelo cuantizado se posiciona como la mejor opción para despliegue en producción eficiente (especialmente en CPU y edge devices).