

# Entrenamiento previo continuo (CPT)
<a name="nova-cpt"></a>

El entrenamiento previo continuo (CPT) es una técnica de entrenamiento que amplía la fase de entrenamiento previo de un modelo básico exponiéndolo a texto adicional sin etiquetar de dominios o corpus específicos. A diferencia del refinamiento supervisado, que requiere combinaciones de entradas y salidas etiquetadas, el CPT entrena con documentos sin procesar para ayudar al modelo a adquirir un conocimiento más profundo de nuevos dominios, aprender terminología y patrones de escritura específicos de cada dominio y adaptarse a tipos de contenido o áreas temáticas particulares.

Este enfoque es particularmente valioso cuando se tienen grandes volúmenes (decenas de miles de millones de tokens) de datos de texto específicos de un dominio, como documentos legales, bibliografía médica, documentación técnica o contenido empresarial patentado, y se desea que el modelo desarrolle una fluidez nativa en ese dominio. Por lo general, después de la fase de CPT, el modelo tiene que pasar por etapas adicionales de ajuste mediante instrucciones para poder utilizar el conocimiento recién adquirido y completar tareas útiles.

**Modelos compatibles**  
El CPT está disponible para los siguientes modelos de Amazon Nova:
+ Nova 1.0 (Micro, Lite, Pro)
+ Nova 2.0 (Lite)

**Cuándo se debe usar Nova 1.0 en lugar de Nova 2.0**  
La familia de modelos de Amazon Nova ofrece varios puntos operativos de relación entre precio y rendimiento para optimizar la precisión, la velocidad y el costo.

Elija Nova 2.0 cuando necesite lo siguiente:
+ Capacidades de razonamiento avanzadas para tareas analíticas complejas
+ Rendimiento superior en codificación, matemáticas y resolución de problemas científicos
+ Soporte de mayor longitud de contexto
+ Mejor rendimiento multilingüe

**nota**  
El modelo más grande no siempre es mejor. Tenga en cuenta la relación costo-rendimiento y los requisitos específicos de su empresa cuando tenga que elegir entre los modelos de Nova 1.0 y Nova 2.0.

# CPT en Nova 2.0
<a name="nova-cpt-2"></a>

Amazon Nova Lite 2.0 es un modelo de razonamiento entrenado con un conjunto de datos más amplio y diverso que Amazon Nova Lite 1.0. A pesar de ser un modelo más grande, Nova Lite 2.0 ofrece inferencias más rápidas que Nova Lite 1.0 y, al mismo tiempo, ofrece capacidades de razonamiento mejoradas, contextos más extensos y un rendimiento multilingüe mejorado.

El CPT de Nova 2.0 le permite ampliar estas capacidades avanzadas con datos específicos del dominio, lo que permite al modelo desarrollar una amplia experiencia en áreas especializadas y, al mismo tiempo, mantener sus excelentes capacidades analíticas y de razonamiento.

## Fórmula del CPT de muestra
<a name="nova-cpt-2-sample-recipe"></a>

