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à.
Codice di inferenza personalizzato con servizi di hosting
Questa sezione spiega come Amazon SageMaker AI interagisce con un contenitore Docker che esegue il tuo codice di inferenza per i servizi di hosting. Utilizza queste informazioni per scrivere il codice di inferenza e creare un'immagine Docker.
Argomenti
In che modo l' SageMaker intelligenza artificiale gestisce la tua immagine di inferenza
In che modo l' SageMaker IA carica gli artefatti del modello
Come il tuo container deve rispondere alle richieste di inferenza
Come il tuo container deve rispondere alle richieste di controllo dello stato (Ping)
Contratto container per supportare funzionalità di streaming bidirezionale
Usa un registro Docker privato per contenitori di Real-Time inferenza
In che modo l' SageMaker intelligenza artificiale gestisce la tua immagine di inferenza
Per configurare un container per l'esecuzione come un eseguibile, utilizza un'istruzione ENTRYPOINT in un Dockerfile. Tenere presente quanto segue:
-
Per l'inferenza dei modelli, l' SageMaker intelligenza artificiale esegue il contenitore come:
docker runimageserveSageMaker L'IA sostituisce
CMDle istruzioni predefinite in un contenitore specificando l'serveargomento dopo il nome dell'immagine. L'argomentoservesostituisce gli argomenti che fornisci con il comandoCMDnel Dockerfile. -
SageMaker L'IA si aspetta che tutti i contenitori vengano eseguiti con utenti root. Crea il tuo container in modo che utilizzi solo utenti root. Quando l' SageMaker intelligenza artificiale esegue il contenitore, gli utenti che non dispongono dell'accesso a livello di root possono causare problemi di autorizzazione.
-
Ti consigliamo di utilizzare il modulo
execdell'istruzioneENTRYPOINT:ENTRYPOINT ["executable", "param1", "param2"]Esempio:
ENTRYPOINT ["python", "k_means_inference.py"]Il modulo
execdell'istruzioneENTRYPOINTavvia l'eseguibile direttamente, non come figlio di/bin/sh. Ciò gli consente di ricevere segnali similiSIGTERMe provenientiSIGKILLdalle operazioni dell' SageMaker API, il che è un requisito.Ad esempio, quando si utilizza l'
CreateEndpointAPI per creare un endpoint, l' SageMaker intelligenza artificiale fornisce il numero di istanze di calcolo ML richieste dalla configurazione dell'endpoint, specificato nella richiesta. SageMaker L'intelligenza artificiale esegue il contenitore Docker su tali istanze.Se riduci il numero di istanze che eseguono il backup dell'endpoint (chiamando l'
UpdateEndpointWeightsAndCapacitiesAPI), SageMaker AI esegue un comando per arrestare il contenitore Docker sulle istanze che vengono terminate. Il comando invia il segnaleSIGTERMe poi invia il segnaleSIGKILLtrenta secondi più tardi.Se aggiorni l'endpoint (chiamando l'
UpdateEndpointAPI), SageMaker AI avvia un altro set di istanze di calcolo ML ed esegue i contenitori Docker che contengono il tuo codice di inferenza su di esse. Poi esegue un comando per interrompere il precedente container Docker. Per interrompere un container Docker, il comando invia il segnaleSIGTERMe poi invia il segnaleSIGKILL30 secondi più tardi. -
SageMaker AI utilizza la definizione del contenitore fornita nella
CreateModelrichiesta per impostare le variabili di ambiente e il nome host DNS per il contenitore nel modo seguente:-
Imposta variabili di ambiente utilizzando la mappa stringa a stringa
ContainerDefinition.Environment. -
Imposta l'hostname DNS utilizzando
ContainerDefinition.ContainerHostname.
-
-
Se prevedi di utilizzare dispositivi GPU per le inferenze dei modelli (specificando le istanze di calcolo GPU-based ML nella
CreateEndpointConfigrichiesta), assicurati che i contenitori siano compatibili.nvidia-dockerNon aggregare i driver NVIDIA con l'immagine. Per ulteriori informazioni sunvidia-docker, consultare NVIDIA/nvidia-docker. -
Non puoi usare l'
tiniinizializzatore come punto di ingresso nei contenitori SageMaker AI perché viene confuso dagli argomenti and.trainserve
In che modo l' SageMaker IA carica gli artefatti del modello
Nella richiesta CreateModelAPI, puoi utilizzare il S3DataSource parametro ModelDataUrl o per identificare la posizione S3 in cui sono archiviati gli artefatti del modello. SageMaker L'intelligenza artificiale copia gli artefatti del modello dalla posizione S3 alla /opt/ml/model directory per essere utilizzati dal codice di inferenza. Il container ha accesso in sola lettura a /opt/ml/model. Non scrivere in questa directory.
Il valore di ModelDataUrl deve puntare a un file tar.gz. Altrimenti, l' SageMaker IA non scaricherà il file.
Se hai addestrato il tuo modello all' SageMaker intelligenza artificiale, gli artefatti del modello vengono salvati come un singolo file tar compresso in Amazon S3. Se hai addestrato il tuo modello al di fuori dell' SageMaker intelligenza artificiale, devi creare questo singolo file tar compresso e salvarlo in una posizione S3. SageMaker AI decomprime questo file tar nella directory/opt/ml/model prima dell'avvio del contenitore.
Per distribuire modelli di grandi dimensioni, consigliamo di seguire Implementazione di modelli non compressi.
Come il tuo container deve rispondere alle richieste di inferenza
Per ottenere inferenze, l'applicazione client invia una richiesta POST all'endpoint AI. SageMaker SageMaker L'IA passa la richiesta al contenitore e restituisce il risultato dell'inferenza dal contenitore al client.
Per ulteriori informazioni sulle richieste di inferenza che il contenitore riceverà, consulta le seguenti azioni nel riferimento all'API di Amazon SageMaker AI:
Requisiti per i container di inferenza
Per rispondere alle richieste di inferenza, il container deve soddisfare i seguenti requisiti:
-
SageMaker L'IA rimuove tutte le
POSTintestazioni tranne quelle supportate da.InvokeEndpointSageMaker L'IA potrebbe aggiungere intestazioni aggiuntive. I container dell'inferenza devono essere in grado di ignorare queste intestazioni aggiuntive. -
Per ricevere le richieste di inferenza, il container deve disporre di un server Web in ascolto sulla porta 8080 e deve accettare le richieste
POSTagli endpoint/invocationse/ping. -
I container di modello del cliente devono accettare le richieste di connessione socket entro 250 ms.
-
I container di modello del cliente devono rispondere alle richieste entro 60 secondi. Il modello stesso può avere un tempo di elaborazione massimo di 60 secondi prima di rispondere a
/invocations. Se il modello impiega 50-60 secondi di tempo di elaborazione, il timeout del socket dell'SDK deve essere impostato su 70 secondi. -
Il contenitore modello di un cliente che supporta lo streaming bidirezionale deve:
-
supporta WebSockets le connessioni sulla porta 8080 a /invocations-bidirectional-stream per impostazione predefinita.
-
dispongono di un server Web in ascolto sulla porta 8080 e devono accettare le richieste POST agli endpoint /ping.
-
Oltre ai controlli dello stato del contenitore tramite HTTP, il contenitore deve rispondere con Pong Frame per (RFC6455
), per l'invio di Ping Frame. WebSocket
-
Esempio funzioni di invocazione
Negli esempi seguenti viene illustrato come il codice nel container può elaborare richieste di inferenza. Questi esempi gestiscono le richieste inviate dalle applicazioni client utilizzando l'azione. InvokeEndpoint
Esempio funzioni di invocazione per le richieste di streaming
Gli esempi seguenti mostrano come il codice nel container di inferenza può elaborare le richieste di inferenza in streaming. Questi esempi gestiscono le richieste inviate dalle applicazioni client utilizzando l'azione InvokeEndpointWithResponseStream .
Quando un container gestisce una richiesta di inferenza in streaming, restituisce l'inferenza del modello in blocchi incrementali man mano che il modello le genera. Le applicazioni client iniziano a ricevere risposte immediatamente quando sono disponibili. Non è necessario attendere che il modello generi l'intera risposta. Puoi implementare lo streaming per supportare esperienze interattive veloci, come chatbot, assistenti virtuali e generatori di musica.
Esempio Esempi di funzioni di invocazione per lo streaming bidirezionale
Gli esempi seguenti mostrano come il codice del contenitore può elaborare richieste e risposte di inferenza in streaming. Questi esempi gestiscono le richieste di streaming inviate dalle applicazioni client utilizzando l' InvokeEndpointWithBidirectionalStreamazione.
Un contenitore con funzionalità di streaming bidirezionale gestisce le richieste di inferenza in streaming in cui le parti vengono generate in modo incrementale sul client e trasmesse al contenitore. Restituisce l'inferenza del modello al client sotto forma di una serie di parti man mano che il modello le genera. Le applicazioni client iniziano a ricevere risposte immediatamente quando sono disponibili. Non è necessario attendere che la richiesta sia completamente generata dal client o che il modello generi l'intera risposta. Puoi implementare lo streaming bidirezionale per supportare esperienze interattive veloci, come chatbot, assistenti vocali interattivi di intelligenza artificiale e traduzioni in tempo reale per un'esperienza più in tempo reale.
Come il tuo container deve rispondere alle richieste di controllo dello stato (Ping)
SageMaker L'intelligenza artificiale lancia nuovi contenitori di inferenza nelle seguenti situazioni:
-
Risposta a
CreateEndpointUpdateEndpointe chiamate APIUpdateEndpointWeightsAndCapacities -
Applicazione di patch di sicurezza
-
Sostituzione delle istanze non integre
Subito dopo l'avvio del contenitore, l' SageMaker IA inizia a inviare richieste GET periodiche all'endpoint. /ping
Il più semplice requisito per il container è di rispondere con un codice di stato HTTP 200 e un corpo vuoto. Ciò indica all' SageMaker IA che il contenitore è pronto ad accettare richieste di inferenza sull'endpoint. /invocations
Se il container non inizia a passare i controlli dell’integrità rispondendo costantemente con 200 secondi durante gli 8 minuti successivi all’avvio, l’avvio della nuova istanza ha esito negativo. Ciò causa un errore in CreateEndpoint e lascia l’endpoint in uno stato di errore. L’aggiornamento richiesto da UpdateEndpoint non viene completato, le patch di sicurezza non verranno applicate e le istanze non integre non vengono sostituite.
Nonostante la barra minima per il container è di fornire uno 200 statico, uno sviluppatore di container può utilizzare questa funzionalità per eseguire maggiori controlli. Ad esempio, il contenitore può verificare che il modello sia caricato in memoria e può servire richieste di inferenza. Il timeout della richiesta sui tentativi /ping è 2 secondi.
Consigliamo vivamente di implementare controlli sanitari significativi anziché restituire un 200 statico. L'/pingendpoint è il segnale principale utilizzato dall' SageMaker IA per determinare se un'istanza è integra. Se il contenitore restituisce sempre 200, anche quando il modello non è riuscito a caricarsi, ha esaurito la memoria o è entrato in uno stato errato, l' SageMaker IA continua a indirizzare le richieste di inferenza verso quell'istanza. Ciò comporta errori di invocazione prolungati per l'applicazione fino a quando l'istanza non viene sostituita manualmente o l'endpoint non viene aggiornato.
Un gestore ben implementato dovrebbe verificare /ping che:
-
L'artefatto del modello è caricato e pronto per essere utilizzato
-
Sono disponibili risorse critiche (memoria, disco, GPU, se applicabile)
-
Il percorso del codice di inferenza è funzionale (ad esempio, una previsione di test leggera ha successo)
Quando riporta /ping correttamente uno stato non integro restituendo una risposta diversa da 200, l' SageMaker intelligenza artificiale rileva l'errore e sostituisce automaticamente l'istanza (esclusi gli endpoint che utilizzano componenti di inferenza), riducendo al minimo i tempi di inattività dell'applicazione.
Inoltre, un contenitore in grado di gestire richieste di streaming bidirezionali deve rispondere con un Pong Frame (secondo il protocollo RFC6455) a un Ping Frame. WebSocket
Contratto container per supportare funzionalità di streaming bidirezionale
Se desideri ospitare il tuo container modello come endpoint SageMaker AI che supporta funzionalità di streaming bidirezionale, il container modello deve supportare il seguente contratto:
1. Etichetta Docker bidirezionale
Il contenitore del modello dovrebbe avere un'etichetta Docker che indichi alla piattaforma SageMaker AI che la funzionalità di streaming bidirezionale è supportata su questo contenitore.
com.amazonaws.sagemaker.capabilities.bidirectional-streaming=true
2. Support WebSocket Connection per le chiamate
Il contenitore modello di un cliente che supporta lo streaming bidirezionale deve supportare per impostazione predefinita WebSockets le connessioni sulla porta 8080 to. /invocations-bidirectional-stream
Questo percorso può essere sovrascritto passando l'intestazione quando si richiama l'API. X-Amzn-SageMaker-Model-Invocation-Path InvokeEndpointWithBidirectionalStream Inoltre, gli utenti possono specificare una stringa di query da aggiungere a questo percorso passando X-Amzn-SageMaker-Model-Query-String l'intestazione quando richiamano l'API. InvokeEndpointWithBidirectionalStream
3. Richiedi la gestione dello stream
<Blob>I payload di input dell' InvokeEndpointWithBidirectionalStream API vengono trasmessi in streaming come una serie di PayloadParts, che è solo un wrapper di un blocco binario («Bytes»:):
{ "PayloadPart": { "Bytes": <Blob>, "DataType": <String: UTF8 | BINARY>, "CompletionState": <String: PARTIAL | COMPLETE> "P": <String> } }
3.1. Frame di dati
SageMaker AI passa l'input PayloadParts al contenitore del modello come WebSocket Data Frames (RFC6455-Section-5.6
-
SageMaker L'IA non ispeziona il blocco binario.
-
Alla ricezione di un input PayloadPart
-
SageMaker L'IA crea esattamente un WebSocket Data Frame da
PayloadPart.Bytes, quindi lo passa al contenitore del modello. -
Se
PayloadPart.DataType = UTF8, SageMaker AI crea un frame di dati di testo -
Se
PayloadPart.DataTypenon presenta oPayloadPart.DataType = BINARY, SageMaker AI crea un Binary Data Frame
-
-
-
Il PayloadPart with iniziale
PayloadPart.CompletionState = PARTIALverrà tradotto in un WebSocket Data Frame, con FIN bit clear. -
Il PayloadParts with successivo
PayloadPart.CompletionState = PARTIALverrà tradotto in WebSocket Continuation Frames con FIN bit clear. -
Il risultato finale PayloadPart
PayloadPart.CompletionState = COMPLETEverrà tradotto in WebSocket Continuation Frame con bit FIN impostato.
-
-
SageMaker L'IA non codifica o decodifica il blocco binario dall'input PayloadPart, i byte vengono passati al contenitore del modello così com'è.
-
SageMaker L'intelligenza artificiale non combina più input in uno solo. PayloadParts BinaryDataFrame
-
SageMaker L'intelligenza artificiale non suddivide un input PayloadPart in più BinaryDataFrames input.
Esempio: flusso di messaggi frammentato
Client sends: PayloadPart 1: {Bytes: "Hello ", DataType: "UTF8", CompletionState: "PARTIAL"} PayloadPart 2: {Bytes: "World", DataType: "UTF8", CompletionState: "COMPLETE"} Container receives: Frame 1: Text Data Frame with "Hello " (FIN=0) Frame 2: Continuation Frame with "World" (FIN=1)
3.2. Telai di controllo
Oltre ai Data Frames, SageMaker AI invia anche Control Frames al container del modello (RFC6455-Section-5.5
-
Close Frame: L' SageMaker IA può inviare Close Frame (RFC6455-Section-5.5.1
) al contenitore del modello se la connessione viene chiusa per qualsiasi motivo. -
Ping Frame: l' SageMaker IA invia Ping Frame (RFC6455-Section-5.5.2
) una volta ogni 60 secondi, il contenitore del modello deve rispondere con Pong Frame. Se non viene ricevuto alcun Pong Frame (RFC6455-Section-5.5.3 ) per 5 Ping consecutivi, la connessione verrà chiusa dall' SageMaker IA. -
Pong Frame: SageMaker L'IA risponderà ai Ping Frame del contenitore modello con Pong Frames.
4. Gestione del flusso di risposta
L'output viene trasmesso in streaming come una serie di PayloadParts, ModelStreamErrors o InternalStreamFailures.
{ "PayloadPart": { "Bytes": <Blob>, "DataType": <String: UTF8 | BINARY>, "CompletionState": <String: PARTIAL | COMPLETE>, }, "ModelStreamError": { "ErrorCode": <String>, "Message": <String> }, "InternalStreamFailure": { "Message": <String> } }
4.1. Frame di dati
SageMaker L'IA converte i frame di dati ricevuti dal contenitore del modello in output PayloadParts:
-
Dopo aver ricevuto un WebSocket Text Data Frame dal contenitore del modello, l' SageMaker IA ottiene i byte grezzi dal Text Data Frame e li avvolge in una risposta PayloadPart, nel frattempo impostata.
PayloadPart.DataType = UTF8 -
Quando riceve un WebSocket Binary Data Frame dal contenitore del modello, l' SageMaker IA avvolge direttamente i byte dal frame di dati in una risposta, nel frattempo impostata. PayloadPart
PayloadPart.DataType = BINARY -
Per i messaggi frammentati come definiti in: Fragmentation: RFC6455-Section-5.4
-
Il Data Frame iniziale con FIN bit clear verrà tradotto in un PayloadPart with.
PayloadPart.CompletionState = PARTIAL -
I successivi Continuation Frames con FIN bit clear verranno tradotti in PayloadParts with
PayloadPart.CompletionState = PARTIAL. -
Il Continuation Frame finale con set di bit FIN verrà tradotto in PayloadPart with.
PayloadPart.CompletionState = COMPLETE
-
-
SageMaker L'IA non codifica o decodifica i byte ricevuti dai contenitori del modello, i byte vengono passati al contenitore del modello così com'è.
-
SageMaker L'IA non combina più frame di dati ricevuti dal contenitore del modello in un'unica risposta. PayloadPart
-
SageMaker L'intelligenza artificiale non suddivide un Data Frame ricevuto dal contenitore del modello in più risposte PayloadParts.
Esempio: Streaming Response Flow
Container sends: Frame 1: Text Data Frame with "Generating" (FIN=0) Frame 2: Continuation Frame with " response..." (FIN=1) Client receives: PayloadPart 1: {Bytes: "Generating", DataType: "UTF8", CompletionState: "PARTIAL"} PayloadPart 2: {Bytes: " response...", DataType: "UTF8", CompletionState: "COMPLETE"}
4.2. Telai di controllo
SageMaker L'intelligenza artificiale risponde ai seguenti Control Frames dal contenitore del modello:
-
Dopo aver ricevuto un Close Frame (RFC6455-Section-5.5.1
) dal contenitore del modello, l' SageMaker IA ModelStreamError inserirà il codice di stato (RFC6455-Section-7.4 ) e i messaggi di errore e li trasmetterà all'utente finale. -
Alla ricezione di un Ping Frame (RFC6455-Section-5.5.2
) dal contenitore del modello, l' SageMaker IA risponderà con Pong Frame. -
Pong Frame (RFC6455-Section-5.5.3
): Se non viene ricevuto alcun Pong Frame per 5 Ping consecutivi, la connessione verrà chiusa dall' SageMaker IA.