Código de inferência personalizado com serviços de host - SageMaker IA da Amazon

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 host

Esta seção explica como a Amazon SageMaker AI 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 a SageMaker IA 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, a SageMaker IA executa o contêiner como:

    docker run image serve

    SageMaker A IA substitui CMD as declaraçõ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 A IA espera que todos os contêineres sejam executados com usuários root. Crie seu contêiner para que ele use somente usuários-raiz. Quando a SageMaker IA executa 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 como SIGTERM e SIGKILL das operações da SageMaker API, o que é um requisito.

     

    Por exemplo, quando você usa a CreateEndpointAPI para criar um endpoint, a SageMaker IA 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 A IA executa o contêiner Docker nessas instâncias.

     

    Se você reduzir o número de instâncias que apoiam o endpoint (chamando a UpdateEndpointWeightsAndCapacitiesAPI), a SageMaker IA 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 a UpdateEndpointAPI), a SageMaker AI lançará 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 A IA usa a definição de contêiner que você forneceu em sua CreateModelsolicitação para definir variáveis de ambiente e o nome do host DNS para o contêiner da seguinte forma:

     

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

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

       

  • Se você planeja usar dispositivos de GPU para inferências de modelo (especificando instâncias de cálculo de ML baseadas em GPU na sua solicitação CreateEndpointConfig), verifique se os seus contêineres são compatíveis com nvidia-docker. Não empacote drivers NVIDIA com a imagem. Para obter mais informações sobre o nvidia-docker, consulte NVIDIA/nvidia-docker.

     

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

Como a SageMaker IA carrega seus artefatos de modelo

Em sua solicitação de CreateModelAPI, você pode usar o S3DataSource parâmetro ModelDataUrl or para identificar o local do S3 onde os artefatos do modelo são armazenados. SageMaker A IA copia os artefatos do seu modelo da localização do S3 para o /opt/ml/model diretório para serem usados 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, a SageMaker IA não baixará o arquivo.

Se você treinou seu modelo em SageMaker IA, os artefatos do modelo são salvos como um único arquivo tar compactado no Amazon S3. Se você treinou seu modelo fora da SageMaker IA, precisará criar esse único arquivo tar compactado e salvá-lo em um local do S3. SageMaker O AI descompacta esse into /opt/ml/model diretório de arquivos tar 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 solicitação POST para o endpoint de SageMaker IA. SageMaker A IA 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 na Amazon SageMaker AI 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 A IA remove todos os POST cabeçalhos, exceto aqueles suportados peloInvokeEndpoint. SageMaker A IA 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 precisar de 50 a 60 segundos de tempo de processamento, o tempo limite de soquete do SDK deverá ser definido como 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

O FastAPI é 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 a SageMaker IA envia para o /invocations endpoint.

Flask

O Flask é um framework para o desenvolvimento de aplicações 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 a SageMaker IA envia para o /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. As aplicações 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 apoio a experiências interativas rápidas, como chatbots, assistentes virtuais e geradores de música.

FastAPI

O FastAPI é 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 a SageMaker IA envia para o /invocations endpoint. Para transmitir a resposta, o exemplo usa a classe StreamingResponse do framework Starlette.

Flask

O Flask é um framework para o desenvolvimento de aplicações 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 a SageMaker IA envia para o /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 A IA lança novos contêineres de inferência nas seguintes situações:

  • Respondendo a chamadas de API CreateEndpoint, UpdateEndpoint, UpdateEndpointWeightsAndCapacities

  • Patches de segurança

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

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

O requisito mais simples é que o contêiner deve responder com um código de status HTTP 200 e um corpo vazio. Isso indica à SageMaker IA 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 integridade, respondendo consistentemente com 200s durante os 8 minutos após a inicialização, a execução da nova instância falhará. Isso fará o CreateEndpoint falhar, deixando o endpoint em um estado de falha. A atualização solicitada por UpdateEndpoint não será concluída, os patches de segurança não serão aplicados e as instâncias não íntegras não serão 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.