Esta guía práctica recorre cada paso del ajuste de un modelo de Amazon Nova con el SDK de Amazon Nova Forge, desde la preparación de datos hasta el entrenamiento con combinación de datos y la evaluación, brindándole un manual repetible que puede adaptar a su propio caso de uso. Esta es la segunda parte de nuestra serie Nova Forge SDK, que se basa en la introducción del SDK y la primera parte, que cubrió el inicio de experimentos de personalización.
El enfoque de esta publicación es la mezcla de datos: la técnica que le permite ajustar datos específicos del dominio sin sacrificar las capacidades generales de un modelo. En la publicación anterior, explicamos por qué esto es importante, al combinar datos de clientes con conjuntos de datos seleccionados por Amazon se mantuvieron puntajes de comprensión masiva del lenguaje multitarea (MMLU) casi básicos y, al mismo tiempo, se brindó una mejora F1 de 12 puntos en una tarea de clasificación de la voz del cliente que abarca 1,420 categorías de hojas. Por el contrario, ajustar un modelo de código abierto basándose únicamente en los datos de los clientes provocó una pérdida casi total de capacidades generales. Ahora te enseñamos cómo hacerlo tú mismo.
Descripción general de la solución
El flujo de trabajo consta de cinco etapas:
Configuración del entorno: instale el SDK de Nova Forge y configure los recursos de AWS Preparación de datos: cargue, desinfecte, transforme, valide y divida sus datos de entrenamiento Configuración de entrenamiento: configure el tiempo de ejecución de Amazon SageMaker HyperPod, el seguimiento del flujo de ML y las proporciones de mezcla de datos Entrenamiento del modelo: inicie y monitoree un trabajo de ajuste supervisado con Adaptación de rango bajo (LoRA) Evaluación del modelo: ejecute puntos de referencia públicos y evaluaciones específicas del dominio en comparación con el punto de control ajustado
Requisitos previos
Antes de comenzar, asegúrese de tener lo siguiente:
Una cuenta de AWS con acceso a Amazon Nova Forge. Un clúster HyperPod de SageMaker provisto de instancias de GPU. Este tutorial utiliza instancias `ml.p5.48xlarge`. La configuración de un clúster HyperPod implica configurar un clúster de Amazon Elastic Kubernetes Service (Amazon EKS), aprovisionar nodos informáticos y crear roles de ejecución. Para obtener instrucciones detalladas, consulte Introducción a SageMaker HyperPod. Una aplicación Amazon SageMaker MLflow para el seguimiento de experimentos. Una función de IAM con permisos para SageMaker, Amazon Simple Storage Service (Amazon S3) y Amazon CloudWatch. Una computadora portátil SageMaker Studio o un entorno Jupyter similar.
Consideración de costos: este tutorial utiliza 4 instancias `ml.p5.48xlarge` para capacitación y evaluación. Estas son instancias de GPU de alta gama. Recomendamos comenzar con una ejecución de prueba breve (max_steps=5) para validar su configuración antes de comprometerse con una ejecución de entrenamiento completa. Para conocer las tarifas actuales, consulte la página de precios de Amazon SageMaker.
Paso 1: Instale el SDK y las dependencias de Nova Forge
El SDK requiere las herramientas CLI de SageMaker HyperPod. Descárguelo e instálelo desde el depósito de distribución de Nova Forge S3 (proporcionado durante la incorporación de Nova Forge) o utilice el siguiente script de instalación fácil de usar que instala las dependencias del depósito privado de S3 y configura un entorno virtual.
A continuación, dentro del mismo entorno virtual, instale también el SDK de Nova Forge (nova-forge-sdk), que proporciona API de alto nivel para la preparación, capacitación y evaluación de datos.
Una vez instaladas todas las dependencias, active el entorno virtual y configúrelo como kernel para usarlo dentro de un entorno de notebook Jupyter.
Verifique la instalación:
de amzn_nova_forge import * print("SDK importado correctamente")
Paso 2: configurar los recursos de AWS
Cree un depósito de S3 para sus datos de entrenamiento y resultados del modelo. Luego, otorgue acceso a su rol de ejecución de HyperPod.
importar boto3 importar hora importar json TIMESTAMP = int(time.time()) S3_BUCKET = f"nova-forge-customisation-{TIMESTAMP}" S3_DATA_PATH = f"s3://{S3_BUCKET}/demo/input" S3_OUTPUT_PATH = f"s3://{S3_BUCKET}/demo/output" sts = boto3.client("sts") s3 = boto3.client("s3") ACCOUNT_ID = sts.get_caller_identity()["Account"] REGION = boto3.session.Session().region_name # Cree el depósito S3 si REGION == "us-east-1": s3.create_bucket(Bucket=S3_BUCKET) else: s3.create_bucket( Bucket=S3_BUCKET, CreateBucketConfiguration={"LocationConstraint": REGION} ) # Otorgar acceso al rol de ejecución de HyperPod HYPERPOD_ROLE_ARN = f"arn:aws:iam::{ACCOUNT_ID}:role/ "bucket_policy = { "Version": "2012-10-17", "Statement": [{ "Sid": "AllowHyperPodAccess", "Efecto": "Permitir", "Principal": {"AWS": HYPERPOD_ROLE_ARN}, "Acción": ["s3:GetObject", "s3:PutObject", "s3:DeleteObject", "s3:ListBucket"], "Recurso": [ f"arn:aws:s3:::{S3_BUCKET}", f"arn:aws:s3:::{S3_BUCKET}/*" ] }] } s3.put_bucket_policy(Bucket=S3_BUCKET, Policy=json.dumps(bucket_policy))
Paso 3: prepare su conjunto de datos de entrenamiento
El SDK de Nova Forge admite formatos de entrada JSONL, JSON y CSV. En este tutorial, utilizamos el conjunto de datos MedReason disponible públicamente de Hugging Face. El conjunto de datos contiene razonamiento médico con aproximadamente 32 700 pares de preguntas y respuestas para demostrar el ajuste para un caso de uso específico de un dominio.
Descargar y desinfectar los datos
El SDK de Nova Forge aplica la validación a nivel de token en los datos de entrenamiento. Ciertos tokens entran en conflicto con la plantilla de chat interna del modelo, específicamente los delimitadores especiales que Nova usa para separar los turnos del sistema, el usuario y el asistente durante el entrenamiento. Si sus datos contienen cadenas literales como "Sistema:" o "Asistente:", el modelo puede malinterpretarlas como límites de giro, corrompiendo la señal de entrenamiento. El siguiente paso de desinfección inserta un espacio antes de los dos puntos (por ejemplo, Sistema: → Sistema 🙂 para romper la coincidencia del patrón y al mismo tiempo preservar la legibilidad, y elimina tokens especiales como [EOS] y que tienen un significado reservado en el vocabulario del modelo.
desde huggingface_hub importar hf_hub_download
importar pandas como pd
importar json
importar re
# Descargar el conjunto de datos
jsonl_path = hf_hub_download(
repo_id=”UCSC-VLAA/MedReason”,
nombre de archivo = ”nuestra_calidad_33000.jsonl”,
repo_type = "conjunto de datos",
local_dir=”.”
)
df = pd.read_json(jsonl_path, líneas=Verdadero)
# Tokens que entran en conflicto con la plantilla de chat del modelo
INVALID_TOKENS = [
“Sistema:”, “SISTEMA:”, “Usuario:”, “USUARIO:”, “Bot:”, “BOT:”,
“Asistente:”, “Asistente:”, “Pensamiento:”, “[EOS]”,
“”, “”, “”,
]
def sanitize_text(texto):
para token en INVALID_TOKENS:
si ":" en el token:
palabra = token[:-1]
texto = re.sub(rf'b{palabra}:', f'{palabra} :', texto, banderas=re.IGNORECASE)
demás:
texto = texto.reemplazar(token, “”)
devolver texto.strip()
# Escribir JSONL desinfectado
con open(“training_data.jsonl”, “w”) como f:
para _, fila en df.iterrows():
f.write(json.dumps({
“pregunta”: sanitize_text(fila[“pregunta”]),
“respuesta”: sanitize_text(fila[“respuesta”]),
}) + “n”)
print(f”Conjunto de datos guardado: Training_data.jsonl ({len(df)} ejemplos)”)
Para validar si sus datos tienen alguna palabra clave reservada, ejecute este script.
Cargar, transformar y validar con el SDK
El SDK proporciona un JSONLDatasetLoader que maneja la conversión de su formato de datos sin procesar a la estructura esperada por los modelos Nova. Cuando llama a transform(), el SDK envuelve cada par de preguntas y respuestas en el formato de plantilla de chat de Nova, que es el formato estructurado por turnos que los modelos Nova esperan durante el entrenamiento. Sus datos sin procesar van desde simples pares de preguntas y respuestas hasta conversaciones de varios turnos completamente formateadas con las etiquetas de roles y delimitadores adecuados.
Antes de la transformación (su JSONL sin formato):
{ "question": "¿Cuáles son las causas del dolor en el pecho en un paciente de 45 años?", "answer": "El dolor en el pecho en un paciente de 45 años puede deberse a causas cardíacas como…" }
Después de la transformación (formato de plantilla de chat Nova):
{ "messages": [ {"role": "user", "content": "¿Cuáles son las causas del dolor en el pecho en un paciente de 45 años?"}, {"role": "assistant", "content": "El dolor en el pecho en un paciente de 45 años puede deberse a causas cardíacas como…"} ] }
Luego, el método validar() verifica los datos transformados en busca de problemas, verificando que la estructura de la plantilla de chat sea correcta, que no queden tokens no válidos y que los datos cumplan con los requisitos del modelo y método de entrenamiento elegidos.
# Inicialice el cargador, mapeando los nombres de sus columnas loader = JSONLDatasetLoader( question="question", respuesta="answer", ) loader.load("training_data.jsonl") # Vista previa de datos sin procesar loader.show(n=3) # Transforme al formato de plantilla de chat esperado de Nova loader.transform(method=TrainingMethod.SFT_LORA, model=Model.NOVA_LITE_2) # Vista previa de los datos transformados para verificar la estructura loader.show(n=3) # Validar: imprime "Validación completada" si se realiza correctamente loader.validate(method=TrainingMethod.SFT_LORA, model=Model.NOVA_LITE_2) train_path = loader.save(f"{S3_DATA_PATH}/train.jsonl") print(f"Datos de entrenamiento: {train_path}")
Paso 4: Configurar e iniciar la capacitación con combinación de datos
Cuando habilita la combinación de datos, Nova Forge combina automáticamente los datos de entrenamiento específicos de su dominio con conjuntos de datos seleccionados por Amazon durante el ajuste. Esto evita que el modelo olvide sus capacidades generales mientras aprende su dominio.
Una nota sobre los métodos de entrenamiento: LoRA versus SFT de rango completo
Nova Forge admite múltiples enfoques de ajuste. En este tutorial, utilizamos el ajuste fino supervisado (SFT) con LoRA (TrainingMethod.SFT_LORA), que es un método eficiente en parámetros que actualiza solo un pequeño conjunto de pesos de adaptadores de rango bajo en lugar de todos los parámetros del modelo. LoRA ofrece una capacitación más rápida, menores costos informáticos y es el punto de partida recomendado para la mayoría de los casos de uso.
Nova Forge también admite SFT de rango completo, que actualiza todos los parámetros del modelo y puede incorporar más conocimiento del dominio. Sin embargo, requiere más computación y es más susceptible a un olvido catastrófico (lo que hace que la combinación de datos sea aún más importante). La publicación anterior de esta serie demuestra los resultados utilizando SFT de rango completo. Elija rango completo cuando LoRA no logre un rendimiento de dominio suficiente o cuando necesite una adaptación más profunda del modelo.
Configurar el tiempo de ejecución y MLflow
de amzn_nova_customization_sdk.model.model_enums importar plataforma nombre_clúster = "nova-forge-hyperpod" tipo_instancia = "ml.p5.48xlarge" recuento_instancia = 4 espacio de nombres = "kubeflow" tiempo de ejecución = SMHPRuntimeManager (tipo_instancia = tipo_instancia, recuento_instancia = recuento_instancia, nombre_clúster = nombre_clúster, espacio de nombres = espacio de nombres,) MLFLOW_APP_ID = "" # por ejemplo, "app-XXXXXXXXXXXX" mlflow_app_arn = f"arn:aws:sagemaker:{REGION}:{ACCOUNT_ID}:mlflow-app/{MLFLOW_APP_ID}" mlflow_monitor = MLflowMonitor(tracking_uri=mlflow_app_arn, experiment_name="nova-sft-datamix",)
Cree el personalizador con la combinación de datos habilitada
Pase data_mixing_enabled=True al construir NovaModelCustomizer:
personalizador = NovaModelCustomizer( model=Model.NOVA_LITE_2, método=TrainingMethod.SFT_LORA, infra=runtime, data_s3_path=f"{S3_DATA_PATH}/train.jsonl", output_s3_path=f"{S3_OUTPUT_PATH}/", mlflow_monitor=mlflow_monitor, data_mixing_enabled=True,)
Comprender y ajustar la configuración de mezcla de datos
La mezcla de datos controla cómo se componen los lotes de entrenamiento. El parámetro customer_data_percent determina qué fracción de cada lote proviene de los datos de su dominio. La fracción restante se completa con conjuntos de datos seleccionados por Nova, y cada parámetro nova_*_percent controla el peso relativo de esa categoría de capacidad dentro de la porción de Nova.
Por ejemplo, con la siguiente configuración:
El 50 % de cada lote de capacitación consta de datos de su dominio. El 50 % consta de datos seleccionados por Nova, distribuidos en categorías de capacidad según sus pesos relativos.
Los porcentajes del lado de Nova deben sumar 100. Cada valor representa la participación de esa categoría en la parte del lote seleccionada por Nova.
# Ver las proporciones de mezcla predeterminadascustomer.get_data_mixing_config()
Puede anular estas proporciones según sus prioridades:
personalizar.set_data_mixing_config({ "customer_data_percent": 50, "nova_agents_percent": 1, "nova_baseline_percent": 10, "nova_chat_percent": 0,5, "nova_factuality_percent": 0,1, "nova_identity_percent": 1, "nova_long-context_percent": 1, "nova_math_percent": 2, "nova_rai_percent": 1, "nova_instruction-following_percent": 13, "nova_stem_percent": 10.5, "nova_planning_percent": 10, "nova_reasoning-chat_percent": 0.5, "nova_reasoning-code_percent": 0.5, "nova_reasoning-factuality_percent": 0.5, "nova_reasoning-instruction-following_percent": 45, "nova_reasoning-math_percent": 0,5, "nova_reasoning-planning_percent": 0,5, "nova_reasoning-rag_percent": 0,4, "nova_reasoning-rai_percent": 0,5, "nova_reasoning-stem_percent": 0,4, "nova_rag_percent": 1, "nova_translation_percent": 0,1, })
Cómo pensar en afinar la mezcla
Parámetro Qué controla Orientación customer_data_percent Participación de los datos de su dominio en cada lote de entrenamiento. Los valores más altos impulsan una mayor especialización en el dominio, pero aumentan el riesgo de olvido. El 50% es un punto de partida equilibrado. nova_instruction-following_percent Peso de ejemplos de seguimiento de instrucciones en la parte Nova. Manténgalo alto si su modelo necesita seguir indicaciones estructuradas o formatos de salida en producción. nova_reasoning-*_percent Ponderaciones para diversas capacidades de razonamiento (matemáticas, código, planificación, etc.). Auméntelos si sus tareas posteriores requieren un razonamiento de varios pasos. nova_rai_percent Datos de alineación de IA responsable. Mantenga siempre este valor distinto de cero para preservar los comportamientos de seguridad. nova_baseline_percent Conocimiento fáctico básico. Ayuda a retener un amplio conocimiento mundial.
Consejo: comience con los valores predeterminados, ejecute un trabajo de capacitación, evalúe tanto la tarea de su dominio como la MMLU, luego repita. El puesto Creación de IA especializada sin sacrificar inteligencia muestra que incluso una división de 75/25 entre cliente y Nova preserva el MMLU cercano al valor base (0,74 frente a 0,75 de referencia) al tiempo que ofrece una mejora F1 de 12 puntos en una tarea de clasificación compleja.
Iniciar el trabajo de formación
El parámetro de anulación le permite controlar los hiperparámetros de entrenamiento clave:
Parámetro Descripción Orientación lr La tasa de aprendizaje 1e-5 es un valor predeterminado razonable para el ajuste fino de LoRA. warmup_steps Pasos para aumentar linealmente la tasa de aprendizaje desde 0. Normalmente, entre el 5% y el 10% del total de pasos. Establecer proporcionalmente a max_steps. global_batch_size Número de ejemplos por actualización de gradiente en todas las GPU. Los lotes más grandes proporcionan gradientes más estables pero utilizan más memoria. max_length Longitud máxima de secuencia en tokens Establecida según sus datos. 65536 admite casos de uso de contexto prolongado; reduzca para obtener datos más cortos para ahorrar memoria y acelerar el entrenamiento. max_steps Total de pasos de entrenamiento Comience poco a poco (5 a 10) para validar su configuración y luego aumente. Para ~23.000 ejemplos de entrenamiento con un tamaño de lote 32, una época completa ≈ 720 pasos. Training_config = { "lr": 1e-5, "warmup_steps": 2, "global_batch_size": 32, "max_length": 65536, "max_steps": 5, # Comience poco a poco para validar; aumento para ejecuciones de producción } Training_result = Customizer.train( job_name="nova-forge-sft-datamix", overrides=training_config, ) Training_result.dump("training_result.json") print("Resultado del entrenamiento guardado")
Monitorear el progreso del entrenamiento
Puede monitorear el trabajo a través del SDK o CloudWatch:
# Verificar el estado del trabajo print(training_result.get_job_status()) # Transmitir registros recientes personalizador.get_logs(limit=50, start_from_head=False) # O usar el monitor de CloudWatch monitor = CloudWatchLogMonitor.from_job_result(training_result) monitor.show_logs(limit=10) # Sondear hasta completar el tiempo de importación mientras que Training_result.get_job_status()[1]== "En ejecución": tiempo.dormir(60)
Las métricas de entrenamiento (curvas de pérdida, programa de tasa de aprendizaje) también están disponibles en su experimento de MLflow para visualización y comparación entre ejecuciones.
Paso 5: evaluar el modelo ajustado
La evaluación es fundamental cuando utiliza la combinación de datos porque necesita medir dos cosas simultáneamente: si su modelo mejoró en su tarea de dominio y si conservó sus capacidades generales. Si mide solo un eje, no podrá saber si la combinación está funcionando. Una vez finalizado el entrenamiento, recupere la ubicación del punto de control del modelo del manifiesto de salida:
de amzn_nova_forge.util.checkpoint_util importar extract_checkpoint_path_from_job_output checkpoint_path = extraer_checkpoint_path_from_job_output(output_s3_path=training_result.model_artifacts.output_s3_path, job_result=training_result,)
Configurar la infraestructura de evaluación
La evaluación requiere solo una instancia de GPU (en comparación con 4 para el entrenamiento):
eval_infra = SMHPRuntimeManager( tipo_instancia=tipo_instancia, recuento_instancia=1, nombre_clúster=nombre_clúster, espacio de nombres=espacio de nombres, ) eval_mlflow = MLflowMonitor( seguimiento_uri=mlflow_app_arn, nombre_experimento="nova-forge-eval", ) evaluador = NovaModelCustomizer( modelo=Model.NOVA_LITE_2, método=TrainingMethod.EVALUATION, infra=eval_infra, output_s3_path=f"s3://{S3_BUCKET}/demo/eval-outputs/", mlflow_monitor=eval_mlflow, )
Ejecutar evaluaciones
Nova Forge admite tres enfoques de evaluación complementarios:
1. Puntos de referencia públicos (utilizados para medir la retención de capacidad general)
Estos le indican si la combinación de datos está haciendo su trabajo. Si MMLU cae significativamente desde la línea de base, su mezcla necesita más datos de Nova. Si el IFEval cae, aumente el peso siguiendo las instrucciones.
# MMLU: amplio conocimiento y razonamiento en 57 temas mmlu_result = evaluador.evaluate( job_name="eval-mmlu", eval_task=EvaluatorTask.MMLU, model_path=checkpoint_path, ) # IFEval: capacidad de seguir instrucciones estructuradas ifeval_result = evaluador.evaluate( job_name="eval-ifeval", eval_task=EvaluatorTask.IFEVAL, ruta_modelo=ruta_punto_de_control, )
2. Traiga sus propios datos (mida el rendimiento específico del dominio)
Utilice su conjunto de pruebas disponible para medir si el ajuste fino mejoró el rendimiento en su tarea real:
byod_result = evaluador.evaluate( job_name="eval-byod", eval_task=EvaluationTask.GEN_QA, data_s3_path=f"s3://{S3_DATA_PATH}/eval/gen_qa.jsonl", model_path=checkpoint_path, overrides={"max_new_tokens": 2048},)
3. Modelo de lenguaje grande (LLM) como juez (para dominios donde las métricas automatizadas no son suficientes, puede utilizar otro LLM para evaluar la calidad de la respuesta)
Verificar resultados y recuperar resultados
# Verificar el estado del trabajo print(mmlu_result.get_job_status()) print(ifeval_result.get_job_status()) print(byod_result.get_job_status()) # Recuperar la ruta S3 que contiene los resultados de evaluación detallados print(mmlu_result.eval_output_path)
La ruta de salida de la evaluación contiene los resultados detallados como JSON. Descárguelos e inspecciónelos para obtener las puntuaciones reales.
Además, las métricas se pueden publicar en los servidores de seguimiento de MLflow proporcionando el URI del servidor de seguimiento en el momento de la creación del trabajo. Con este enfoque, puede registrar y almacenar sus métricas para comparar experimentos.
Interpretando tus resultados
Utilice el siguiente marco de decisión para guiar su próxima iteración:
Observación Qué significa Qué ajustar MMLU cerca de la línea de base (p. ej., entre 0,01 y 0,02) La combinación de datos está evitando con éxito un olvido catastrófico Su combinación está funcionando: céntrese en el rendimiento del dominio MMLU significativamente degradado El modelo está olvidando capacidades generales Disminuya el porcentaje de datos del cliente o aumente los pesos de los datos de Nova Rendimiento de la tarea del dominio por debajo de las expectativas El modelo no está aprendiendo lo suficiente de sus datos Aumente el porcentaje de datos del cliente, agregue más datos de entrenamiento o aumente los pasos máximos IFEval degradado El modelo está perdiendo la capacidad de seguir instrucciones Incrementar nova_instruction-following_percent Tanto la MMLU como la tarea de dominio mejoraron Resultado ideal Documente su configuración y promuévala a producción
Como punto de referencia, esta publicación informa estos resultados para Amazon Nova 2 Lite en una tarea de clasificación de COV:
La conclusión clave es que el ajuste fino con solo datos de clientes aumenta el dominio F1 pero reduce significativamente la inteligencia general (MMLU cae de 0,75 a 0,47), mientras que el enfoque combinado (75 % de clientes + 25 % de datos de Nova) recupera casi toda la precisión de MMLU y al mismo tiempo mejora el rendimiento del dominio.
Mejores prácticas
Comience con las proporciones de mezcla predeterminadas. Los valores predeterminados están ajustados para lograr una compensación equilibrada. Personalice solo después de tener resultados de evaluación de referencia con los que comparar. Evalúe siempre en ambos ejes. Ejecute al menos un punto de referencia público (MMLU) junto con su evaluación específica de dominio. Sin ambos, no se puede saber si la mezcla está funcionando. Utilice MLflow para comparar experimentos. Al iterar sobre proporciones de mezcla e hiperparámetros, MLflow simplifica la comparación de ejecuciones en paralelo e identifica la mejor configuración. Itere sobre la mezcla, no solo sobre los hiperparámetros. Si su modelo olvida las capacidades generales, ajustar la combinación de datos suele ser más eficaz que ajustar la tasa de aprendizaje o el tamaño del lote. Comience con LoRA y pase al rango completo si es necesario. LoRA es más rápido y económico. Pase a SFT de rango completo solo si LoRA no logra una adaptación de dominio suficiente para su caso de uso.
limpiando
Para evitar cargos continuos, limpie los recursos creados durante este tutorial:
Elimine el depósito S3 y su contenido. Detenga o elimine el clúster de SageMaker HyperPod si se creó para este ejercicio. Elimine la aplicación MLflow si ya no la necesita.
Conclusión
En esta publicación, analizamos el flujo de trabajo de un extremo a otro para ajustar los modelos de Amazon Nova utilizando el SDK de Nova Forge con la combinación de datos habilitada. El SDK maneja la preparación de datos, la orquestación del entrenamiento en SageMaker HyperPod y la evaluación multidimensional, para que usted pueda concentrarse en sus datos y su dominio. La combinación de datos es lo que hace que el ajuste fino sea práctico para la producción. En lugar de elegir entre experiencia en el dominio e inteligencia general, obtienes ambas. La clave es tratarlo como un proceso iterativo: entrenar, evaluar en ambos ejes, ajustar la combinación y repetir hasta encontrar el equilibrio adecuado para su caso de uso.
Para comenzar, consulte la Guía para desarrolladores de Nova Forge para obtener documentación detallada y explore el SDK de Nova Forge para obtener la referencia completa de la API.