whisper-medium-ft-cv_es-dev

Resumen

Repositorio de desarrollo (debug/dev) con los checkpoints de entrenamiento y logs CSV del fine-tuning de openai/whisper-medium sobre Common Voice 26 español (es) en una NVIDIA Tesla P40 (Pascal sm_61, 24 GB), proyecto training-asr.

⚠️ Esto NO es un modelo de inferencia. Estos archivos son estado de entrenamiento (pesos + estados de optimizador + RNG + estadísticas del spike guard), no pesos cargables con WhisperForConditionalGeneration.from_pretrained(). Para inferencia, usa los repos publicados en erickfmm/whisper-medium-ft-cv_es-* (ver §Modelos de inferencia relacionados).

Estado: versión de desarrollo (debug)

El entrenamiento sigue en curso (step 10850/20000 al corte de esta publicación, ~54 % completado). Hay un problema abierto de divergencia val_loss vs. WER (ver Experimentos.md §8.3): la cross-entropy de validación bajó ~8× (1.58 → 0.20) pero el WER se estancó en ~0.20 con picos de alucinación (WER 31 y 33) por loops de repetición en la decodificación greedy. El mínimo WER histórico es 0.1053 @ step 500 (mejor que el último checkpoint rolling).

Contenido

exp/es-whisper-medium/
├── checkpoints/
│   ├── best_meta.json                     (~175 B, índice best-2 por WER)
│   ├── best_step-0000500_wer-0.1053.pt    (~5.1 GB, mejor WER histórico)
│   ├── best_step-0000600_wer-0.1961.pt    (~5.1 GB, 2º mejor WER)
│   ├── rolling_step-0010700.pt            (~5.1 GB, rolling, keep-3)
│   ├── rolling_step-0010750.pt            (~5.1 GB, rolling)
│   └── rolling_step-0010800.pt            (~5.1 GB, último rolling)
├── train_log.csv                          (~3.6 MB, 12.504 filas, 28 columnas)
└── val_log.csv                            (~4.7 KB, 104 validaciones)

Excluido de este repo: wandb/ (logs locales de Weights & Biases) y best_model/ (export del mejor modelo en formato HF — ver §Modelos de inferencia relacionados).

checkpoints/

Archivo Tipo Step WER Tamaño
best_step-0000500_wer-0.1053.pt best 500 0.1053 ~5.1 GB
best_step-0000600_wer-0.1961.pt best 600 0.1961 ~5.1 GB
rolling_step-0010700.pt rolling 10700 ~5.1 GB
rolling_step-0010750.pt rolling 10750 ~5.1 GB
rolling_step-0010800.pt rolling (último) 10800 0.2970 ~5.1 GB

Estado guardado en cada checkpoint (restaurable con --resume):

  • Pesos del modelo (encoder congelado + decoder + proj_out).
  • Estados de los optimizadores (Turbo-Muon para 2D, AdamW para 1D).
  • grad_tracker (EMAs mu, sigma del grad norm — el spike guard no reinicia el warmup al reanudar).
  • lr_halvings (reducciones permanentes de LR acumuladas por inf/nan).
  • rollbacks (contador acumulado para el límite --max-rollbacks).
  • scheduler_temp (LR temporal tras un rollback: cooldown + rampa).
  • rng_state + epoch (el RNG del dataloader restaura en el punto exacto; los batches no consumidos de la época interrumpida se saltan).
  • best_wer (mejor WER histórico para el best-3).

best_meta.json

[
  {"file": "best_step-0000500_wer-0.1053.pt", "wer": 0.1052736715940871},
  {"file": "best_step-0000600_wer-0.1961.pt", "wer": 0.19606472233320016}
]

Bug conocido: la lógica es best-3 por WER, pero el 3er mejor (0.1986 @ step 3200) no se guardó en modo --resume (ver Experimentos.md §8.4, lección 12).

train_log.csv

12.504 filas (steps 1–10850), 28 columnas (header):

