Invocare modelli per l’inferenza in tempo reale - Amazon SageMaker AI

Invocare modelli per l’inferenza in tempo reale

Dopo aver utilizzato Amazon SageMaker AI per implementare un modello in un endpoint, è possibile interagire con il modello inviandogli richieste di inferenza. Per inviare una richiesta di inferenza a un modello, invoca l’endpoint che lo ospita. È possibile invocare gli endpoint utilizzando Amazon SageMaker Studio, gli AWS SDK o l’AWS CLI.

Invocare un modello mediante Amazon SageMaker Studio

Dopo aver implementato il modello in un endpoint, è possibile visualizzare l’endpoint utilizzando Amazon SageMaker Studio e testarlo inviando richieste di inferenza singole.

Nota

SageMaker AI supporta solo i test degli endpoint in Studio per endpoint in tempo reale.

Per inviare una richiesta di inferenza di test al tuo endpoint
  1. Avvia Amazon SageMaker Studio.

  2. Nel riquadro di navigazione sinistro scegli Implementazioni.

  3. Dal menu a discesa, scegli Endpoint.

  4. Cerca il tuo endpoint per nome e scegli il nome nella tabella. I nomi degli endpoint elencati nel pannello Endpoint vengono definiti quando si distribuisce un modello. Lo spazio di lavoro Studio mostra la pagina Endpoint in una nuova scheda.

  5. Scegli la scheda Testa inferenza.

  6. Per Opzioni di test, seleziona una delle seguenti opzioni:

    1. Seleziona Testa la richiesta di esempio per inviare immediatamente una richiesta al tuo endpoint. Utilizza l’editor JSON per fornire dati di esempio in formato JSON e scegli Invia richiesta per inviare la richiesta al tuo endpoint. Dopo l’invio della richiesta, Studio mostra l’output dell’inferenza in una scheda a destra dell’editor JSON.

    2. Seleziona Usa codice di esempio Python SDK per visualizzare il codice per l’invio di una richiesta all’endpoint. Quindi, copia l’esempio di codice dalla sezione Richiesta di inferenza di esempio ed esegui il codice dal tuo ambiente di test.

