Anvil

En vivo

Proyecto personal - QLoRA fine-tuning completado de Llama 3.1 8B para extracción de contratos sintéticos, con 100% de JSON válido, costo medido de $58.46 y un modelo de breakeven de 0.80M tokens al mes.

Rol
Solo - Python, QLoRA, eval, RunPod, modelado de costos
Período
may 2026
Stack
  • Python 3.12
  • uv
  • QLoRA (NF4 + LoRA)
  • Unsloth
  • TRL (SFTTrainer)
  • OpenAI GPT-4o (synthesis and eval)
  • Llama 3.1 8B
  • Hugging Face gated model access
  • RunPod A40
  • Weights & Biases
  • Matplotlib
  • Ruff
  • mypy (strict)
  • pytest
  • GitHub Actions

Qué es

Un artefacto de ingeniería concreto, no un SaaS. Las piezas entregadas:

  • Pipeline de dataset - generó 4,000 NDAs, MSAs y licencias sintéticos vía GPT-4o con validación estricta de JSON schema; curó 3,707 registros aceptados; los dividió en 2,966 de entrenamiento, 371 de validación y 370 de prueba.
  • Entrenamiento - QLoRA (NF4 + LoRA, rank 16, alpha 32, targets all_linear) sobre Llama 3.1 8B con Unsloth en un solo RunPod A40. El run pagado completó 558 pasos de optimización en 8,259 segundos, aproximadamente 2h 18m.
  • Eval - predictores base, fine-tuned y GPT-4o bajo un mismo protocolo, ejecutados sobre el mismo split de prueba de 370 ejemplos y evaluados en validez de JSON más calidad de extracción por campo.
  • Modelo de costos - costo medido del run de entrenamiento (API de síntesis, tiempo de GPU, eval con GPT-4o) más un modelo de $/1M-tokens self-hosted y el volumen de breakeven frente a seguir llamando a GPT-4o.
  • CI y ensayo - el pipeline completo puede ensayarse en un M1 contra fixtures antes de rentar una GPU; el CI cubre parsing, schema, costos, gráficos, preflight, configuración de entrenamiento y utilidades de eval.

Por qué lo construí

Para demostrar que puedo hacer fine-tuning y evaluación de un modelo abierto de punta a punta, con una historia de costos defendible, en lugar de solo llamar a una API hosted. La pregunta útil es si el fine-tuning cierra la brecha con un modelo frontier en una tarea acotada de salida estructurada, y cuánto tiempo tarda el costo único de entrenamiento en amortizarse.

Anvil responde eso con números atados a artefactos concretos: los conteos del dataset, el log de entrenamiento, el JSON de evaluación, las imágenes de gráficos y el reporte de costos son todos reproducibles desde el workflow del repo.

Resultado medido

El modelo base falló el gate estricto de schema: 0% de JSON válido en el split de prueba de 370 casos. El adapter fine-tuned produjo 100% de JSON válido, levemente por encima del 99.73% de validez de GPT-4o en los mismos casos.

Gráfico de barras comparando la validez de JSON para los predictores base, fine-tuned y GPT-4o.
La validez del JSON es el gate: la salida no parseable no recibe crédito en ningún campo.

En el puntaje de extracción por campo, el adapter fine-tuned alcanzó un macro score de 0.899 frente al 0.881 de GPT-4o. La tarea es acotada y sintética, así que lo tomo como evidencia de que el adapter aprendió el schema objetivo y la distribución de campos, no como una afirmación general de que supera a GPT-4o.

Gráfico de barras agrupadas comparando los puntajes de extracción del modelo fine-tuned y GPT-4o por campo de contrato.
Puntaje por campo sobre los contratos sintéticos de prueba.

Cómo funciona

Síntesis de datos con guard anti-contaminación

