← Trabajos

Un fine-tune reproducible con la medición a la vista: tildes del vietnamita con CANINE-s

Prueba propia de portfolio, no un trabajo de cliente. Datos públicos (Wikipedia en vietnamita), modelo con licencia abierta y código en un repositorio que puedes ejecutar tú.

Gráfico de barras de la precisión por sílaba en 5.000 frases de test: copiar la entrada 18,93 %, forma más frecuente de cada sílaba 76,41 %, CANINE-s antes del ajuste 5,58 %, CANINE-s ajustado 94,61 %, con intervalos de confianza del 95 %
Sílabas bien restauradas en 5.000 frases de test de artículos no vistos. Barras de error: IC 95 % (bootstrap por frase), muy estrechos. Generado a partir de results.json del repositorio.
Ver el repositorio en GitHub →github.com/grawwww-studio/canine-vi-diacritics · código MIT · un comando: ./run.sh

El problema

Quien quiere encargar un ajuste fino de un modelo tiene una pregunta razonable: «enséñame un repositorio donde hayas afinado un modelo y medido algo». No una demo, sino algo que se pueda clonar, ejecutar y comprobar. Este es nuestro: un fine-tune pequeño, con la medición antes y después, con las referencias simples con las que hay que compararlo y con una sección de lo que no funcionó.

Qué hicimos

La tarea. Restaurar las marcas del vietnamita: entra una frase con todas las tildes quitadas (la đ pasa a d) y sale la frase correcta. Usamos CANINE-s (Google, unos 0,13B parámetros, trabaja con caracteres, sin vocabulario de tokens) con una capa de clasificación que predice, para cada carácter, qué marcas lleva (36 etiquetas, una de ellas «ninguna»). El texto se reconstruye componiendo cada carácter de entrada con sus marcas, así que el modelo no puede cambiar una letra base: una aserción lo comprueba en cada frase de test (0 cambios).

  • Por qué vietnamita y no árabe. El corpus estándar de diacritización árabe, Tashkeela, es GPL-2.0, y las copias etiquetadas MIT o Apache-2.0 son de procedencia sin verificar (no la comprobamos). La tarea tiene la misma forma (restaurar marcas sobre letras), así que usamos un corpus cuya licencia podíamos leer en la fuente. No se ha ejecutado nada en árabe.
  • Un comando. ./run.sh crea el entorno con versiones fijadas, descarga datos y modelo, prepara las particiones, entrena, evalúa y escribe results.md y results.json. Necesita Linux, una GPU NVIDIA, uv y unos 0,8 GB de descargas.
  • Partición por artículo, sin fugas. Cada frase va a test, validación o entrenamiento según el hash SHA-1 del título del artículo, así que un mismo artículo nunca está en dos partes. Se eliminan duplicados exactos y se comprueba por aserción que ninguna frase de entrenamiento está en test. Usamos 400.000 frases de entrenamiento, 2.000 de validación y 5.000 de test (2.314 artículos).
  • Referencias simples. Un ajuste fino solo significa algo frente a algo. Medimos copiar la entrada y una tabla con la forma más frecuente de cada sílaba vista en el entrenamiento (la referencia que importa), además del modelo sin ajustar.
  • Intervalos de confianza. Bootstrap por frase, 1.000 remuestreos.

Qué medimos

SistemaSílabas bienIC 95 % sílabasLetras bienFrase exacta
Copiar la entrada (sin tildes)18,93 %18,63–19,2474,05 %0,00 %
Referencia: forma más frecuente de cada sílaba vista en el entrenamiento76,41 %76,10–76,7593,09 %4,44 %
CANINE-s antes del ajuste (cabeza aleatoria)5,58 %5,44–5,7355,32 %0,00 %
CANINE-s ajustado (este repositorio)94,61 %94,41–94,8398,41 %47,96 %

Las sílabas son los tokens separados por espacios, sin signos de puntuación, y cuentan solo si coinciden exactamente con el original. La precisión por letra incluye las muchas letras que no llevan marca, por eso «copiar la entrada» no da cero. Pasamos de un 23,59 % de sílabas erróneas con la tabla de formas frecuentes a un 5,39 %.

La fila «antes del ajuste» es el codificador preentrenado con una cabeza inicializada al azar. Demuestra que la tarea no la resuelve el modelo preentrenado solo, pero no es una referencia fuerte: la que cuenta es la tabla de formas frecuentes.

Repetición. Ejecutamos todo el pipeline dos veces desde el mismo entorno fijado. Los tres archivos de datos salieron idénticos byte a byte (sha256). Los resultados del modelo no: 94,58 % la primera vez y 94,61 % la segunda, porque los núcleos de GPU no van en modo determinista. Cuenta con diferencias de unas centésimas de punto entre ejecuciones.

Cuánto cuesta: GPU y VRAM

