Le traduzioni sono generate tramite traduzione automatica. In caso di conflitto tra il contenuto di una traduzione e la versione originale in Inglese, quest'ultima prevarrà.
Nozioni di base
Questa guida mostra come distribuire modelli Amazon Nova personalizzati su endpoint SageMaker in tempo reale, configurare i parametri di inferenza e richiamare i modelli per i test.
Prerequisiti
Di seguito sono riportati i prerequisiti per implementare i modelli Amazon Nova in inferenza: SageMaker
-
Crea un Account AWS - Se non ne hai già uno, vedi Creazione di un account. AWS
-
Autorizzazioni IAM richieste: assicurati che al tuo utente o ruolo IAM siano allegate le seguenti politiche gestite:
-
AmazonSageMakerFullAccess -
AmazonS3FullAccess
-
-
SDKs/CLI Versioni richieste: le seguenti versioni dell'SDK sono state testate e convalidate con i modelli Amazon Nova in fase di inferenza: SageMaker
-
SageMaker Python SDK v3.0.0+ () per un approccio API basato sulle risorse
sagemaker>=3.0.0 -
Boto3 versione 1.35.0+ () per chiamate API dirette.
boto3>=1.35.0Gli esempi di questa guida utilizzano questo approccio.
-
-
Aumento della quota di servizio: richiedi un aumento della quota di SageMaker servizio Amazon per il tipo di istanza ML che intendi utilizzare per il tuo endpoint SageMaker Inference (ad esempio,
ml.p5.48xlarge for endpoint usage). Per una lista di tipi di istanze supportate, consulta Modelli e istanze supportati. Per richiedere un aumento, consulta Richiedere un aumento della quota. Per informazioni sulle quote delle SageMaker istanze, vedi SageMaker endpoint e quote.
Suggerimento
Per una rapida distribuzione end-to-end, puoi eseguire il notebook Custom Nova Model SageMaker Inference
Fase 1: Configurazione AWS credenziali
Configura AWS le tue credenziali utilizzando uno dei seguenti metodi:
Opzione 1: AWS CLI (consigliata)
aws configure
Inserisci la chiave di AWS accesso, la chiave segreta e la regione predefinita quando richiesto.
Opzione 2: file AWS delle credenziali
Crea o modifica~/.aws/credentials:
[default] aws_access_key_id = YOUR_ACCESS_KEY aws_secret_access_key = YOUR_SECRET_KEY
Opzione 3: variabili di ambiente
export AWS_ACCESS_KEY_ID=your_access_key export AWS_SECRET_ACCESS_KEY=your_secret_key
Nota
Per ulteriori informazioni sulle AWS credenziali, vedere Configurazione e impostazioni dei file di credenziali.
Inizializza i client AWS
Crea uno script o un taccuino Python con il codice seguente per inizializzare l' AWS SDK e verificare le tue credenziali:
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.")
Se l'autenticazione ha esito positivo, dovresti vedere un output che conferma l'ID del tuo account. AWS
Fase 2: Creare un ruolo di SageMaker esecuzione
Un ruolo di SageMaker esecuzione è un ruolo IAM che concede SageMaker le autorizzazioni per accedere alle AWS risorse per tuo conto, come i bucket Amazon S3 per gli artefatti del modello e per la registrazione. CloudWatch
Creazione del ruolo di esecuzione
Nota
La creazione di ruoli IAM richiede iam:CreateRole iam:AttachRolePolicy autorizzazioni. Assicurati che il tuo utente o ruolo IAM disponga di queste autorizzazioni prima di procedere.
Il codice seguente crea un ruolo IAM con le autorizzazioni necessarie per distribuire i modelli personalizzati di 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}")
Utilizzo di un ruolo di esecuzione esistente (opzionale)
Se disponi già di un ruolo di SageMaker esecuzione, puoi utilizzarlo al suo posto:
# Replace with your existing role ARN SAGEMAKER_EXECUTION_ROLE_ARN = "arn:aws:iam::YOUR_ACCOUNT_ID:role/YOUR_EXISTING_ROLE_NAME"
Per trovare SageMaker i ruoli esistenti nel tuo account:
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
Il ruolo di esecuzione deve avere una relazione di fiducia sagemaker.amazonaws.com e le autorizzazioni per accedere ad Amazon S3 e SageMaker alle risorse.
Per ulteriori informazioni sui ruoli di SageMaker esecuzione, consulta SageMaker Ruoli.
Fase 3: Configurazione dei parametri del modello
Configura i parametri di distribuzione per il tuo modello Amazon Nova. Queste impostazioni controllano il comportamento del modello, l'allocazione delle risorse e le caratteristiche di inferenza. Per un elenco dei tipi di istanza supportati e dei valori CONTEXT_LENGTH e MAX_CONCURRENCY supportati per ciascuno, vedere. Modelli e istanze supportati Per un elenco completo delle funzionalità aggiuntive dei contenitori, come i valori predefiniti di campionamento, la decodifica speculativa e la quantizzazione, consulta. Caratteristiche del contenitore di inferenza
Parametri obbligatori
-
IMAGE: L'URI dell'immagine del contenitore Docker per il contenitore di inferenza Amazon Nova. Verrà fornito da. AWS -
CONTEXT_LENGTH: lunghezza del contesto del modello. -
MAX_CONCURRENCY: numero massimo di sequenze per iterazione; imposta il limite al numero di singole richieste utente (prompt) che possono essere elaborate contemporaneamente all'interno di un singolo batch sulla GPU. Intervallo: numero intero maggiore di 0.
Configura la tua distribuzione
# 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}")
Configura i parametri specifici della distribuzione
Ora configura i parametri specifici per la distribuzione del tuo modello Amazon Nova, tra cui la posizione degli artefatti del modello e la selezione del tipo di istanza.
Imposta l'identificatore di distribuzione
# Deployment identifier - use a descriptive name for your use case JOB_NAME = "my-nova-deployment"
Specifica la posizione degli artefatti del modello
Fornisci l'URI Amazon S3 in cui sono archiviati gli artefatti del modello Amazon Nova addestrato. Questa dovrebbe essere la posizione di output del processo di addestramento o messa a punto del modello.
# 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/"
Seleziona la variante del modello e il tipo di istanza
# 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}")
Convenzioni di denominazione
Il codice genera automaticamente nomi coerenti per le AWS risorse:
-
Nome del modello:
{JOB_NAME}-{model}-{instance-type} -
Configurazione dell'endpoint:
{MODEL_NAME}-Config -
Nome dell'endpoint:
{MODEL_NAME}-Endpoint
Fase 4: creazione di SageMaker risorse e distribuzione dell'endpoint
SageMaker offre due approcci per l'implementazione di modelli su endpoint in tempo reale. Scegli l'approccio più adatto al tuo caso d'uso:
-
Componenti di inferenza (consigliato): implementa i modelli come componenti di inferenza su un endpoint. Questo approccio consente di ospitare più modelli su un singolo endpoint, scalare i modelli in modo indipendente e ottimizzare l'utilizzo delle risorse.
-
Endpoint a modello singolo: distribuisce un singolo modello direttamente su un endpoint utilizzando un oggetto del modello e una configurazione dell'endpoint. Questo approccio è più semplice da configurare e adatto per lo sviluppo, il test o i carichi di lavoro che richiedono un solo modello per endpoint.
Opzione A: creazione con componenti di inferenza
Con i componenti di inferenza, crei prima un endpoint, quindi distribuisci il tuo modello come componente di inferenza su quell'endpoint. Questo separa il modello dall'infrastruttura degli endpoint, offrendoti una maggiore flessibilità.
Crea la configurazione dell'endpoint
Crea una configurazione degli endpoint che definisca l'infrastruttura senza specificare un modello. Il tipo e il numero di istanze sono gestiti a livello di endpoint:
# 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}")
Crea e distribuisci l'endpoint
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)
Crea il componente di inferenza
Una volta raggiunto l'endpoint InService, implementa il tuo modello Amazon Nova come componente di inferenza:
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}")
Parametri chiave:
-
InferenceComponentName: identificatore univoco per il tuo componente di inferenza -
EndpointName: L'endpoint su cui distribuire il componente -
Image: URI dell'immagine del contenitore Docker per l'inferenza di Amazon Nova -
ArtifactUrl: posizione in Amazon S3 degli artefatti del modello -
Environment: variabili di ambiente configurate nella fase 3 -
NumberOfCpuCoresRequired: numero di core CPU richiesti per copia del modello -
NumberOfAcceleratorDevicesRequired: numero di dispositivi acceleratori (GPU) richiesti per copia del modello -
MinMemoryRequiredInMb: Memoria minima in MB richiesta per copia del modello -
CopyCount: Numero di copie del modello da distribuire
Monitora l'implementazione dei componenti di inferenza
# 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
Quando si richiama l'endpoint nel passaggio 5, è necessario includere il InferenceComponentName parametro nelle chiamate di richiamo. Per i dettagli, consulta la Fase 5.
Opzione B: creazione con endpoint a modello singolo
Con gli endpoint a modello singolo, si crea un oggetto SageMaker del modello, una configurazione dell'endpoint e quindi si distribuisce l'endpoint. Questo approccio impacchetta il modello direttamente nella configurazione dell'endpoint.
Create il modello SageMaker
Il codice seguente crea un SageMaker modello che fa riferimento agli artefatti del modello 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}")
Parametri chiave:
-
ModelName: identificatore univoco per il tuo modello -
Image: URI dell'immagine del contenitore Docker per l'inferenza di Amazon Nova -
ModelDataSource: posizione in Amazon S3 degli artefatti del modello -
Environment: variabili di ambiente configurate nella fase 3 -
ExecutionRoleArn: ruolo IAM del passaggio 2 -
EnableNetworkIsolation: impostato su True per una maggiore sicurezza (impedisce al contenitore di effettuare chiamate di rete in uscita)
Crea la configurazione dell'endpoint
Quindi, crea una configurazione degli endpoint che definisca la tua infrastruttura di distribuzione:
# 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}")
Parametri chiave:
-
VariantName: identificatore per questa variante di modello (usa «primario» per le distribuzioni a modello singolo) -
ModelName: fa riferimento al modello creato sopra -
InitialInstanceCount: Numero di istanze da implementare (iniziare con 1, scalare successivamente se necessario) -
InstanceType: tipo di istanza ML selezionato nella fase 3
Distribuisci l'endpoint
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}")
Monitora la creazione degli endpoint
Il codice seguente analizza lo stato dell'endpoint fino al completamento della distribuzione:
# 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
Verifica la creazione delle risorse
Puoi verificare che le tue risorse siano state create correttamente:
# 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")
Verifica che l'endpoint sia pronto
Indipendentemente dall'approccio scelto, puoi verificare la configurazione dell'endpoint:
# 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
Risoluzione dei problemi relativi alla creazione degli endpoint
Motivi di errore comuni:
-
Capacità insufficiente: il tipo di istanza richiesto non è disponibile nella tua regione
-
Soluzione: prova un tipo di istanza diverso o richiedi un aumento della quota
-
-
Autorizzazioni IAM: il ruolo di esecuzione non dispone delle autorizzazioni necessarie
-
Soluzione: verifica che il ruolo abbia accesso agli artefatti del modello Amazon S3 e alle autorizzazioni necessarie SageMaker
-
-
Artefatti del modello non trovati: l'URI di Amazon S3 è errato o inaccessibile
-
Soluzione: verifica l'URI Amazon S3 e controlla le autorizzazioni del bucket, assicurati di trovarti nella regione corretta
-
-
Limiti di risorse: superati i limiti degli account per endpoint o istanze
-
Soluzione: richiedi un aumento della quota di servizio tramite Service Quotas o Support AWS
-
Nota
Se devi eliminare un endpoint guasto e ricominciare da capo:
sagemaker.delete_endpoint(EndpointName=ENDPOINT_NAME)
Passaggio 5: richiama l'endpoint
Una volta raggiunto l'endpoint InService, puoi inviare richieste di inferenza per generare previsioni dal tuo modello Amazon Nova. SageMaker supporta endpoint sincroni (in tempo reale con modalità streaming/non -streaming) ed endpoint asincroni (Amazon per l'elaborazione in batch). S3-based
Configura il client di runtime
Crea un client SageMaker Runtime con le impostazioni di timeout appropriate:
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)
Crea una funzione di inferenza universale
La seguente funzione gestisce sia le richieste in streaming che quelle non in streaming. Utilizza la INFERENCE_COMPONENT_NAME variabile definita nel passaggio 4. Se l'implementazione è stata effettuata utilizzando componenti di inferenza (opzione A), questa impostazione è stata impostata su. MODEL_NAME + "-IC" Se hai eseguito l'implementazione utilizzando endpoint a modello singolo (opzione B), questo valore non era definito, quindi impostalo su None prima di eseguire questo passaggio:
# 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)}")
Esempio 1: Non-streaming completamento della chat
Usa il formato della chat per le interazioni conversazionali:
# 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)
Esempio di risposta:
{ "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 } }
Esempio 2: completamento semplice del testo
Usa il formato di completamento per una semplice generazione di testo:
# 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)
Esempio di risposta:
{ "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 } }
Esempio 3: completamento della chat in streaming
# 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)
Esempio di output in streaming:
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]
Esempio 4: completamento di una chat multimodale
Usa il formato multimodale per l'immissione di immagini e testo:
# 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)
Esempio di risposta:
{ "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 } }
Fase 6: Pulizia delle risorse (opzionale)
Per evitare di incorrere in costi non necessari, elimina le AWS risorse che hai creato durante questo tutorial. SageMaker Gli endpoint sono soggetti a costi mentre sono in esecuzione, anche se non stai effettuando attivamente richieste di inferenza.
Importante
L'eliminazione delle risorse è permanente e non può essere annullata. Assicurati di non aver più bisogno di queste risorse prima di procedere.
Inizializza il client di pulizia
import boto3 import time # Initialize SageMaker client sagemaker = boto3.client('sagemaker', region_name=REGION)
Elimina il componente di inferenza (se si utilizza l'opzione A)
Se l'hai implementato utilizzando componenti di inferenza, elimina il componente di inferenza prima di eliminare l'endpoint:
# 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
Elimina l'endpoint
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
L'eliminazione dell'endpoint è asincrona. Puoi monitorare lo stato dell'eliminazione:
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
Eliminare la configurazione dell'endpoint
Dopo aver eliminato l'endpoint, rimuovi la configurazione dell'endpoint:
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}")
Elimina il modello (solo opzione B)
Se avete utilizzato singoli endpoint del modello, rimuovete l'oggetto del SageMaker modello:
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}")