El set de entrenamiento son contratos sintéticos generados bajo un JSON schema estricto, por lo que cada ejemplo tiene una extracción ground-truth conocida. Antes del entrenamiento, un guard hashea el texto normalizado de cada contrato y aborta el run si algún documento aparece en más de un split. Eso elimina la forma más común en que un benchmark de fine-tuning infla silenciosamente sus propios puntajes.

QLoRA en un solo A40, ensayado en M1

El mismo orquestador que ejecuta el job pagado en RunPod corre en modo dry-run sobre un MacBook M1 base contra fixtures del repo, de punta a punta (data-smoke -> train-smoke -> eval-smoke -> cost) sin ningún gasto en APIs. Ese ensayo debe pasar antes de rentar una GPU pagada.

El run pagado usó un RunPod A40 a $0.44/hr, entrenó por 3 épocas y terminó con train loss 0.346 y eval loss 0.328.

Gráfico de líneas del train loss y validation loss de Anvil a lo largo de 558 pasos de optimización.
El entrenamiento convergió rápido y se mantuvo estable durante el run de 3 épocas en A40.

Eval de tres vías con gate de validez JSON

Los predictores base, fine-tuned y GPT-4o responden los mismos prompts. La validez es el gate: una salida que no parsea contra el schema no recibe crédito en ningún campo, porque un número de F1 sobre JSON no parseable no tiene sentido. Ahí es donde el modelo base colapsa y el fine-tuning se vuelve útil.

Costo y breakeven

El run completo costó $58.46: $54.00 en síntesis, $1.76 en tiempo de GPU A40 y $2.70 en eval con GPT-4o. La línea de inferencia self-hosted está etiquetada intencionalmente como un supuesto configurado de serving en A40, no como un benchmark de serving medido en este proyecto.

Gráfico de barras comparando el costo por millón de tokens del A40 self-hosted configurado en Anvil frente a GPT-4o y Claude Sonnet.
El costo self-hosted usa el supuesto configurado de throughput de serving en A40.

Con esos supuestos, el costo único del run llega al breakeven frente a GPT-4o en 0.80M tokens al mes a lo largo de un horizonte de 12 meses.

Curva de breakeven comparando el costo acumulado del modelo fine-tuned frente a GPT-4o a lo largo de doce meses.
Volumen de breakeven: 0.80M tokens al mes frente a GPT-4o.

Estado

Terminado. El milestone central de Anvil está completo: generación de datos pagada, entrenamiento, evaluación, análisis de costos, gráficos y documentación están listos. Intencionalmente no incluyo la publicación en Hugging Face ni un demo Space como parte del alcance.

Preguntas

¿Qué es Anvil?

Anvil es un artefacto completo de fine-tuning y evaluación para extracción estructurada de contratos. Sintetiza contratos con GPT-4o, cura y divide el dataset, hace fine-tuning de Llama 3.1 8B con QLoRA en un solo A40, y compara predictores base, fine-tuned y GPT-4o sobre el mismo split de prueba.

¿Qué demostró el run pagado?

El adapter fine-tuned alcanzó 100% de JSON válido en 370 contratos de prueba, mientras que el modelo base produjo 0% de JSON válido. También superó levemente a GPT-4o en macro field score: 0.899 frente a 0.881, en este benchmark sintético de extracción.

¿Cómo se mantiene honesta la metodología?

Un guard anti-contaminación hashea el texto normalizado de cada contrato y aborta si algún ejemplo aparece en más de un split. La validez del JSON es requisito para cualquier puntaje, así que una salida que no parsea contra el schema estricto no recibe crédito en ningún campo. El modelo de costos separa el costo medido del run del supuesto configurado de throughput de serving en A40.

¿Cómo se relaciona Anvil con Forge?

Forge responde qué tan barata y rápida es la inferencia self-hosted una vez que se consideran utilización, latencia y cuantización. Anvil responde si un fine-tuning QLoRA pequeño puede cerrar la brecha con una API frontier en una tarea estructurada y acotada.