ConceptoValor
GPUNVIDIA RTX 4090 (compartida con otros trabajos; solo contamos nuestro proceso para la VRAM)
Entrenamiento18.750 pasos, lote 64, 3 épocas sobre 400.000 frases, lr 5e-5, bf16
Tiempo de entrenamiento19,5 min
GPU, entrenar + evaluar (con carga del modelo)0,34 GPU-horas (20,3 min)
VRAM máxima, entrenamiento (asignada / reservada)4,72 / 5,87 GB
VRAM máxima, inferencia sobre el test1,95 GB
Velocidad de inferencia5.990 frases/s (lote 128)
Preparación de datos (CPU)812 s
Pipeline completo (`run.sh`)33,8 min

Coste estimado si se alquilara la misma tarjeta, con la tarifa pública de RunPod leída en https://www.runpod.io/pricing el 2026-10-16 (la página indicaba actualizada el 2026-10-08): RTX 4090, Community Cloud 0,34 $/h, Secure Cloud 0,89 $/h.

AlcanceHorasCommunitySecure
Solo GPU0,34 h0,11 $0,30 $
Pipeline completo, con datos0,56 h0,19 $0,50 $

Es una estimación, no una factura: los precios cambian. Lo ejecutamos en nuestra propia tarjeta y no pagamos GPU.

Ejemplos de errores

Ejemplos del test, con el título del artículo de Wikipedia. La entrada es la frase original sin tildes. En rosa, las sílabas que no coinciden con el original. Son los tres primeros de cada lista, tomados de un barajado con semilla, no elegidos.

El modelo acierta y la referencia falla

Artículo: Wilhelm II, Hoàng đế Đức

Entrada (sin tildes)
Voi tinh khi khac thuong, ong thuong noi the nay nhung lai lam the khac.
Original
Với tính khí khác thường, ông thường nói thế này nhưng lại làm thế khác.
Referencia (formas frecuentes)
Với tỉnh khi khác thường, ông thường nơi thể này những lại làm thể khác.
Modelo ajustado
Với tính khí khác thường, ông thường nói thế này nhưng lại làm thế khác.

Artículo: Darin

Entrada (sin tildes)
Exit bao gom cac bai hat "Nobody Knows", "Playing With Fire", "Check You Out" va "Before I Pass Out", voi phan sau chua cac tinh nang cua rapper Lil Jon.
Original
Exit bao gồm các bài hát "Nobody Knows", "Playing With Fire", "Check You Out" và "Before I Pass Out", với phần sau chứa các tính năng của rapper Lil Jon.
Referencia (formas frecuentes)
Exit bao gồm các bài hát "Nobody Knows", "Playing With Fire", "Check You Out" và "Before I Pass Out", với phần sau chưa các tỉnh năng của rapper Lil Jon.
Modelo ajustado
Exit bao gồm các bài hát "Nobody Knows", "Playing With Fire", "Check You Out" và "Before I Pass Out", với phần sau chứa các tính năng của rapper Lil Jon.

Artículo: Thổ Nhĩ Kỳ

Entrada (sin tildes)
Tai tay bac Tho Nhi Ky, nhom bo toc quan trong nhat tai Thrace la Odyrisia.
Original
Tại tây bắc Thổ Nhĩ Kỳ, nhóm bộ tộc quan trọng nhất tại Thrace là Odyrisia.
Referencia (formas frecuentes)
Tại tây bắc Thổ Nhĩ Kỳ, nhóm bộ tộc quân trong nhất tại Thrace là Odyrisia.
Modelo ajustado
Tại tây bắc Thổ Nhĩ Kỳ, nhóm bộ tộc quan trọng nhất tại Thrace là Odyrisia.

El modelo falla

Artículo: Gia phả

Entrada (sin tildes)
O Tay phuong, nguoi ta co tap tuc lam cay pha he hay pha do, tuong tu nhu Tong do cua nguoi Hoa hay nguoi Viet.
Original
Ở Tây phương, người ta có tập tục làm cây phả hệ hay phả đồ, tương tự như Tông đồ của người Hoa hay người Việt.
Referencia (formas frecuentes)
Ở Tây phương, người ta có tập tục làm cây phá hệ hay phá đó, tướng từ như Tổng đó của người Hoa hay người Việt.
Modelo ajustado
Ở Tây phương, người ta có tập tục làm cây phà hệ hay phá đỡ, tương tự như Tông đồ của người Hoa hay người Việt.

Artículo: Chùa Shwedagon

Entrada (sin tildes)
Stupa (phu do) tung bi hu hai suot mot thoi gian dai va duoc Vua Binnya U cua Hanthawaddy sua lai.
Original
Stupa (phù đồ) từng bị hư hại suốt một thời gian dài và được Vua Binnya U của Hanthawaddy sửa lại.
Referencia (formas frecuentes)
Stupa (phủ đó) từng bị hư hai suốt một thời gian đại và được Vua Binnya U của Hanthawaddy sửa lại.
Modelo ajustado
Stupa (phụ đó) từng bị hư hại suốt một thời gian dài và được Vua Binnya U của Hanthawaddy sửa lại.

