Código de inferência personalizado com serviços de hospedagem - Amazon SageMaker

As traduções são geradas por tradução automática. Em caso de conflito entre o conteúdo da tradução e da versão original em inglês, a versão em inglês prevalecerá.

Código de inferência personalizado com serviços de hospedagem

Esta seção explica como a Amazon SageMaker interage com um contêiner Docker que executa seu próprio código de inferência para serviços de hospedagem. Use essas informações para gravar um código de inferência e criar uma imagem do Docker.

Como SageMaker executa sua imagem de inferência

Para que um contêiner funcione como um executável, é preciso configurá-lo com uma instrução ENTRYPOINT em um Dockerfile. Observe o seguinte:

  • Para inferência do modelo, SageMaker executa o contêiner como:

    docker run image serve

    SageMaker substitui CMD as instruções padrão em um contêiner especificando o serve argumento após o nome da imagem. O argumento serve substitui os argumentos que você fornece com o comando CMD no Dockerfile.

     

  • SageMaker espera que todos os contêineres sejam executados com usuários root. Crie seu contêiner para que ele use somente usuários raiz. Ao SageMaker executar seu contêiner, os usuários que não têm acesso no nível raiz podem causar problemas de permissões.

     

  • Recomendamos que você use a forma exec da instrução ENTRYPOINT:

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

    Por exemplo:

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

    A forma exec da instrução ENTRYPOINT inicia o executável diretamente, não como elemento filho de /bin/sh. Isso permite que ele receba sinais SIGKILL de SIGTERM e para as SageMaker API operações, o que é um requisito.

     

    Por exemplo, quando você usa o CreateEndpointAPIpara criar um endpoint, SageMaker provisiona o número de instâncias de computação de ML exigidas pela configuração do endpoint, que você especifica na solicitação. SageMaker executa o contêiner Docker nessas instâncias.

     

    Se você reduzir o número de instâncias que apoiam o endpoint (chamando o UpdateEndpointWeightsAndCapacitiesAPI), SageMaker executa um comando para interromper o contêiner do Docker nas instâncias que estão sendo encerradas. Primeiramente, o comando envia o sinal SIGTERM e, então, envia o sinal SIGKILL 30 segundos depois.

     

    Se você atualizar o endpoint (chamando o UpdateEndpointAPI), SageMaker iniciará outro conjunto de instâncias de computação de ML e executará os contêineres do Docker que contêm seu código de inferência neles. Em seguida, ele executará um comando para interromper os contêineres anteriores do Docker. Para interromper um contêiner do Docker, primeiramente, o comando envia o sinal SIGTERM e, 30 segundos depois, envia o sinal SIGKILL.

     

  • SageMaker usa a definição de contêiner que você forneceu em sua CreateModelsolicitação para definir variáveis de ambiente e o DNS nome do host do contêiner da seguinte forma:

     

    • Ele define variáveis de ambiente usando o ContainerDefinition.Environment string-to-string mapa.

    • Ele define o DNS nome do host usando o. ContainerDefinition.ContainerHostname

       

  • Se você planeja usar GPU dispositivos para inferências de modelos (especificando instâncias de computação de ML GPU baseadas em sua CreateEndpointConfig solicitação), certifique-se de que seus contêineres sejam compatíveis. nvidia-docker Não agrupe NVIDIA drivers com a imagem. Para obter mais informações sobrenvidia-docker, consulte NVIDIA/nvidia-docker.

     

  • Você não pode usar o tini inicializador como seu ponto de entrada em SageMaker contêineres porque ele fica confuso com os argumentos train e. serve

Como SageMaker carrega seus artefatos de modelo

Em sua CreateModelAPIsolicitação, você pode usar o S3DataSource parâmetro ModelDataUrl or para identificar o local do S3 onde os artefatos do modelo são armazenados. SageMaker copia os artefatos do modelo do local do S3 para o /opt/ml/model diretório para uso pelo seu código de inferência. Seu contêiner tem acesso somente leitura ao /opt/ml/model. Não grave nesse diretório.

O ModelDataUrl deve apontar para um arquivo tar.gz. Caso contrário, SageMaker não baixará o arquivo.

Se você treinou seu modelo SageMaker, os artefatos do modelo são salvos como um único arquivo tar compactado no Amazon S3. Se você treinou seu modelo externamente SageMaker, precisará criar esse único arquivo tar compactado e salvá-lo em um local do S3. SageMaker descompacta esse arquivo tar no diretório /opt/ml/model antes do início do contêiner.

Para implantar modelos grandes, recomendamos que você siga Implantação de modelos não compactados.

Como o contêiner deve responder a solicitações de inferência