step, epoch, loss, simple_loss, pruned_loss, s_scale, p_scale, lr_muon, lr_adamw,
grad_norm, clip_ratio, frames, batch_size, tok_per_sec, batches_per_sec,
mem_alloc_gb, mem_reserved_gb, elapsed_sec, nan_failures, lr_scale,
gn_z, gn_mu, gn_sigma, spike_tier, zclip_cap, rollbacks, lr_temp_scale

Columnas clave (ver README.md §6 del repo para el detalle completo):

  • nan_failures: fallos inf/nan consecutivos (step exitoso lo resetea).
  • lr_scale: factor acumulado de halvings permanentes de LR.
  • gn_z, gn_mu, gn_sigma: z-score y EMAs del grad norm pre-clip.
  • spike_tier: 0 normal, 1 clip adaptativo, 2 rollback.
  • rollbacks: contador acumulado de rollbacks (458 al corte).
  • lr_temp_scale: multiplicador de LR temporal (0.5 en cooldown, 1.0 fuera).

val_log.csv

104 filas (steps 500–10800), 3 columnas:

step, val_loss, wer

Trayectoria destacada (ver Experimentos.md §8.3 para el análisis):

Step val_loss WER Nota
500 1.5826 0.1053 mejor WER histórico (run 7)
800 0.2881 1.797 inicio run 9, alucinación
1100 0.2647 31.11 alucinación
2200 0.240 32.78 alucinación
3200 0.2273 0.1986 mínimo WER del run 9
7400 0.2033 1.80 mínimo val_loss
9000 0.2161 4.59 degradación tardía
10800 0.2188 0.2970 último checkpoint rolling

⚠️ No es un modelo de inferencia

Estos archivos .pt son estado de entrenamiento con:

  • Pesos del modelo (parcialmente entrenados: encoder congelado, decoder + proj_out).
  • Momentos del optimizador (Turbo-Muon + AdamW) — ~2× el tamaño de los pesos.
  • Estado del spike guard, RNG, LR scheduler.

NO se cargan con WhisperForConditionalGeneration.from_pretrained(). Para inferencia:

  1. Reanudar el entrenamiento y dejar que el trainer exporte con backend.export (ver §Cómo reanudar).
  2. O usar los modelos de inferencia ya publicados (ver §Modelos de inferencia relacionados).

Cómo reanudar el entrenamiento

git clone https://github.com/erickfmm/training-asr.git
cd training-asr
./setup_env.sh

# Colocar los checkpoints en el directorio esperado
mkdir -p exp/es-whisper-medium/checkpoints
# (copiar aquí los archivos de este repo HF)

# Reanudar desde el último rolling
./start.sh --model whisper-medium --wandb \
  --batch-seconds 60 --max-duration 10 \
  --grad-accum-steps 8 --lr-muon 2e-3 --lr-adamw 1e-4 \
  --warmup-steps 1000 --max-steps 20000 --max-rollbacks 500 \
  --num-workers 16 --snapshot-every 10 \
  --rolling-every 50 --val-every 100 \
  --resume exp/es-whisper-medium/checkpoints/rolling_step-0010800.pt

Para reanudar desde un best checkpoint en lugar del último rolling, sustituir --resume por exp/es-whisper-medium/checkpoints/best_step-0000500_wer-0.1053.pt.

Config del run (run 9, asr-rolling_step-0000700)

./start.sh --model whisper-medium --wandb \
  --batch-seconds 60 --max-duration 10 \
  --grad-accum-steps 8 --lr-muon 2e-3 --lr-adamw 1e-4 \
  --warmup-steps 1000 --max-steps 20000 --max-rollbacks 500 \
  --num-workers 16 --snapshot-every 10 \
  --rolling-every 50 --val-every 100 \
  --resume exp/es-whisper-medium/checkpoints/rolling_step-0000700.pt
  • Modelo: openai/whisper-medium (encoder-decoder seq2seq, 764 M params).
  • Encoder congelado (Vividh-ASR arXiv:2605.13087, Gumbel-BEARD arXiv:2606.11429): sólo decoder + proj_out entrenables (~457 M, 60 %).
  • Optimizador: Turbo-Muon híbrido (Muon sobre params 2D, AdamW sobre params 1D) + warmup lineal + coseno.
  • Spike guard ZClip (arXiv:2504.02507): tier 1 clip adaptativo (z>2.5), tier 2 rollback (z>5.0) con LR×0.5 temporal.
  • dtype: FP32 (P40 sm_61, sin BF16 nativo, FP16 a 1/64 de velocidad → inviable).
  • Dataset: Common Voice 26 es, ~1.6 M clips, --max-duration 10 (descarta clips >10 s).
  • Runtime al corte: ~6 días (step 10850/20000, 54 %), 458 rollbacks absorbidos, 0 nan_failures.
  • ~31 s/step + ~50 min de validación cada 100 steps.

