Codice di inferenza personalizzato con servizi di hosting
Questa sezione spiega come Amazon SageMaker AI interagisce con un container Docker che esegue il 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 AI esegue l’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 AI esegue il container come:
docker runimageserveSageMaker AI sostituisce le istruzioni
CMDpredefinite in un container specificando l’argomentoservedopo il nome dell’immagine. L'argomentoservesostituisce gli argomenti che fornisci con il comandoCMDnel Dockerfile. -
SageMaker AI prevede che tutti i container funzionino con utenti root. Crea il tuo container in modo che utilizzi solo utenti root. Quando SageMaker AI esegue il container, 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"]Per esempio:
ENTRYPOINT ["python", "k_means_inference.py"]Il modulo
execdell'istruzioneENTRYPOINTavvia l'eseguibile direttamente, non come figlio di/bin/sh. Questo gli consente di ricevere segnali comeSIGTERMeSIGKILLdalle operazioni API di SageMaker, che è un requisito.Ad esempio, quando utilizzi l’API
CreateEndpointper creare un endpoint, SageMaker AI effettua il provisioning del numero di istanze di calcolo ML necessarie per la configurazione dell’endpoint, che specifichi nella richiesta. SageMaker AI esegue il container Docker su tali istanze.Se riduci il numero di istanze che supportano l’endpoint (chiamando l’API
UpdateEndpointWeightsAndCapacities), SageMaker AI esegue un comando per arrestare il container Docker sulle istanze in fase di terminazione. Il comando invia il segnaleSIGTERMe poi invia il segnaleSIGKILLtrenta secondi più tardi.Se aggiorni l’endpoint (chiamando l’API
UpdateEndpoint), SageMaker AI avvia un altro set di istanze di calcolo ML ed esegue i container Docker che contengono il codice di inferenza. 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 di container fornita nella richiesta
CreateModelper impostare le variabili di ambiente e il nome host DNS per il container come segue:-
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 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 puoi utilizzare l’inizializzatore
tinicome punto di ingresso nei container SageMaker AI, perché può generare confusione con gli argomentitraineserve.
Come SageMaker AI carica gli artefatti del modello
Nella richiesta API CreateModel, è possibile utilizzare il parametro ModelDataUrl o S3DataSource per identificare la posizione S3 in cui sono archiviati gli artefatti del modello. SageMaker AI copia gli artefatti del modello dalla posizione S3 alla directory /opt/ml/model per l’utilizzo da parte del 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. In caso contrario, SageMaker AI non scarica il file.
Se hai addestrato il modello in SageMaker AI, gli artefatti del modello vengono salvati come singolo file TAR compresso in Amazon S3. Se hai addestrato il modello all’esterno di SageMaker AI, 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 container.
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 AI. SageMaker AI passa la richiesta al container e restituisce il risultato dell’inferenza dal container al client.
Per ulteriori informazioni sulle richieste di inferenza che il container deve ricevere, consulta le seguenti azioni nella documentazione di riferimento dell’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 AI rimuove tutte le intestazioni
POSTeccetto quelle supportate daInvokeEndpoint. SageMaker AI potrebbe aggiungere ulteriori intestazioni. 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.
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.
Come il tuo container deve rispondere alle richieste di controllo dello stato (Ping)
SageMaker AI avvia nuovi container di inferenza nelle seguenti situazioni:
-
Risposta a
CreateEndpointUpdateEndpointe chiamate APIUpdateEndpointWeightsAndCapacities -
Applicazione di patch di sicurezza
-
Sostituzione delle istanze non integre
Dopo l’avvio del container, SageMaker AI 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 a SageMaker AI che il container è pronto ad accettare richieste di inferenza all’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. Il timeout della richiesta sui tentativi /ping è 2 secondi.