La parte superiore della scheda mostra il tipo di richiesta che è stata inviata all'endpoint (è accettato solo JSON). La scheda mostra i seguenti campi:

  • Stato: visualizza uno dei seguenti tipi di stato:

    • Success: la richiesta è riuscita.

    • Failed: esito negativo della richiesta. Una risposta viene visualizzata in Motivo dell'errore.

    • Pending: mentre la richiesta di inferenza è in sospeso, lo stato mostra un'icona circolare rotante.

  • Durata dell'esecuzione: quanto tempo è durato l'invocazione (ora di fine meno l'ora di inizio) in millisecondi.

  • Ora della richiesta: quanti minuti sono trascorsi dall'invio della richiesta.

  • Ora del risultato: quanti minuti sono trascorsi dalla restituzione del risultato.

Invocare un modello mediante AWS SDK per Python (Boto3)

Per invocare un endpoint del modello nel codice dell’applicazione, è possibile utilizzare uno degli AWS SDK, incluso AWS SDK per Python (Boto3). Per invocare l’endpoint con questo SDK, utilizza uno dei seguenti metodi Python:

  • invoke_endpoint - Invia una richiesta di inferenza a un endpoint del modello e restituisce la risposta generata dal modello.

    Questo metodo restituisce il payload di inferenza come una risposta dopo che il modello ha terminato la sua generazione. Per ulteriori informazioni, consulta invoke_endpoint nella documentazione di riferimento dell’API per AWS SDK per Python (Boto3).

  • invoke_endpoint_with_response_stream - Invia una richiesta di inferenza a un endpoint del modello e trasmette la risposta in modo incrementale mentre il modello la genera.

    Con questo metodo, l’applicazione riceve parti della risposta non appena le parti diventano disponibili. Per ulteriori informazioni, consulta invoke_endpoint nella documentazione di riferimento dell’API per AWS SDK per Python (Boto3).

    Utilizza questo metodo solo per richiamare modelli che supportano lo streaming inferenziale.

Prima di poter utilizzare questi metodi nel codice dell’applicazione, è necessario inizializzare creare un client SageMaker AI Runtime e specificare il nome dell’endpoint. L'esempio seguente configura il client e l'endpoint per il resto degli esempi seguenti:

import boto3 sagemaker_runtime = boto3.client( "sagemaker-runtime", region_name='aws_region') endpoint_name='endpoint-name'

Richiamare per ottenere una risposta di inferenza

L'esempio seguente utilizza il metodo invoke_endpoint per richiamare un endpoint con AWS SDK per Python (Boto3).

# Gets inference from the model hosted at the specified endpoint: response = sagemaker_runtime.invoke_endpoint( EndpointName=endpoint_name, Body=bytes('{"features": ["This is great!"]}', 'utf-8') ) # Decodes and prints the response body: print(response['Body'].read().decode('utf-8'))

Questo esempio fornisce dati di input nel campo Body affinché SageMaker AI li passi al modello. Questi dati devono essere nello stesso formato utilizzato per l'addestramento. L’esempio assegna la risposta alla variabile response.

La variabile response fornisce l'accesso allo stato HTTP, al nome del modello distribuito e ad altri campi. Il seguente frammento di codice mostra il codice di stato HTTP:

print(response["HTTPStatusCode"])

Richiamare per trasmettere una risposta di inferenza

Se hai distribuito un modello che supporta lo streaming di inferenza, puoi richiamare il modello per ricevere il payload di inferenza sotto forma di flusso di parti. Il modello fornisce queste parti in modo incrementale man mano che il modello le genera. Quando un'applicazione riceve un flusso di inferenza, non deve attendere che il modello generi l'intero payload di risposta. Invece, l’applicazione riceve immediatamente parti della risposta non appena diventano disponibili.

Utilizzando un flusso di inferenza nell'applicazione, è possibile creare interazioni in cui gli utenti percepiscono l'inferenza come rapida perché ottengono immediatamente la prima parte. Puoi implementare lo streaming per supportare esperienze interattive veloci, come chatbot, assistenti virtuali e generatori di musica. Ad esempio, è possibile creare un chatbot che mostri in modo incrementale il testo generato da un modello di linguaggio di grandi dimensioni (LLM).

Per ottenere un flusso di inferenza, è possibile utilizzare il metodo invoke_endpoint_with_response_stream. Nel corpo della risposta, l'SDK fornisce un oggetto EventStream, che fornisce l'inferenza sotto forma di una serie di oggetti PayloadPart.

Esempio Flusso di inferenza

Di seguito è riportato un esempio di un flusso di oggetti PayloadPart:

{'PayloadPart': {'Bytes': b'{"outputs": [" a"]}\n'}} {'PayloadPart': {'Bytes': b'{"outputs": [" challenging"]}\n'}} {'PayloadPart': {'Bytes': b'{"outputs": [" problem"]}\n'}} . . .

In ogni parte del payload, il campo Bytes fornisce una parte della risposta di inferenza del modello. Questa parte può essere qualsiasi tipo di contenuto generato da un modello, ad esempio testo, immagini o dati audio. In questo esempio, le porzioni sono oggetti JSON che contengono testo generato da un LLM.

Di solito, la parte del payload contiene una parte discreta di dati del modello. In questo esempio i blocchi discreti sono oggetti JSON interi. Occasionalmente, la risposta in streaming divide i blocchi su più parti del payload oppure combina più blocchi in un'unica parte del payload. L'esempio seguente mostra un blocco di dati in formato JSON suddiviso in due parti del payload:

{'PayloadPart': {'Bytes': b'{"outputs": '}} {'PayloadPart': {'Bytes': b'[" problem"]}\n'}}

Quando scrivi codice applicativo che elabora un flusso di inferenza, includi la logica che gestisca queste suddivisioni e combinazioni occasionali di dati. Come strategia, potete scrivere codice che concatena i contenuti di Bytes mentre l'applicazione riceve le parti del payload. Concatenando qui i dati JSON di esempio, puoi combinare i dati in un corpo JSON delimitato da una nuova riga. Quindi, il codice potrebbe elaborare lo stream analizzando l'intero oggetto JSON su ogni riga.

L'esempio seguente mostra il codice JSON delimitato da nuove righe che creereste quando concatenate il contenuto di esempio di Bytes:

{"outputs": [" a"]} {"outputs": [" challenging"]} {"outputs": [" problem"]} . . .
Esempio Codice per elaborare un flusso di inferenza

Il seguente esempio di classe Python, SmrInferenceStream, dimostra come è possibile elaborare un flusso di inferenza che invia dati di testo in formato JSON:

import io import json # Example class that processes an inference stream: class SmrInferenceStream: def __init__(self, sagemaker_runtime, endpoint_name): self.sagemaker_runtime = sagemaker_runtime self.endpoint_name = endpoint_name # A buffered I/O stream to combine the payload parts: self.buff = io.BytesIO() self.read_pos = 0 def stream_inference(self, request_body): # Gets a streaming inference response # from the specified model endpoint: response = self.sagemaker_runtime\ .invoke_endpoint_with_response_stream( EndpointName=self.endpoint_name, Body=json.dumps(request_body), ContentType="application/json" ) # Gets the EventStream object returned by the SDK: event_stream = response['Body'] for event in event_stream: # Passes the contents of each payload part # to be concatenated: self._write(event['PayloadPart']['Bytes']) # Iterates over lines to parse whole JSON objects: for line in self._readlines(): resp = json.loads(line) part = resp.get("outputs")[0] # Returns parts incrementally: yield part # Writes to the buffer to concatenate the contents of the parts: def _write(self, content): self.buff.seek(0, io.SEEK_END) self.buff.write(content) # The JSON objects in buffer end with '\n'. # This method reads lines to yield a series of JSON objects: def _readlines(self): self.buff.seek(self.read_pos) for line in self.buff.readlines(): self.read_pos += len(line) yield line[:-1]

Questo esempio elabora il flusso di inferenza effettuando le seguenti operazioni:

  • Inizializza un client SageMaker AI Runtime e imposta il nome di un endpoint del modello. Prima di poter ottenere un flusso di inferenza, il modello ospitato dall'endpoint deve supportare lo streaming di inferenza.

  • Nel metodo stream_inference di esempio, riceve il corpo della richiesta e lo passa al metodo invoke_endpoint_with_response_stream dell'SDK.

  • Itera su ogni evento nell'oggetto EventStream restituito dall'SDK.

  • Da ogni evento, ottiene il contenuto dell'oggetto Bytes nell'oggetto PayloadPart.

  • Nel metodo _write di esempio, scrive in un buffer per concatenare il contenuto degli oggetti Bytes. I contenuti combinati formano un corpo JSON delimitato da una nuova riga.

  • Utilizza il metodo _readlines di esempio per ottenere una serie iterabile di oggetti JSON.

  • In ogni oggetto JSON, ottiene una parte dell'inferenza.

  • Con l'espressione yield, restituisce i pezzi in modo incrementale.

L'esempio seguente crea e utilizza un oggetto SmrInferenceStream:

request_body = {"inputs": ["Large model inference is"], "parameters": {"max_new_tokens": 100, "enable_sampling": "true"}} smr_inference_stream = SmrInferenceStream( sagemaker_runtime, endpoint_name) stream = smr_inference_stream.stream_inference(request_body) for part in stream: print(part, end='')

Questo esempio passa un corpo della richiesta al metodo stream_inference. Esegue un'iterazione sulla risposta per stampare ogni pezzo restituito dal flusso di inferenza.

L'esempio presuppone che il modello nell'endpoint specificato sia un LLM che genera testo. L'output di questo esempio è un corpo di testo generato che viene stampato in modo incrementale:

a challenging problem in machine learning. The goal is to . . .

Invocare un modello mediante AWS CLI

È possibile invocare l’endpoint eseguendo comandi con AWS Command Line Interface (AWS CLI). AWS CLI supporta richieste di inferenza standard con il comando invoke-endpoint e supporta richieste di inferenza asincrone con il comando invoke-endpoint-async.

Nota

AWS CLI non supporta le richieste di inferenza in streaming.

L'esempio seguente utilizza il comando invoke-endpoint per inviare una richiesta di inferenza a un endpoint del modello:

aws sagemaker-runtime invoke-endpoint \ --endpoint-name endpoint_name \ --body fileb://$file_name \ output_file.txt

Per il parametro --endpoint-name fornisci il nome specificato quando hai creato l’endpoint. Per il parametro --body fornisci i dati di input che SageMaker AI deve passare al modello. I dati devono essere nello stesso formato utilizzato per l'addestramento. Questo esempio mostra come inviare dati binari all'endpoint.

Per ulteriori informazioni su quando utilizzare file:// su fileb:// quando si passa il contenuto di un file a un parametro di AWS CLI, consulta Best practice per i parametri dei file locali.

Per ulteriori informazioni e per visualizzare i parametri aggiuntivi che è possibile passare, consulta invoke-endpoint nel Riferimento al comando AWS CLI.

Se il comando invoke-endpoint ha esito positivo, restituisce una risposta come la seguente:

{ "ContentType": "<content_type>; charset=utf-8", "InvokedProductionVariant": "<Variant>" }

Se il comando non ha esito positivo, controlla se il payload di input è nel formato corretto.

Visualizza l'output della chiamata controllando il file di output del file (output_file.txt in questo esempio).

more output_file.txt