Modelos de inferencia relacionados

Para usar el modelo (no el estado de entrenamiento), publicados por separado:

Repo HF Step dtype WER Notas
erickfmm/whisper-medium-ft-cv_es-best-hf-fp32 500 fp32 0.1053 mejor WER histórico, máxima fidelidad
erickfmm/whisper-medium-ft-cv_es-best-hf-fp16 500 fp16 0.1053 GPUs Turing+
erickfmm/whisper-medium-ft-cv_es-best-hf-bf16 500 bf16 0.1053 GPUs Ampere+
erickfmm/whisper-medium-ft-cv_es-latest-hf-fp32 10800 fp32 0.2970 último rolling exportado
erickfmm/whisper-medium-ft-cv_es-latest-hf-fp16 10800 fp16 0.2970 GPUs Turing+
erickfmm/whisper-medium-ft-cv_es-latest-hf-bf16 10800 bf16 0.2970 GPUs Ampere+
erickfmm/whisper-medium-ft-cv_es-wcpp 10800 GGML (F16/Q8_0/Q6_K/Q4_0) 0.2970 whisper.cpp

Reproducibilidad

Limitaciones

  • No es un modelo de inferencia: cargar con from_pretrained fallará o dará resultados incorrectos. Usar el trainer del repo para exportar, o los repos de inferencia listados arriba.
  • Checkpoints rolling solapados: los 3 rolling coexistentes (rolling_step-00107{00,50} y rolling_step-0010800) son los que mantiene el trainer (keep-3); al continuar el entrenamiento, el más antiguo se borrará.
  • Hardware: FP32 sobre Tesla P40 (Pascal sm_61, sin BF16, FP16 a 1/64). El entrenamiento en bf16/fp16 no fue posible en esta GPU.
  • Dataset: Common Voice 26 es es mezcla dialectal; no tiene locale chileno (es_cl) ni hablantes infantiles. WER medido sobre 1000 muestras de validación (no el test set completo).
  • Divergencia val_loss/WER: el WER 0.1053 de step 500 no se reprodujo en steps posteriores; el run 9 se degradó tras ~step 7500 pese a val_loss descendente.

Citations

@misc{radford2022whisper,
  title        = {Robust Speech Recognition via Large-Scale Weak Supervision},
  author       = {Radford, Alec and others},
  year         = 2022,
  howpublished = {arXiv:2212.04356},
}
@misc{boissin2025turboMuon,
  title  = {Turbo-Muon},
  author = {Boissin, Théo and others},
  year   = 2025,
  note   = {arXiv:2512.04632},
}
@misc{zclip2025,
  title  = {ZClip: Adaptive Gradient Clipping for Stable LLM Training},
  year   = 2025,
  note   = {arXiv:2504.02507},
}
@misc{vividh2026,
  title  = {Vividh-ASR},
  year   = 2026,
  note   = {arXiv:2605.13087},
}
@misc{gumbelbeard2026,
  title  = {Gumbel-BEARD},
  year   = 2026,
  note   = {arXiv:2606.11429},
}
@dataset{commonvoice26,
  title  = {Common Voice 26.0},
  author = {Mozilla Foundation},
  url    = {https://huggingface.co/datasets/mozilla-foundation/common_voice_26_0},
}
Downloads last month

-

Downloads are not tracked for this model. How to track
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support

Model tree for erickfmm/whisper-medium-ft-cv_es-dev

Finetuned
(926)
this model

Collections including erickfmm/whisper-medium-ft-cv_es-dev

Papers for erickfmm/whisper-medium-ft-cv_es-dev