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à.
Uso del codice di inferenza con i servizi di hosting
Questa sezione spiega come Amazon SageMaker 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
- Come SageMaker viene eseguita la tua immagine di inferenza
- Come SageMaker 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)
- Utilizzo di un Registro Docker privato per Container di inferenza in tempo reale
Come SageMaker viene eseguita la tua immagine di inferenza
Per configurare un container per l'esecuzione come un eseguibile, utilizza un'istruzione ENTRYPOINT
in un Dockerfile. Tieni presente quanto segue:
-
Per l'inferenza del modello, SageMaker esegue il contenitore come:
docker run
image
serveSageMaker sostituisce le
CMD
istruzioni predefinite in un contenitore specificando l'serve
argomento dopo il nome dell'immagine. L'argomentoserve
sostituisce gli argomenti che fornisci con il comandoCMD
nel Dockerfile. -
SageMaker si aspetta che tutti i contenitori vengano eseguiti con utenti root. Crea il tuo container in modo che utilizzi solo utenti root. Quando SageMaker 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
exec
dell'istruzioneENTRYPOINT
:ENTRYPOINT ["executable", "param1", "param2"]
Per esempio:
ENTRYPOINT ["python", "k_means_inference.py"]
Il modulo
exec
dell'istruzioneENTRYPOINT
avvia l'eseguibile direttamente, non come figlio di/bin/sh
. Ciò gli consente di ricevere segnali similiSIGTERM
e provenientiSIGKILL
dalle operazioni dell' SageMaker API, il che è un requisito.Ad esempio, quando si utilizza l'
CreateEndpoint
API per creare un endpoint, viene SageMaker fornito il numero di istanze di calcolo ML richieste dalla configurazione dell'endpoint, specificato nella richiesta. SageMaker esegue il contenitore Docker su tali istanze.Se riduci il numero di istanze che eseguono il backup dell'endpoint (chiamando l'
UpdateEndpointWeightsAndCapacities
API), SageMaker esegue un comando per arrestare il contenitore Docker sulle istanze che vengono terminate. Il comando invia il segnaleSIGTERM
e poi invia il segnaleSIGKILL
trenta secondi più tardi.Se aggiorni l'endpoint (chiamando l'
UpdateEndpoint
API), SageMaker avvia un altro set di istanze di calcolo ML ed esegue i contenitori Docker che contengono il 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 segnaleSIGTERM
e poi invia il segnaleSIGKILL
30 secondi più tardi. -
SageMaker utilizza la definizione del contenitore fornita nella
CreateModel
richiesta per impostare le variabili di ambiente e il nome host DNS per il contenitore nel modo seguente:-
Imposta le variabili di ambiente utilizzando la
ContainerDefinition.Environment
string-to-string mappa. -
Imposta l'hostname DNS utilizzando
ContainerDefinition.ContainerHostname
.
-
-
Se prevedi di utilizzare dispositivi GPU per le inferenze di modelli (specificando le istanze di calcolo ML basate su GPU nella richiesta
CreateEndpointConfig
), accertati che i container siano compatibili connvidia-docker
. Non aggregare i driver NVIDIA con l'immagine. Per ulteriori informazioni sunvidia-docker
, consulta NVIDIA/nvidia-docker. -
Non è possibile utilizzare l'
tini
inizializzatore come punto di ingresso nei SageMaker contenitori perché viene confuso dagli argomentitrain
andserve
.
Come SageMaker carica gli artefatti del modello
Nella richiesta CreateModel
API, puoi utilizzare il S3DataSource
parametro ModelDataUrl
o per identificare la posizione S3 in cui sono archiviati gli artefatti del modello. SageMaker 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 essere a un file tar.gz. Altrimenti, non SageMaker scaricherà il file.
Se hai addestrato il tuo modello SageMaker, gli artefatti del modello vengono salvati come un singolo file tar compresso in Amazon S3. Se hai addestrato il tuo modello all'esterno SageMaker, devi creare questo singolo file tar compresso e salvarlo in una posizione S3. SageMaker 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. SageMaker SageMaker 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 nell'Amazon SageMaker API Reference:
Requisiti per i container di inferenza
Per rispondere alle richieste di inferenza, il container deve soddisfare i seguenti requisiti:
-
SageMaker rimuove tutte le
POST
intestazioni tranne quelle supportate da.InvokeEndpoint
SageMaker 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
POST
agli endpoint/invocations
e/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.
Esempio funzioni di richiamo
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' InvokeEndpoint azione.
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 come una serie di parti in modo incrementale 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. È possibile implementare lo streaming per supportare esperienze interattive veloci, come chatbot, assistenti virtuali e generatori di musica.
Come il tuo container deve rispondere alle richieste di controllo dello stato (Ping)
SageMaker avvia nuovi contenitori di inferenza nelle seguenti situazioni:
-
Risposta a
CreateEndpoint
UpdateEndpoint
e chiamate APIUpdateEndpointWeightsAndCapacities
-
Applicazione di patch di sicurezza
-
Sostituzione delle istanze non integre
Subito dopo l'avvio del contenitore, SageMaker inizia a inviare richieste GET periodiche all'endpoint. /ping
Il più semplice requisito sul container è di rispondere con un codice di stato HTTP 200 e un corpo vuoto. Ciò indica SageMaker che il contenitore è pronto ad accettare richieste di inferenza sull'endpoint. /invocations
Se il contenitore non inizia a superare i controlli di integrità rispondendo costantemente con 200s negli 8 minuti successivi all'avvio, il lancio della nuova istanza fallisce. Ciò CreateEndpoint
causa un errore e lascia l'endpoint in uno stato di errore. L'aggiornamento richiesto da UpdateEndpoint
non è completato, le patch di sicurezza non vengono 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. Il timeout della richiesta sui tentativi /ping
è 2 secondi.