Para obter inferências, o aplicativo cliente envia uma POST solicitação ao SageMaker endpoint. SageMaker passa a solicitação para o contêiner e retorna o resultado da inferência do contêiner para o cliente.

Para obter mais informações sobre as solicitações de inferência que seu contêiner receberá, consulte as seguintes ações no Amazon SageMaker API Reference:

Requisitos para contêineres de inferência

Para responder às solicitações de inferência, seu contêiner deve atender aos seguintes requisitos:

  • SageMaker remove todos os POST cabeçalhos, exceto aqueles suportados peloInvokeEndpoint. SageMaker pode adicionar cabeçalhos adicionais. É necessário que os contêineres de inferência consigam ignorar esses cabeçalhos adicionais com segurança.

  • Para receber solicitações de inferência, o contêiner deve ter um servidor web ouvindo na porta 8080 e deve aceitar solicitações POST para os endpoints /invocations e /ping.

  • Os contêineres de modelo do cliente devem aceitar solicitações de conexão de soquete dentro de 250 ms.

  • Os contêineres de modelo de um cliente devem responder a solicitações dentro de 60 segundos. O modelo em si pode ter um tempo máximo de processamento de 60 segundos antes de responder às /invocations. Se o seu modelo levar de 50 a 60 segundos de tempo de processamento, o tempo limite do SDK soquete deve ser definido para 70 segundos.

exemplo funções de invocação

Os exemplos a seguir demonstram como o código em seu contêiner pode processar solicitações de inferência. Esses exemplos tratam das solicitações que os aplicativos clientes enviam usando a InvokeEndpoint ação.

FastAPI

Fast API é uma estrutura web para construção APIs com 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 . . .

Neste exemplo, a invocations função manipula a solicitação de inferência que é SageMaker enviada ao /invocations endpoint.

Flask

O Flask é um framework para o desenvolvimento de aplicativos web com 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')

Neste exemplo, a invoke função manipula a solicitação de inferência que é SageMaker enviada ao /invocations endpoint.

exemplo funções de invocação para solicitações de streaming

Os exemplos a seguir demonstram como o código em seu contêiner pode processar solicitações de inferência de streaming. Esses exemplos tratam das solicitações que os aplicativos clientes enviam usando a InvokeEndpointWithResponseStream ação.

Quando um contêiner processa uma solicitação de inferência de streaming, ele retorna a inferência do modelo como uma série de partes incrementalmente à medida que o modelo as gera. Os aplicativos cliente começam a receber respostas imediatamente conforme elas ficam disponíveis. Eles não precisam esperar que o modelo gere a resposta completa. Você pode implementar o streaming para oferecer suporte a experiências interativas rápidas, como chatbots, assistentes virtuais e geradores de música.

FastAPI

Fast API é uma estrutura web para construção APIs com 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 . . .

Neste exemplo, a invocations função manipula a solicitação de inferência que é SageMaker enviada ao /invocations endpoint. Para transmitir a resposta, o exemplo usa a classe StreamingResponse do framework Starlette.

Flask

O Flask é um framework para o desenvolvimento de aplicativos web com 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') . . .

Neste exemplo, a invocations função manipula a solicitação de inferência que é SageMaker enviada ao /invocations endpoint. Para transmitir a resposta, o exemplo usa função flask.stream_with_context do framework Flask.

Como o contêiner deve responder a solicitações de verificação de integridade (ping)

SageMaker lança novos contêineres de inferência nas seguintes situações:

  • Respondendo a CreateEndpointUpdateEndpoint, e chamadas UpdateEndpointWeightsAndCapacities API

  • Patches de segurança

  • Substituição de instâncias não íntegras

Logo após a inicialização do contêiner, SageMaker começa a enviar GET solicitações periódicas para o /ping endpoint.

O requisito mais simples do contêiner é responder com um código de status HTTP 200 e um corpo vazio. Isso indica SageMaker que o contêiner está pronto para aceitar solicitações de inferência no /invocations endpoint.

Se o contêiner não começar a passar pelas verificações de saúde respondendo consistentemente com 200 segundos durante os 8 minutos após a inicialização, a execução da nova instância falhará. Isso causa CreateEndpoint a falha, deixando o endpoint em um estado de falha. A atualização solicitada por UpdateEndpoint não foi concluída, os patches de segurança não foram aplicados e as instâncias não íntegras não foram substituídas.

Embora a exigência mínima seja para o contêiner retornar um 200 estático, um desenvolvedor de contêiner pode usar essa funcionalidade para executar verificações mais profundas. O tempo limite da solicitação em tentativas /ping é de 2 segundos.