A continuación se ofrece una fórmula de muestra para el CPT. Puedes encontrar esta fórmula y otras en el repositorio de [fórmulas](https://github.com/aws/sagemaker-hyperpod-recipes/tree/main/recipes_collection/recipes/training/nova).

```
# Note:
# This recipe can run on p5.48xlarge
# Run config
run:
  name: "my-cpt-run"                           # A descriptive name for your training job
  model_type: "amazon.nova-2-lite-v1:0:256k"   # Model variant specification, do not change
  model_name_or_path: "nova-lite-2/prod"        # Base model path, do not change
  replicas: 8                                   # Number of compute instances for training, allowed values are 4, 8, 16, 32
  data_s3_path: ""                              # Customer data paths
  validation_data_s3_path: ""                   # Customer validation data paths
  output_s3_path: ""                            # Output artifact path,  job-specific configuration - not compatible with standard SageMaker Training Jobs
  mlflow_tracking_uri: ""                       # Required for MLFlow
  mlflow_experiment_name: "my-cpt-experiment"   # Optional for MLFlow. Note: leave this field non-empty
  mlflow_run_name: "my-cpt-run"                 # Optional for MLFlow. Note: leave this field non-empty

## Training specific configs
training_config:
  task_type: cpt
  max_length: 8192                              # Maximum context window size (tokens)
  global_batch_size: 256                        # Global batch size, allowed values are 32, 64, 128, 256.

  trainer:
    max_steps: 10                               # The number of training steps to run total
    val_check_interval: 10                      # The number of steps between running validation. Integer count or float percentage
    limit_val_batches: 2                        # Batches of the validation set to use each trigger

  model:
    hidden_dropout: 0.0                         # Dropout for hidden states, must be between 0.0 and 1.0
    attention_dropout: 0.0                      # Dropout for attention weights, must be between 0.0 and 1.0

  optim:
    optimizer: adam
    lr: 1e-5                                    # Learning rate
    name: distributed_fused_adam                # Optimizer algorithm, do not change
    adam_w_mode: true                           # Enable AdamW mode
    eps: 1e-06                                  # Epsilon for numerical stability
    weight_decay: 0.0                           # L2 regularization strength, must be between 0.0 and 1.0
    adam_beta1: 0.9                             # Beta1 for Adam optimizer
    adam_beta2: 0.95                            # Beta2 for Adam optimizer
    sched:
      warmup_steps: 10                          # Learning rate warmup steps
      constant_steps: 0                         # Steps at constant learning rate
      min_lr: 1e-6                              # Minimum learning rate, must be lower than lr
```

## Preparación de datos para el CPT en 2.0
<a name="nova-cpt-2-data-prep"></a>

**Requisitos del formato de los datos**  
Los conjuntos de datos de entrenamiento y validación deben ser archivos JSONL que siguen el formato que se muestra más abajo, donde cada línea contiene un objeto JSON que representa una conversación con la estructura y los campos requeridos. A continuación se muestra un ejemplo:

```
{"text": "AWS stands for Amazon Web Services"}
{"text": "Amazon SageMaker is a fully managed machine learning service"}
{"text": "Amazon Bedrock is a fully managed service for foundation models"}
```

Las entradas de texto deben incluir contenido fluido y de alta calidad que represente el dominio de destino.

Compruebe que los datos se puedan convertir al [formato Arrow](https://huggingface.co/docs/datasets/en/about_arrow). Use el script de Python que aparece a continuación como ayuda. Asegúrese de utilizar como mínimo la versión `datasets==2.18.0`:

```
from datasets import load_dataset, load_from_disk
from pathlib import Path

input_path = Path("<Your jsonl file>")
output_path = Path("<Your output directory>")

dataset = load_dataset("json", data_files=str(input_path), split="train")
dataset.save_to_disk(str(output_path), max_shard_size="1GB")

try:
  test_dataset = datasets.load_from_disk(output_dir)
  print(f"Dataset loaded successfully ✅! Contains {len(test_dataset)} samples")
except Exception as e:
  print(e)
```

Debe imprimir el mismo número de líneas que había en el archivo JSONL.

Cuando utilice la mezcla de datos, ejecute el primer trabajo con `max_steps=2`. Esto ayudará a crear optimizaciones en el clúster para el acceso a los datos y a validar que todas las mezclas de datos estén disponibles.

**Cómo se preparan los datos para el CPT**  
Los datos de entrenamiento son el factor determinante más importante para el éxito del entrenamiento previo continuo. Si bien los datos del CPT suelen describirse como “no etiquetados”, la realidad es mucho más matizada. La forma en que se estructuran, formatean y presentan los datos determina si el modelo adquirirá las habilidades y los conocimientos necesarios para el caso de uso empresarial.

### Preparación de conjuntos de datos empresariales estructurados para el CPT
<a name="nova-cpt-2-structured-data"></a>

Este es un desafío común para las empresas y organizaciones que crean modelos básicos especializados en su dominio. La mayoría de las empresas poseen amplios repositorios de datos estructurados: catálogos de productos, perfiles de usuarios, registros de transacciones, envíos de formularios, llamadas a la API y metadatos operativos. A primera vista, su aspecto es muy diferente del texto web no estructurado que se suele utilizar en el entrenamiento previo estándar.

Para aprender eficazmente de los datos empresariales estructurados, piense detenidamente en las tareas descendentes y diseñe la presentación de los datos para obligar al modelo a aprender las relaciones predictivas correctas.

Para aprovechar todo el potencial del entrenamiento previo continuo, tenga en cuenta lo siguiente:
+ Qué tareas debe llevar a cabo el modelo en el momento de la inferencia
+ Qué información está presente en los datos sin procesar
+ Cómo se estructuran los datos para que el modelo aprenda a extraer y manipular la información correctamente

El simple hecho de incluir datos estructurados en el entrenamiento no enseñará al modelo a razonar al respecto. Diseñe activamente la presentación de los datos para guiar lo que aprende el modelo.

En las siguientes secciones, se analiza la bibliografía que demuestra la importancia del aumento de datos y se proporcionan ejemplos de estrategias de ampliación de datos empresariales estructurados que aportarán ideas útiles sobre cómo tratar y organizar los conjuntos de datos empresariales para el CPT.

**Datos estructurados para el CPT en la bibliografía**  
El CPT puede empaquetar hechos del dominio en el modelo, pero a menudo no logra que esos datos se puedan recuperar o manipular cuando cambian las entradas o las tareas. Los experimentos controlados muestran que, si no se efectúa un aumento de la diversidad durante el entrenamiento previo, los modelos memorizan datos de forma frágil y resulta difícil extraerlos incluso después de ajustar las instrucciones posteriormente, por lo que se recomienda inyectar las instrucciones en forma de señales al principio del entrenamiento. En el caso de los datos semiestructurados, la serialización por asignación al azar y otros aumentos reducen el sobreajuste del esquema, razón por la cual el CPT debería intercalarse con tareas de tipo instructivo en lugar de ejecutarlas primero seguidas de IFT. Un trabajo centrado en las finanzas revela además que la combinación conjunta de los datos de instrucciones y el CPT en trabajos por lotes mejora la generalización y reduce el olvido en comparación con la fórmula secuencial. El informe técnico de Qwen sigue el mismo patrón al integrar datos de instrucciones de alta calidad en el propio entrenamiento previo, lo que impulsa el aprendizaje contextual y conserva el seguimiento de instrucciones mientras se adquieren nuevos conocimientos del dominio.

El aumento de datos para corpus semiestructurados es un factor clave. El CPT basado en grafos sintéticos amplía los conjuntos de dominios pequeños hasta convertirlos en corpus vinculados a entidades que enseñan de forma explícita las relaciones y los compuestos mediante la recuperación en el momento de la inferencia. El CPT conjunto, junto con la combinación de instrucciones, supera a las canalizaciones secuenciales en un dominio de finanzas, mientras que el equilibro del dominio con los datos generales reduce la degradación de las habilidades generales. El CPT de dominio a gran escala también puede retener una amplia capacidad e incluso permitir compensaciones a través de la fusión de modelos, pero se sigue considerando que el ajuste de las instrucciones es el siguiente paso esencial, lo que refuerza el valor de ingresar señales de instrucciones durante el CPT.

**Inyección de diversidad mediante la asignación al azar y la mezcla**  
Una estrategia general que ayuda a enseñar al modelo de manera eficaz a partir de los conjuntos de datos estructurados y semiestructurados consiste en mezclar el orden de los campos de los conjuntos de datos e, incluso, omitir algunas claves de forma aleatoria.

Al mezclar los campos, el modelo debe leer el significado de cada valor en lugar de dónde aparece y aprender las relaciones entre todos los campos. Por ejemplo, en el caso de un videojuego publicado en la tienda de Amazon, cuando “Título”, “Plataforma”, “Precio”, “Estado” y “Edición” aparecen en diferentes combinaciones, el modelo no puede confiar en que “el tercer espacio sea la plataforma”; debe vincular las etiquetas a los valores y aprender las relaciones bilaterales entre los atributos: título ⇄ plataforma, plataforma ⇄ precio, condición ⇄ precio. Por lo tanto, puede, por ejemplo, deducir una plataforma probable a partir del nombre de un juego y un precio observado, o estimar un rango de precios plausible en función de un título y una plataforma.

Si se entregan las claves de forma aleatoria durante la serialización, se produce como si se eliminaran las características: se impide la adaptación simultánea en un campo concreto y se obliga al modelo a recuperar la información que falta a partir de las pruebas restantes. Si no aparece la palabra “Plataforma”, el modelo debe seleccionarla de la cadena de título o del texto de compatibilidad; si “Precio” está oculto, debe separar la plataforma, la edición y el estado. Esto genera simetría (A→B y B→A), robustez ante listados reales desordenados e invariabilidad del esquema cuando faltan campos, se les cambia el nombre o se reordenan.

Un ejemplo de estilo de compra lo concreta. Serialice el mismo objeto de varias formas (“Título: 'Elden Ring' \$1 Plataforma: PlayStation 5 \$1 Estado: Usado, como nuevo \$1 Precio: 34,99 USD” y una permutación como “Precio: 34,99 USD \$1 Título: 'Elden Ring' \$1 Estado: Usado, como nuevo \$1 Plataforma: PlayStation 5”) y, en algunas ocasiones, agregue “Plataforma” y deje “Compatible con PS5” en la descripción. Entrene objetivos complementarios, como predecir la plataforma a partir de \$1título, precio\$1 y predecir un bucket de precio a partir de \$1título, plataforma\$1. Como el orden e incluso la presencia de las claves varían, la única estrategia estable es aprender las verdaderas relaciones entre los atributos en lugar de memorizar una plantilla.

### Importancia de la forma en que se presentan los datos
<a name="nova-cpt-2-data-presentation"></a>

Los LLM aprenden mediante la predicción del siguiente token a partir de lo que ya han visto. Por lo tanto, el orden de los campos y eventos que se muestran durante el entrenamiento decide lo que el modelo puede aprender. Si el formato de entrenamiento coincide con la tarea real, la pérdida recae en los tokens de decisión exactos. Si los campos se agrupan sin estructura, el modelo aprende los atajos o memoriza su popularidad y, después, falla cuando se le pide que elija entre las opciones.

Muestre primero la situación, después las opciones y, por último, la decisión. Si el modelo también debe conocer los resultados o las explicaciones, colóquelos después de la decisión.

### Empaquetado de muestras para el CPT
<a name="nova-cpt-2-packing"></a>

**¿Qué es el empaquetado?**  
Simplemente significa llenar cada ventana de secuencia de los datos de entrenamiento con varios ejemplos completos para que la ventana esté llena de tokens reales, no de relleno.

**¿Por qué importa?**  
Durante el entrenamiento, se establece una longitud máxima de contexto; por ejemplo, 8192 tokens. Los lotes tienen la forma de [tamaño del lote × longitud del contexto]. Si un ejemplo de entrenamiento es más corto que la longitud del contexto, las posiciones restantes se rellenan. El relleno se sigue ejecutando en los kernels de atención y MLP, incluso si se oculta la pérdida, por lo que se paga el cálculo por los símbolos que no transmiten ninguna señal de aprendizaje.

**¿Cómo se empaqueta?**  
Para empaquetar varias muestras, concatene varias muestras de entrenamiento con un separador ` [DOC] ` en medio (observe el espacio antes y después de [DOC]) de manera que la longitud total de las muestras esté por debajo de la longitud de contexto deseada.

Un documento empaquetado de ejemplo tendría el siguiente aspecto:

```
{"text": "training sample 1 [DOC] training sample 2 [DOC] training sample 3"}
```

### Parámetros de ajuste del CPT
<a name="nova-cpt-2-tuning-parameters"></a>

Entre los parámetros disponibles para el refinamiento con CPT, se incluyen los siguientes:

**Configuración de una ejecución**  

+ **name**: nombre descriptivo para el trabajo de entrenamiento. Ayuda a identificar el trabajo en la Consola de administración de AWS.
+ **model\$1type**: variante del modelo de Amazon Nova que desea utilizar. Las opciones disponibles son `amazon.nova-2-lite-v1:0:256k`.
+ **model\$1name\$1or\$1path**: ruta al modelo base que desea utilizar para el entrenamiento. Las opciones disponibles son `nova-lite-2/prod` o la ruta de S3 para el punto de comprobación de entrenamiento posterior (`s3://customer-escrow-bucket-unique_id/training_run_name`).
+ **replicas**: número de instancias de computación que desea utilizar para entrenamiento distribuido. Los valores disponibles varían en función del modelo que elija. Amazon Nova Lite 2.0 admite 4, 8, 16 o 32 réplicas.
+ **data\$1s3\$1path**: ubicación de S3 del conjunto de datos de entrenamiento, que es un archivo JSONL. Este archivo debe residir en la misma región y cuenta de AWS que el clúster. Todas las ubicaciones de S3 proporcionadas deben estar en la misma cuenta y región.
+ **validation\$1data\$1s3\$1path** (opcional): ubicación de S3 del conjunto de datos de validación, que es un archivo JSONL. Este archivo debe residir en la misma cuenta y región que el clúster. Todas las ubicaciones de S3 proporcionadas deben estar en la misma cuenta y región.
+ **output\$1s3\$1path**: ubicación de S3 donde se almacenan el manifiesto y los registros de TensorBoard. Todas las ubicaciones de S3 proporcionadas deben estar en la misma cuenta de AWS y región de AWS.
+ **mlflow\$1tracking\$1uri**: ARN de la aplicación de MLFlow que se usará para los registros de MLFlow
+ **mlflow\$1experiment\$1name**: nombre del experimento de MLFlow
+ **mlflow\$1run\$1name**: nombre de la ejecución de MLFlow

**Configuración de entrenamiento**  

+ **max\$1length**: longitud máxima de la secuencia en tokens. Determina el tamaño de la ventana de contexto para entrenamiento. El valor máximo admitido es de 8192 tokens para CPT.

  Las secuencias más largas mejorarán la eficiencia del entrenamiento a costa de aumentar los requisitos de memoria. Es recomendable que el parámetro max\$1length coincida con la distribución de datos.
+ **global\$1batch\$1size**: número total de muestras de entrenamiento procesadas juntas en una sola pasada hacia delante o hacia atrás en todos los dispositivos y trabajadores.

  Este valor multiplica el tamaño del lote por dispositivo y el número de dispositivos. Afecta a la estabilidad del entrenamiento y al rendimiento. Le recomendamos que comience con un tamaño de lote que se ajuste fácilmente a la memoria y, a partir de ahí, se escale verticalmente. En el caso de datos específicos de un dominio, es posible que los lotes de mayor tamaño suavicen en exceso los gradientes.

**Configuración del entrenador**  

+ **max\$1steps**: número de pasos de entrenamiento que se ejecutarán. Cada paso entrenará al modelo con el número de elementos de `global_batch_size`

**Configuración del modelo**  

+ **hidden\$1dropout**: probabilidad de eliminar salidas de estado ocultas. Aumente este valor aproximadamente 0,0-0,2 para reducir el ajuste excesivo en conjuntos de datos más pequeños. Los valores válidos van de 0 a 1, ambos inclusive.
+ **attention\$1dropout**: probabilidad de perder ponderaciones de atención. Este parámetro puede ayudar en la generalización. Los valores válidos van de 0 a 1, ambos inclusive.

**Configuración del optimizador**  

+ **lr**: tasa de aprendizaje, que controla el tamaño de los pasos durante la optimización. Recomendamos valores entre 1e-6-1e-4 para un buen rendimiento. Los valores válidos van de 0 a 1, ambos inclusive.
+ **name**: algoritmo del optimizador. En la actualidad, solo se admite `distributed_fused_adam`.
+ **weight\$1decay**: fuerza de regularización de L2. Los valores más altos (entre 0,01 y 0,1) aumentan la regularización.
+ **warmup\$1steps**: número de pasos para aumentar gradualmente la tasa de aprendizaje. Mejora la estabilidad del entrenamiento. Los valores válidos van de 1 a 20, ambos inclusive.
+ **min\$1lr**: tasa mínima de aprendizaje al final de la degradación. Los valores válidos van de 0 a 1, ambos inclusive, pero deben ser inferiores a la tasa de aprendizaje.