Introducción
Esta guía le muestra cómo implementar modelos personalizados de Amazon Nova en puntos de conexión en tiempo real de SageMaker, configurar los parámetros de inferencia e invocar sus modelos para realizar pruebas.
Requisitos previos
Los siguientes son requisitos previos para implementar modelos de Amazon Nova en Inferencias de SageMaker:
-
Cree una Cuenta de AWS: si aún no tiene una, consulte Creating an AWS account.
-
Permisos de IAM necesarios: asegúrese de que su usuario o rol de IAM tenga adjuntas las políticas de administración siguientes:
-
AmazonSageMakerFullAccess -
AmazonS3FullAccess
-
-
Versiones del SDK y de la CLI requeridas: las siguientes versiones de SDK se han probado y validado con modelos de Amazon Nova en Inferencias de SageMaker.
-
Versión 3.0.0 o superior del SDK de SageMaker para Python (
sagemaker>=3.0.0) para un enfoque de API basado en recursos. -
Versión 1.35.0 o superior de Boto3 (
boto3>=1.35.0) para llamadas directas a la API. Los ejemplos de esta guía utilizan este enfoque.
-
-
Aumento de la cuota de servicio: solicite un aumento de la cuota de servicio de Amazon SageMaker para el tipo de instancia de ML que tiene previsto utilizar para el punto de conexión de Inferencia de SageMaker (por ejemplo,
ml.p5.48xlarge for endpoint usage). Para ver una lista de los tipos de instancia admitidos, consulte Modelos e instancias compatibles. Para solicitar un aumento, consulte Solicitud de aumento de cuota. Para obtener más información sobre las cuotas de instancias de SageMaker, consulte Puntos de conexión y cuotas de Amazon SageMaker.
sugerencia
Para realizar una implementación integral rápida, puede ejecutar el bloc de notas Inferencia de SageMaker para modelos personalizados de Nova
Paso 1: configure las credenciales de AWS
Configure las credenciales de AWS con uno de los siguientes métodos:
Opción 1: AWS CLI (recomendado)
aws configure
Ingrese la clave de acceso de AWS, la clave secreta y el nombre de la región predeterminada cuando se le solicite.
Opción 2: archivo de credenciales AWS
Cree o edite ~/.aws/credentials:
[default] aws_access_key_id = YOUR_ACCESS_KEY aws_secret_access_key = YOUR_SECRET_KEY
Opción 3: variables de entorno
export AWS_ACCESS_KEY_ID=your_access_key export AWS_SECRET_ACCESS_KEY=your_secret_key
nota
Para obtener más información sobre las credenciales de AWS, consulte Opciones de los archivos de configuración y credenciales en la AWS CLI.
Initialización de clientes de AWS
Cree un script o cuaderno de Python con el siguiente código para inicializar el SDK de AWS y verificar sus credenciales:
import boto3 # AWS Configuration - Update these for your environment REGION = "us-east-1" # Supported regions: us-east-1, us-west-2 AWS_ACCOUNT_ID = "YOUR_ACCOUNT_ID" # Replace with your AWS account ID # Initialize AWS clients using default credential chain sagemaker = boto3.client('sagemaker', region_name=REGION) sts = boto3.client('sts') # Verify credentials try: identity = sts.get_caller_identity() print(f"Successfully authenticated to AWS Account: {identity['Account']}") if identity['Account'] != AWS_ACCOUNT_ID: print(f"Warning: Connected to account {identity['Account']}, expected {AWS_ACCOUNT_ID}") except Exception as e: print(f"Failed to authenticate: {e}") print("Please verify your credentials are configured correctly.")
Si la autenticación se realiza correctamente, debería ver una salida que confirma el ID de su cuenta de AWS.
Paso 2: cree un rol de puesta en marcha de SageMaker AI
Un rol de puesta en marcha de SageMaker es un rol de IAM que concede permisos a SageMaker para acceder a los recursos de AWS en su nombre, como los buckets de Amazon S3 para artefactos de modelos y CloudWatch para el registro.
Creación del rol de puesta en marcha
nota
La creación de roles de IAM requiere los permisos iam:CreateRole y iam:AttachRolePolicy. Asegúrese de que el usuario o el rol de IAM tenga estos permisos antes de continuar.
El código siguiente crea un rol de IAM con los permisos necesarios para implementar modelos personalizados de Amazon Nova:
import json # Create SageMaker Execution Role role_name = f"SageMakerInference-ExecutionRole-{AWS_ACCOUNT_ID}" trust_policy = { "Version": "2012-10-17", "Statement": [ { "Effect": "Allow", "Principal": {"Service": "sagemaker.amazonaws.com"}, "Action": "sts:AssumeRole" } ] } iam = boto3.client('iam', region_name=REGION) # Create the role role_response = iam.create_role( RoleName=role_name, AssumeRolePolicyDocument=json.dumps(trust_policy), Description='SageMaker execution role with S3 and SageMaker access' ) # Attach required policies iam.attach_role_policy( RoleName=role_name, PolicyArn='arn:aws:iam::aws:policy/AmazonSageMakerFullAccess' ) iam.attach_role_policy( RoleName=role_name, PolicyArn='arn:aws:iam::aws:policy/AmazonS3FullAccess' ) SAGEMAKER_EXECUTION_ROLE_ARN = role_response['Role']['Arn'] print(f"Created SageMaker execution role: {SAGEMAKER_EXECUTION_ROLE_ARN}")
Uso de un rol de puesta en marcha existente (opcional)
Si ya tiene un rol de puesta en marcha de SageMaker, puede usarlo en su lugar:
# Replace with your existing role ARN SAGEMAKER_EXECUTION_ROLE_ARN = "arn:aws:iam::YOUR_ACCOUNT_ID:role/YOUR_EXISTING_ROLE_NAME"
Para buscar los roles de SageMaker existentes en su cuenta:
iam = boto3.client('iam', region_name=REGION) response = iam.list_roles() sagemaker_roles = [role for role in response['Roles'] if 'SageMaker' in role['RoleName']] for role in sagemaker_roles: print(f"{role['RoleName']}: {role['Arn']}")
importante
El rol de puesta en marcha debe tener una relación de confianza con sagemaker.amazonaws.com y permisos para acceder a los recursos de Amazon S3 y SageMaker.
Para obtener más información sobre los roles de puesta en marcha de SageMaker, consulte SageMaker Roles.
Paso 3: configure los parámetros del modelo
Configure los parámetros de implementación de su modelo de Amazon Nova. Estos ajustes controlan el comportamiento del modelo, la asignación de recursos y las características de inferencia. Para obtener una lista de los tipos de instancias compatibles y los valores de CONTEXT_LENGTH y MAX_CONCURRENCY admitidos para cada uno, consulte Modelos e instancias compatibles. Para consultar una lista completa de características adicionales del contenedor, como valores predeterminados de muestreo, decodificación especulativa y cuantización, consulte Características del contenedor de inferencia.
Parámetros requeridos
-
IMAGE: el URI de imagen del contenedor de Docker para el contenedor de inferencias de Amazon Nova. Lo proporcionará AWS. -
CONTEXT_LENGTH: longitud del contexto del modelo. -
MAX_CONCURRENCY: número máximo de secuencias por iteración; establece el límite de cuántas solicitudes de usuarios individuales (peticiones) se pueden procesar simultáneamente en un solo lote en la GPU. Rango: valor entero mayor que 0.
Configurar su implementación
# AWS Configuration REGION = "us-east-1" # Must match region from Step 1 # ECR Account mapping by region ECR_ACCOUNT_MAP = { "us-east-1": "708977205387", "us-west-2": "176779409107" } # Container Image IMAGE = f"{ECR_ACCOUNT_MAP[REGION]}.dkr.ecr.{REGION}.amazonaws.com/nova-inference-repo:SM-Inference-latest" print(f"IMAGE = {IMAGE}") # Required parameters CONTEXT_LENGTH = "8000" # Maximum total context length MAX_CONCURRENCY = "8" # Maximum concurrent sequences # Build environment variables for the container environment = { 'CONTEXT_LENGTH': CONTEXT_LENGTH, 'MAX_CONCURRENCY': MAX_CONCURRENCY, # Optional: add container feature environment variables here. # See "Inference Container Features" for the full list. # Examples: # 'DEFAULT_TEMPERATURE': '0.7', # 'DEFAULT_MAX_NEW_TOKENS': '512', # 'QUANTIZATION_DTYPE': 'fp8', } print("Environment configuration:") for key, value in environment.items(): print(f" {key}: {value}")
Configuración de los parámetros específicos de la implementación
Ahora configure los parámetros específicos de la implementación de su modelo de Amazon Nova, como la ubicación de los artefactos del modelo y la selección del tipo de instancia.
Definición del identificador de la implementación
# Deployment identifier - use a descriptive name for your use case JOB_NAME = "my-nova-deployment"
Definición de la ubicación de los artefactos del modelo
Proporcione el URI de Amazon S3 en el que se almacenan los artefactos de los modelos entrenados de Amazon Nova. Esta debe ser la ubicación de salida de su trabajo de entrenamiento o refinamiento del modelo.
# S3 location of your trained Nova model artifacts # Replace with your model's S3 URI - must end with / MODEL_S3_LOCATION = "s3://your-bucket-name/path/to/model/artifacts/"
Selección de la variante del modelo y del tipo de instancia
# Configure model variant and instance type TESTCASE = { "model": "micro", # Options: micro, lite, lite2 "instance": "ml.g5.12xlarge" # Refer to "Supported models and instances" section } # Generate resource names INSTANCE_TYPE = TESTCASE["instance"] MODEL_NAME = JOB_NAME + "-" + TESTCASE["model"] + "-" + INSTANCE_TYPE.replace(".", "-") ENDPOINT_CONFIG_NAME = MODEL_NAME + "-Config" ENDPOINT_NAME = MODEL_NAME + "-Endpoint" print(f"Model Name: {MODEL_NAME}") print(f"Endpoint Config: {ENDPOINT_CONFIG_NAME}") print(f"Endpoint Name: {ENDPOINT_NAME}")
Convenciones de nomenclatura
El código genera automáticamente nombres consistentes para los recursos de AWS:
-
Nombre del modelo:
{JOB_NAME}-{model}-{instance-type} -
Configuración del punto de conexión:
{MODEL_NAME}-Config -
Nombre del punto de conexión:
{MODEL_NAME}-Endpoint
Paso 4: cree recursos de SageMaker e implemente el punto de conexión
SageMaker ofrece dos enfoques para implementar modelos en puntos de conexión en tiempo real. Elija el enfoque que mejor se adapte al caso de uso:
-
Componentes de inferencia (recomendado): implementa modelos como componentes de inferencia en un punto de conexión. Este enfoque permite alojar varios modelos en un único punto de conexión, escalar modelos de forma independiente y optimizar el uso de recursos.
-
Puntos de conexión de modelo único: implementa un único modelo directamente en un punto de conexión mediante un objeto de modelo y una configuración de punto de conexión. Este enfoque es más sencillo de configurar y resulta adecuado para desarrollo, pruebas o cargas de trabajo que requieren un solo modelo por punto de conexión.
Opción A: creación con componentes de inferencia
Con los componentes de inferencia, primero se crea un punto de conexión y luego se implementa el modelo como componente de inferencia en ese punto de conexión. Esto desacopla el modelo de la infraestructura del punto de conexión, lo que ofrece mayor flexibilidad.
Creación de la configuración de punto de conexión
Cree una configuración de punto de conexión que defina la infraestructura sin especificar ningún modelo. El tipo y la cantidad de instancias se administran en el nivel del punto de conexión.
# Create Endpoint Configuration for inference components INFERENCE_COMPONENT_NAME = MODEL_NAME + "-IC" try: config_response = sagemaker.create_endpoint_config( EndpointConfigName=ENDPOINT_CONFIG_NAME, ProductionVariants=[ { 'VariantName': 'primary', 'InstanceType': INSTANCE_TYPE, 'InitialInstanceCount': 1, 'RoutingConfig': { 'RoutingStrategy': 'LEAST_OUTSTANDING_REQUESTS' } } ], Tags=[ { 'Key': 'sagemaker:nova-inference-component', 'Value': 'true' } ] ) print("Endpoint configuration created successfully!") print(f"Config ARN: {config_response['EndpointConfigArn']}") except sagemaker.exceptions.ClientError as e: print(f"Error creating endpoint configuration: {e}")
Cree e implemente el punto de conexión
import time try: endpoint_response = sagemaker.create_endpoint( EndpointName=ENDPOINT_NAME, EndpointConfigName=ENDPOINT_CONFIG_NAME ) print("Endpoint creation initiated successfully!") print(f"Endpoint ARN: {endpoint_response['EndpointArn']}") except Exception as e: print(f"Error creating endpoint: {e}") # Wait for endpoint to be InService print("Waiting for endpoint to be InService...") print("This typically takes 5-10 minutes...\n") while True: try: response = sagemaker.describe_endpoint(EndpointName=ENDPOINT_NAME) status = response['EndpointStatus'] if status == 'Creating': print(f"⏳ Status: {status} - Provisioning infrastructure...") elif status == 'InService': print(f"✅ Status: {status}") print(f"\nEndpoint '{ENDPOINT_NAME}' is ready.") break elif status == 'Failed': print(f"❌ Status: {status}") print(f"Failure Reason: {response.get('FailureReason', 'Unknown')}") break else: print(f"Status: {status}") except Exception as e: print(f"Error checking endpoint status: {e}") break time.sleep(30)
Creación del componente de inferencia
Cuando el punto de conexión esté en servicio, implemente el modelo de Amazon Nova como componente de inferencia:
try: ic_response = sagemaker.create_inference_component( InferenceComponentName=INFERENCE_COMPONENT_NAME, EndpointName=ENDPOINT_NAME, VariantName='primary', Specification={ 'Container': { 'Image': IMAGE, 'ArtifactUrl': MODEL_S3_LOCATION, 'Environment': environment }, 'ComputeResourceRequirements': { 'NumberOfCpuCoresRequired': 15, 'NumberOfAcceleratorDevicesRequired': 4, 'MinMemoryRequiredInMb': 25000 } }, RuntimeConfig={ 'CopyCount': 1 } ) print("Inference component creation initiated!") print(f"Inference Component ARN: {ic_response['InferenceComponentArn']}") except sagemaker.exceptions.ClientError as e: print(f"Error creating inference component: {e}")
Parámetros clave:
-
InferenceComponentName: identificador único del componente de inferencia -
EndpointName: punto de conexión en el que se implementará el componente -
Image: URI de imagen del contenedor de Docker para las inferencias de Amazon Nova -
ArtifactUrl: ubicación en Amazon S3 de los artefactos de su modelo -
Environment: variables de entorno configuradas en el paso 3 -
NumberOfCpuCoresRequired: cantidad de núcleos de CPU requeridos por cada copia del modelo -
NumberOfAcceleratorDevicesRequired: cantidad de dispositivos aceleradores (GPU) requeridos por cada copia del modelo -
MinMemoryRequiredInMb: memoria mínima requerida en MB por cada copia del modelo -
CopyCount: cantidad de copias del modelo que se implementarán
Supervise la implementación del componente de inferencia
# Wait for inference component to be InService print("Waiting for inference component deployment...") print("This typically takes 10-20 minutes as the model is loaded...\n") while True: try: ic_desc = sagemaker.describe_inference_component( InferenceComponentName=INFERENCE_COMPONENT_NAME ) ic_status = ic_desc['InferenceComponentStatus'] if ic_status == 'Creating': print(f"⏳ Status: {ic_status} - Loading model artifacts...") elif ic_status == 'InService': print(f"✅ Status: {ic_status}") print(f"\nInference component '{INFERENCE_COMPONENT_NAME}' is ready!") break elif ic_status == 'Failed': print(f"❌ Status: {ic_status}") print(f"Failure Reason: {ic_desc.get('FailureReason', 'Unknown')}") break else: print(f"Status: {ic_status}") except Exception as e: print(f"Error checking inference component status: {e}") break time.sleep(30)
nota
Al invocar el punto de conexión en el paso 5, debe incluir el parámetro InferenceComponentName en las llamadas de invocación. Consulte el paso 5 para obtener más información.
Opción B: creación con puntos de conexión de modelo único
Con los puntos de conexión de modelo único, se crea un objeto de modelo de SageMaker, una configuración de punto de conexión y, posteriormente, se implementa el punto de conexión. Este enfoque empaqueta el modelo directamente en la configuración del punto de conexión.
Cree el modelo de SageMaker
El siguiente código crea un modelo de SageMaker que hace referencia a los artefactos del modelo de Amazon Nova:
try: model_response = sagemaker.create_model( ModelName=MODEL_NAME, PrimaryContainer={ 'Image': IMAGE, 'ModelDataSource': { 'S3DataSource': { 'S3Uri': MODEL_S3_LOCATION, 'S3DataType': 'S3Prefix', 'CompressionType': 'None' } }, 'Environment': environment }, ExecutionRoleArn=SAGEMAKER_EXECUTION_ROLE_ARN, EnableNetworkIsolation=True ) print("Model created successfully!") print(f"Model ARN: {model_response['ModelArn']}") except sagemaker.exceptions.ClientError as e: print(f"Error creating model: {e}")
Parámetros clave:
-
ModelName: identificador único para su modelo -
Image: URI de imagen del contenedor de Docker para las inferencias de Amazon Nova -
ModelDataSource: ubicación en Amazon S3 de los artefactos de su modelo -
Environment: variables de entorno configuradas en el paso 3 -
ExecutionRoleArn: rol de IAM del paso 2 -
EnableNetworkIsolation: establezca el valor en True para mejorar la seguridad (evita que el contenedor haga llamadas salientes a la red)
Creación de la configuración de punto de conexión
A continuación, cree una configuración de punto de conexión que defina la infraestructura de la implementación:
# Create Endpoint Configuration try: production_variant = { 'VariantName': 'primary', 'ModelName': MODEL_NAME, 'InitialInstanceCount': 1, 'InstanceType': INSTANCE_TYPE, } config_response = sagemaker.create_endpoint_config( EndpointConfigName=ENDPOINT_CONFIG_NAME, ProductionVariants=[production_variant] ) print("Endpoint configuration created successfully!") print(f"Config ARN: {config_response['EndpointConfigArn']}") except sagemaker.exceptions.ClientError as e: print(f"Error creating endpoint configuration: {e}")
Parámetros clave:
-
VariantName: identificador de esta variante del modelo (utilice “principal” para las implementaciones de un solo modelo) -
ModelName: hace referencia al modelo creado anteriormente -
InitialInstanceCount: número de instancias que se van a implementar (comience con 1 y escale más adelante si es necesario) -
InstanceType: tipo de instancia de ML seleccionado en el paso 3
Implemente el punto de conexión
import time try: endpoint_response = sagemaker.create_endpoint( EndpointName=ENDPOINT_NAME, EndpointConfigName=ENDPOINT_CONFIG_NAME ) print("Endpoint creation initiated successfully!") print(f"Endpoint ARN: {endpoint_response['EndpointArn']}") except Exception as e: print(f"Error creating endpoint: {e}")
Supervisión de la creación de puntos de conexión
El siguiente código sondea el estado del punto de conexión hasta que se complete la implementación:
# Monitor endpoint creation progress print("Waiting for endpoint creation to complete...") print("This typically takes 15-30 minutes...\n") while True: try: response = sagemaker.describe_endpoint(EndpointName=ENDPOINT_NAME) status = response['EndpointStatus'] if status == 'Creating': print(f"⏳ Status: {status} - Provisioning infrastructure and loading model...") elif status == 'InService': print(f"✅ Status: {status}") print("\nEndpoint creation completed successfully!") print(f"Endpoint Name: {ENDPOINT_NAME}") print(f"Endpoint ARN: {response['EndpointArn']}") break elif status == 'Failed': print(f"❌ Status: {status}") print(f"Failure Reason: {response.get('FailureReason', 'Unknown')}") print("\nFull response:") print(response) break else: print(f"Status: {status}") except Exception as e: print(f"Error checking endpoint status: {e}") break time.sleep(30) # Check every 30 seconds
Verificación de la creación de recursos
Puede verificar que los recursos se crearon correctamente:
# Describe the model model_info = sagemaker.describe_model(ModelName=MODEL_NAME) print(f"Model Status: {model_info['ModelName']} created") # Describe the endpoint configuration config_info = sagemaker.describe_endpoint_config(EndpointConfigName=ENDPOINT_CONFIG_NAME) print(f"Endpoint Config Status: {config_info['EndpointConfigName']} created")
Comprobación de que el punto de conexión esté listo
Independientemente del enfoque que haya elegido, puede verificar la configuración del punto de conexión:
# Get detailed endpoint information endpoint_info = sagemaker.describe_endpoint(EndpointName=ENDPOINT_NAME) print("\n=== Endpoint Details ===") print(f"Endpoint Name: {endpoint_info['EndpointName']}") print(f"Endpoint ARN: {endpoint_info['EndpointArn']}") print(f"Status: {endpoint_info['EndpointStatus']}") print(f"Creation Time: {endpoint_info['CreationTime']}") print(f"Last Modified: {endpoint_info['LastModifiedTime']}") # Get endpoint config for instance type details endpoint_config_name = endpoint_info['EndpointConfigName'] endpoint_config = sagemaker.describe_endpoint_config(EndpointConfigName=endpoint_config_name) # Display production variant details for variant in endpoint_info['ProductionVariants']: print(f"\nProduction Variant: {variant['VariantName']}") print(f" Current Instance Count: {variant['CurrentInstanceCount']}") print(f" Desired Instance Count: {variant['DesiredInstanceCount']}") # Get instance type from endpoint config for config_variant in endpoint_config['ProductionVariants']: if config_variant['VariantName'] == variant['VariantName']: print(f" Instance Type: {config_variant['InstanceType']}") break
Solución de problemas de creación de puntos de conexión
Motivos de error comunes:
-
Capacidad insuficiente: el tipo de instancia solicitado no está disponible en su región.
-
Solución: pruebe un tipo de instancia diferente o solicite un aumento de cuota
-
-
Permisos de IAM: el rol de puesta en marcha carece de los permisos necesarios.
-
Solución: compruebe que el rol tenga acceso a los artefactos del modelo de Amazon S3 y a los permisos de SageMaker necesarios
-
-
No se encontraron los artefactos del modelo: el URI de Amazon S3 es incorrecto o no se puede acceder a él.
-
Solución: compruebe el URI de Amazon S3 y los permisos del bucket, y asegúrese de que se encuentra en la región correcta.
-
-
Límites de recursos: se han superado los límites de las cuentas para los puntos de conexión o las instancias.
-
Solución: solicite un aumento de la cuota de servicio a través de Service Quotas o AWS Support.
-
nota
Si tiene que eliminar un punto de conexión defectuoso y empezar de nuevo, haga lo siguiente:
sagemaker.delete_endpoint(EndpointName=ENDPOINT_NAME)
Paso 5: invoque el punto de conexión
Cuando el punto de conexión esté en funcionamiento, puede enviar solicitudes de inferencia para generar predicciones a partir de su modelo de Amazon Nova. SageMaker admite puntos de conexión síncronos (en tiempo real con modos de transmisión o sin transmisión) y puntos de conexión asíncronos (basados en Amazon S3 para el procesamiento por lotes).
Configuración del cliente de tiempo de ejecución
Cree un cliente de tiempo de ejecución de SageMaker con la configuración de tiempo de espera adecuada:
import json import boto3 import botocore from botocore.exceptions import ClientError # Configure client with appropriate timeouts config = botocore.config.Config( read_timeout=120, # Maximum time to wait for response connect_timeout=10, # Maximum time to establish connection retries={'max_attempts': 3} # Number of retry attempts ) # Create SageMaker Runtime client runtime_client = boto3.client('sagemaker-runtime', config=config, region_name=REGION)
Creación de una función de inferencia universal
La siguiente función administra solicitudes tanto de streaming como sin streaming. Utiliza la variable INFERENCE_COMPONENT_NAME definida en el paso 4. Si realizó la implementación mediante componentes de inferencia (opción A), este valor se estableció en MODEL_NAME + "-IC". Si realizó la implementación mediante puntos de conexión de modelo único (opción B), este valor no se definió, por lo que debe establecerlo en None antes de ejecutar este paso:
# Only needed if you followed Option B (single model endpoints) in Step 4: # INFERENCE_COMPONENT_NAME = None def invoke_nova_endpoint(request_body): """ Invoke Nova endpoint with automatic streaming detection. Supports both inference component and single model endpoint deployments. Args: request_body (dict): Request payload containing prompt and parameters Returns: dict: Response from the model (for non-streaming requests) None: For streaming requests (prints output directly) """ body = json.dumps(request_body) is_streaming = request_body.get("stream", False) # Build invoke parameters invoke_params = { 'EndpointName': ENDPOINT_NAME, 'ContentType': 'application/json', 'Body': body } # Add InferenceComponentName if using inference components if INFERENCE_COMPONENT_NAME: invoke_params['InferenceComponentName'] = INFERENCE_COMPONENT_NAME try: print(f"Invoking endpoint ({'streaming' if is_streaming else 'non-streaming'})...") if is_streaming: response = runtime_client.invoke_endpoint_with_response_stream(**invoke_params) event_stream = response['Body'] for event in event_stream: if 'PayloadPart' in event: chunk = event['PayloadPart'] if 'Bytes' in chunk: data = chunk['Bytes'].decode() print("Chunk:", data) else: # Non-streaming inference invoke_params['Accept'] = 'application/json' response = runtime_client.invoke_endpoint(**invoke_params) response_body = response['Body'].read().decode('utf-8') result = json.loads(response_body) print("✅ Response received successfully") return result except ClientError as e: error_code = e.response['Error']['Code'] error_message = e.response['Error']['Message'] print(f"❌ AWS Error: {error_code} - {error_message}") except Exception as e: print(f"❌ Unexpected error: {str(e)}")
Ejemplo 1: finalización de un chat sin transmisión
Use el formato de chat para las interacciones conversacionales:
# Non-streaming chat request chat_request = { "messages": [ {"role": "user", "content": "Hello! How are you?"} ], "max_tokens": 100, "max_completion_tokens": 100, # Alternative to max_tokens "stream": False, "temperature": 0.7, "top_p": 0.9, "top_k": 50, "logprobs": True, "top_logprobs": 3, "allowed_token_ids": None, # List of allowed token IDs "truncate_prompt_tokens": None, # Truncate prompt to this many tokens "stream_options": None } response = invoke_nova_endpoint(chat_request)
Respuesta de ejemplo:
{ "id": "chatcmpl-123456", "object": "chat.completion", "created": 1234567890, "model": "default", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "Hello! I'm doing well, thank you for asking. I'm here and ready to help you with any questions or tasks you might have. How can I assist you today?" }, "logprobs": { "content": [ { "token": "Hello", "logprob": -0.123, "top_logprobs": [ {"token": "Hello", "logprob": -0.123}, {"token": "Hi", "logprob": -2.456}, {"token": "Hey", "logprob": -3.789} ] } # Additional tokens... ] }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 12, "completion_tokens": 28, "total_tokens": 40 } }
Ejemplo 2: finalización de texto simple
Use el formato de finalización para generar texto simple:
# Simple completion request completion_request = { "prompt": "The capital of France is", "max_tokens": 50, "stream": False, "temperature": 0.0, "top_p": 1.0, "top_k": -1, # -1 means no limit "logprobs": 3, # Number of log probabilities to return "allowed_token_ids": None, # List of allowed token IDs "truncate_prompt_tokens": None, # Truncate prompt to this many tokens "stream_options": None } response = invoke_nova_endpoint(completion_request)
Respuesta de ejemplo:
{ "id": "cmpl-789012", "object": "text_completion", "created": 1234567890, "model": "default", "choices": [ { "text": " Paris.", "index": 0, "logprobs": { "tokens": [" Paris", "."], "token_logprobs": [-0.001, -0.002], "top_logprobs": [ {" Paris": -0.001, " London": -5.234, " Rome": -6.789}, {".": -0.002, ",": -4.567, "!": -7.890} ] }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 6, "completion_tokens": 2, "total_tokens": 8 } }
Ejemplo 3: finalización de un chat con transmisión
# Streaming chat request streaming_request = { "messages": [ {"role": "user", "content": "Tell me a short story about a robot"} ], "max_tokens": 200, "stream": True, "temperature": 0.7, "top_p": 0.95, "top_k": 40, "logprobs": True, "top_logprobs": 2, "stream_options": {"include_usage": True} } invoke_nova_endpoint(streaming_request)
Ejemplo de salida de transmisión:
Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"role":"assistant","content":""},"logprobs":null,"finish_reason":null}],"prompt_token_ids":null} Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" Once"},"logprobs":{"content":[{"token":"\u2581Once","logprob":-0.6078429222106934,"bytes":[226,150,129,79,110,99,101],"top_logprobs":[{"token":"\u2581Once","logprob":-0.6078429222106934,"bytes":[226,150,129,79,110,99,101]},{"token":"\u2581In","logprob":-0.7864127159118652,"bytes":[226,150,129,73,110]}]}]},"finish_reason":null,"token_ids":null}]} Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" upon"},"logprobs":{"content":[{"token":"\u2581upon","logprob":-0.0012345,"bytes":[226,150,129,117,112,111,110],"top_logprobs":[{"token":"\u2581upon","logprob":-0.0012345,"bytes":[226,150,129,117,112,111,110]},{"token":"\u2581a","logprob":-6.789,"bytes":[226,150,129,97]}]}]},"finish_reason":null,"token_ids":null}]} Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" a"},"logprobs":{"content":[{"token":"\u2581a","logprob":-0.0001234,"bytes":[226,150,129,97],"top_logprobs":[{"token":"\u2581a","logprob":-0.0001234,"bytes":[226,150,129,97]},{"token":"\u2581time","logprob":-9.123,"bytes":[226,150,129,116,105,109,101]}]}]},"finish_reason":null,"token_ids":null}]} Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{"content":" time"},"logprobs":{"content":[{"token":"\u2581time","logprob":-0.0023456,"bytes":[226,150,129,116,105,109,101],"top_logprobs":[{"token":"\u2581time","logprob":-0.0023456,"bytes":[226,150,129,116,105,109,101]},{"token":",","logprob":-6.012,"bytes":[44]}]}]},"finish_reason":null,"token_ids":null}]} # Additional chunks... Chunk: data: {"id":"chatcmpl-029ca032-fa01-4868-80b7-c4cb1af90fb9","object":"chat.completion.chunk","created":1772060532,"model":"default","choices":[{"index":0,"delta":{},"logprobs":null,"finish_reason":"stop"}],"usage":{"prompt_tokens":15,"completion_tokens":87,"total_tokens":102}} Chunk: data: [DONE]
Ejemplo 4: finalización de un chat multimodal
Use el formato multimodal para la entrada de imágenes y texto:
# Multimodal chat request (if supported by your model) multimodal_request = { "messages": [ { "role": "user", "content": [ {"type": "text", "text": "What's in this image?"}, {"type": "image_url", "image_url": {"url": "data:image/jpeg;base64,..."}} ] } ], "max_tokens": 150, "temperature": 0.3, "top_p": 0.8, "stream": False } response = invoke_nova_endpoint(multimodal_request)
Respuesta de ejemplo:
{ "id": "chatcmpl-345678", "object": "chat.completion", "created": 1234567890, "model": "default", "choices": [ { "index": 0, "message": { "role": "assistant", "content": "The image shows..." }, "finish_reason": "stop" } ], "usage": { "prompt_tokens": 1250, "completion_tokens": 45, "total_tokens": 1295 } }
Paso 6 (opcional): elimine recursos
Para evitar incurrir en gastos innecesarios, elimine los recursos de AWS que creó durante este tutorial. Los puntos de conexión de SageMaker incurren en cargos mientras están en funcionamiento, incluso si no realiza activamente solicitudes de inferencia.
importante
La eliminación de los recursos es permanente y no se puede deshacer. Asegúrese de que ya no necesite estos recursos antes de continuar.
Inicialice el cliente de limpieza
import boto3 import time # Initialize SageMaker client sagemaker = boto3.client('sagemaker', region_name=REGION)
Elimine el componente de inferencia (si utiliza la opción A)
Si realizó la implementación mediante componentes de inferencia, elimine primero el componente de inferencia antes de eliminar el punto de conexión:
# Delete inference component (Option A only) try: print("Deleting inference component...") sagemaker.delete_inference_component(InferenceComponentName=INFERENCE_COMPONENT_NAME) print(f"✅ Inference component '{INFERENCE_COMPONENT_NAME}' deletion initiated") except Exception as e: print(f"❌ Error deleting inference component: {e}") # Wait for inference component to be deleted before proceeding print("Waiting for inference component deletion...") while True: try: sagemaker.describe_inference_component(InferenceComponentName=INFERENCE_COMPONENT_NAME) time.sleep(10) except sagemaker.exceptions.ClientError as e: if e.response['Error']['Code'] == 'ValidationException': print("✅ Inference component successfully deleted") break else: print(f"Error: {e}") break
Eliminación del punto de conexión
try: print("Deleting endpoint...") sagemaker.delete_endpoint(EndpointName=ENDPOINT_NAME) print(f"✅ Endpoint '{ENDPOINT_NAME}' deletion initiated") print("Charges will stop once deletion completes (typically 2-5 minutes)") except Exception as e: print(f"❌ Error deleting endpoint: {e}")
nota
La eliminación de puntos de conexión es asíncrona. Puede supervisar el estado de la eliminación:
import time print("Monitoring endpoint deletion...") while True: try: response = sagemaker.describe_endpoint(EndpointName=ENDPOINT_NAME) status = response['EndpointStatus'] print(f"Status: {status}") time.sleep(10) except sagemaker.exceptions.ClientError as e: if e.response['Error']['Code'] == 'ValidationException': print("✅ Endpoint successfully deleted") break else: print(f"Error: {e}") break
Eliminación de la configuración de punto de conexión
Una vez eliminado el punto de conexión, elimine su configuración.
try: print("Deleting endpoint configuration...") sagemaker.delete_endpoint_config(EndpointConfigName=ENDPOINT_CONFIG_NAME) print(f"✅ Endpoint configuration '{ENDPOINT_CONFIG_NAME}' deleted") except Exception as e: print(f"❌ Error deleting endpoint configuration: {e}")
Elimine el modelo (solo para la opción B)
Si utilizó puntos de conexión de modelo único, elimine el objeto de modelo de SageMaker:
try: print("Deleting model...") sagemaker.delete_model(ModelName=MODEL_NAME) print(f"✅ Model '{MODEL_NAME}' deleted") except Exception as e: print(f"❌ Error deleting model: {e}")