Artículo: Adolf Hitler

Entrada (sin tildes)
Trong thoi gian xay ra cuoc khung hoang, Hitler tu bo nhiem minh lam nguoi dung dau Oberkommando des Heeres (Bo Tong tu lenh Luc quan).
Original
Trong thời gian xảy ra cuộc khủng hoảng, Hitler tự bổ nhiệm mình làm người đứng đầu Oberkommando des Heeres (Bộ Tổng tư lệnh Lục quân).
Referencia (formas frecuentes)
Trong thời gian xây ra cuộc khủng hoàng, Hitler từ bộ nhiệm mình làm người dụng đầu Oberkommando des Heeres (Bộ Tổng từ lệnh Lục quân).
Modelo ajustado
Trong thời gian xảy ra cuộc khủng hoảng, Hitler từ bổ nhiệm mình làm người đứng đầu Oberkommando des Heeres (Bộ Tổng tư lệnh Lục quân).

Los pares de errores más frecuentes son cambios entre palabras válidas: loại/loài, từ/tự, con/còn, cùng/cũng, quan/quân, cổ/có.

Qué falla todavía y qué no medimos

  • El acierto por frase es modesto. Menos de la mitad de las frases de test (47,96 %) salen exactas; el 5,4 % de las sílabas es erróneo, así que una frase típica de 22 sílabas tiene aproximadamente un error (110.862 sílabas en 5.000 frases).
  • Ambigüedad que el modelo no puede resolver con una sola frase. Algunos pares son realmente ambiguos sin más contexto, y el modelo ve una frase cada vez.
  • Las convenciones ortográficas son ruido en las etiquetas. Wikipedia mezcla hoá/hóa y Hoà/Hòa (colocación de la tilde). El modelo solo puede adivinar qué estilo usa cada artículo; aquí cuentan como error.
  • Nombres y palabras extranjeras. Los que no llevan marcas pasan sin cambios; los nombres sino-vietnamitas poco frecuentes suelen salir mal.
  • Errores por el camino. El primer entrenamiento falló en validación porque una combinación de marcas imposible cambiaba la longitud del texto (la aserción de la letra base lo detectó y se corrigió). La primera evaluación falló porque un núcleo nativo de torch necesitaba un compilador de C. En la primera ejecución completa, make_results.py falló por un número mal formateado en timing.json y se corrigió a mano solo para esa ejecución; el timing.json del resultado publicado lo escribió el script ya corregido. No se guardaron registros de esos intentos fallidos, salvo la ejecución preliminar de 1 época.
  • No medido: variación entre semillas de entrenamiento (una semilla por ejecución, dos ejecuciones); otras tasas de aprendizaje o tamaños de lote; modelos más grandes o más datos (la validación seguía subiendo despacio al final, de 94,94 % a 95,21 % en los últimos 3.000 pasos); texto fuera de Wikipedia (noticias, chat, OCR); frases de más de 200 caracteres; comparación con sistemas publicados en vietnamita (nuestra partición y filtros son distintos, así que los números no son comparables); velocidad en CPU; cualquier idioma que no sea vietnamita. Las frases de test tienen al menos 5 letras con marca, así que en textos con pocas marcas el resultado puede ser distinto.
  • La VRAM máxima es el pico del asignador de PyTorch de nuestro proceso en una tarjeta compartida con otros trabajos; el tiempo de GPU es el tiempo real de entrenar y evaluar, con la carga del modelo incluida.

Qué recibe un cliente

Lo mismo que ves aquí, aplicado a tus datos: el ajuste de un modelo para un producto, personaje, estilo o tarea, un repositorio o carpeta que se pueda volver a ejecutar, las referencias simples con las que se compara, la medición con tus casos reales antes de entregarlo y una lista honesta de lo que falla y de lo que no hemos medido.

Modelos a medida: desde 450 €, sin IVA. Es un precio de partida: tras la primera conversación, la propuesta cierra el alcance y el precio. Detalle en Equipos técnicos, o escríbenos a hello@grawwww.xyz. Respondemos en menos de 48 horas.

Créditos y licencias

  • Modelo: google/canine-s (CANINE-s), Apache-2.0.
  • Datos: Wikipedia en vietnamita (volcado de 2023-11-01, publicado por Wikimedia en Hugging Face), CC BY-SA y GFDL. Los fragmentos de texto de esta página son de Wikipedia, con el título del artículo; los autores están en el historial de cada artículo. No redistribuimos el corpus ni pesos entrenados.
  • Nuestro código, README y resultados: licencia MIT.
  • Si reentrenas y publicas pesos: léete antes los términos de CC BY-SA. No hemos pedido asesoramiento legal sobre si los pesos son obras derivadas, y no publicamos ninguno.
Código, resultados y licencias en GitHub →github.com/grawwww-studio/canine-vi-diacritics