Codice di inferenza personalizzato con servizi di hosting - Amazon SageMaker AI

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.

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. Tieni presente quanto segue:

  • Per l'inferenza dei modelli, l' SageMaker intelligenza artificiale esegue il contenitore come:

    docker run image serve

    SageMaker L'IA sostituisce CMD le istruzioni predefinite in un contenitore specificando l'serveargomento dopo il nome dell'immagine. L'argomento serve sostituisce gli argomenti che fornisci con il comando CMD nel 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 exec dell'istruzione ENTRYPOINT:

    ENTRYPOINT ["executable", "param1", "param2"]

    Per esempio:

    ENTRYPOINT ["python", "k_means_inference.py"]

    Il modulo exec dell'istruzione ENTRYPOINT avvia l'eseguibile direttamente, non come figlio di /bin/sh. Ciò gli consente di ricevere segnali simili SIGTERM e provenienti SIGKILL dalle 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'IA 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 segnale SIGTERM e poi invia il segnale SIGKILL trenta 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 segnale SIGTERM e poi invia il segnale SIGKILL 30 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 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 con nvidia-docker. Non aggregare i driver NVIDIA con l'immagine. Per ulteriori informazioni su nvidia-docker, consulta NVIDIA/nvidia-docker.

     

  • Non puoi usare l'tiniinizializzatore come punto di ingresso nei contenitori SageMaker AI perché viene confuso dagli argomenti train andserve.

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 questa directory di file into /opt/ml/model tar 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 AI rimuove tutte le POST intestazioni tranne quelle supportate da. InvokeEndpoint SageMaker 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 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 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' InvokeEndpoint azione.

FastAPI

FastAPI è un framework web per la creazione APIs con Python.

from fastapi import FastAPI, status, Request, Response . . . app = FastAPI() . . . @app.post('/invocations') async def invocations(request: Request): # model() is a hypothetical function that gets the inference output: model_resp = await model(Request) response = Response( content=model_resp, status_code=status.HTTP_200_OK, media_type="text/plain", ) return response . . .

In questo esempio, la invocations funzione gestisce la richiesta di inferenza che l' SageMaker IA invia all'endpoint. /invocations

Flask

Flask è un framework per lo sviluppo di applicazioni web con Python.

import flask . . . app = flask.Flask(__name__) . . . @app.route('/invocations', methods=["POST"]) def invoke(request): # model() is a hypothetical function that gets the inference output: resp_body = model(request) return flask.Response(resp_body, mimetype='text/plain')

In questo esempio, la invoke funzione gestisce la richiesta di inferenza che l' SageMaker IA invia all'endpoint. /invocations

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.

FastAPI

FastAPI è un framework web per la creazione APIs con Python.

from starlette.responses import StreamingResponse from fastapi import FastAPI, status, Request . . . app = FastAPI() . . . @app.post('/invocations') async def invocations(request: Request): # Streams inference response using HTTP chunked encoding async def generate(): # model() is a hypothetical function that gets the inference output: yield await model(Request) yield "\n" response = StreamingResponse( content=generate(), status_code=status.HTTP_200_OK, media_type="text/plain", ) return response . . .

In questo esempio, la invocations funzione gestisce la richiesta di inferenza che l' SageMaker IA invia all'endpoint. /invocations Per lo streaming della risposta, l'esempio utilizza la classe StreamingResponse dal framework Starlette.

Flask

Flask è un framework per lo sviluppo di applicazioni web con Python.

import flask . . . app = flask.Flask(__name__) . . . @app.route('/invocations', methods=["POST"]) def invocations(request): # Streams inference response using HTTP chunked encoding def generate(): # model() is a hypothetical function that gets the inference output: yield model(request) yield "\n" return flask.Response( flask.stream_with_context(generate()), mimetype='text/plain') . . .

In questo esempio, la invocations funzione gestisce la richiesta di inferenza che l' SageMaker IA invia all'endpoint. /invocations Per lo streaming della risposta, l'esempio utilizza la funzione flask.stream_with_context del framework Flask.

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 CreateEndpoint UpdateEndpoint e chiamate API UpdateEndpointWeightsAndCapacities

  • 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 contenitore non inizia a superare i controlli di integrità rispondendo costantemente con 200 secondi 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.