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 enerickfmm/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) ybest_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(EMAsmu,sigmadel 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(verExperimentos.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:0normal,1clip adaptativo,2rollback.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:
- Reanudar el entrenamiento y dejar que el trainer exporte con
backend.export(ver §Cómo reanudar). - 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_outentrenables (~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
- Repo: https://github.com/erickfmm/training-asr.git
- Commit vigente del run:
b029555(Fix wandb step no monotónico en rollbacks/resume). - Documentación:
README.md,Experimentos.md(historial completo de 9 runs),investigacion.md(reporte de viabilidad ASR/MDD en P40).
Limitaciones
- No es un modelo de inferencia: cargar con
from_pretrainedfallará 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}yrolling_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
eses 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},
}
Model tree for erickfmm/whisper-medium-ft-cv_es-dev
Base model
openai/whisper-medium