Crie seu próprio contêiner para endpoints multimodelo do SageMaker
Consulte as seções a seguir para trazer seu próprio contêiner e dependências para endpoints multimodelo.
Tópicos
- Traga suas próprias dependências para endpoints multimodelo em instâncias com compatibilidade com CPU
- Traga suas próprias dependências para endpoints multimodelo em instâncias compatíveis com GPU
- Use o kit de ferramentas de inferência do SageMaker
- Contrato para contêineres personalizados para endpoints multimodelo
Traga suas próprias dependências para endpoints multimodelo em instâncias com compatibilidade com CPU
Se nenhuma das imagens de contêiner pré-criadas atender às suas necessidades, você poderá criar seu próprio contêiner para uso com endpoints multimodelo com compatibilidade com CPU.
Espera-se que as imagens personalizadas do Amazon Elastic Container Registry (Amazon ECR) implantadas no Amazon SageMaker sigam o contrato básico descrito em Código de inferência personalizado com serviços de host que governa como o SageMaker interage com um contêiner do Docker que executa seu próprio código de inferência. Para que um contêiner seja capaz de carregar e atender a vários modelos simultaneamente, há APIs e comportamentos adicionais que devem ser seguidos. Este contrato adicional inclui novas APIs para carregar, listar, obter e descarregar modelos, e uma API diferente para invocar modelos. Há também comportamentos diferentes para cenários de erro que as APIs precisam cumprir. Para indicar que o contêiner está em conformidade com os requisitos adicionais, você pode adicionar o seguinte comando ao arquivo do Docker:
LABEL com.amazonaws.sagemaker.capabilities.multi-models=true
O SageMaker também injeta uma variável de ambiente no contêiner.
SAGEMAKER_MULTI_MODEL=true
Se você estiver criando um endpoint multimodelo para uma linha de pipeline de inferência serial, seu arquivo Docker deverá ter os rótulos necessários tanto para pipelines de inferência serial quanto para pipelines de vários modelos. Para mais informações sobre pipelines de informações seriais, consulte Executar predições em tempo real com um pipeline de inferência.
Para ajudá-lo a implementar esses requisitos para um contêiner personalizado, duas bibliotecas estão disponíveis:
-
Multi Model Server
é uma estrutura de código aberto que pode ser instalada em contêineres para servir aos modelos de machine learning e fornecer o front-end que atende aos requisitos das novas APIs de contêiner de endpoint multimodelo. Ela fornece os recursos de gerenciamento de modelos e o front-end HTTP exigidos pelos endpoints multimodelo para hospedar vários modelos em um único contêiner, carregar modelos e descarregar modelos para dentro e fora do contêiner dinamicamente, e executa a inferência em um modelo carregado especificado. Ela também fornece um backend conectável compatível com um manipulador de backend conectável personalizado em que você pode implementar seu próprio algoritmo. -
Kit de ferramentas de inferência do SageMaker
é uma biblioteca que inicializa o Multi Model Server com uma configuração e definições que o tornam compatível com endpoints multimodelo SageMaker. Ela também permite ajustar parâmetros de desempenho importantes, como o número de operadores por modelo, dependendo das necessidades do seu cenário.
Traga suas próprias dependências para endpoints multimodelo em instâncias compatíveis com GPU
Atualmente, o recurso Bring Your Own Container (BYOC) em endpoints multimodelo com instâncias baseadas em GPU não é compatível pelas bibliotecas Multi Model Server e SageMaker Inference Toolkit.
Para criar endpoints multimodelo com instâncias compatíveis com GPU, você pode usar o Servidor de Inferência NVIDIA Triton que pode ser usado pelo SageMaker, com os Contêineres de Inferência NVIDIA Triton
FROM 301217895009.dkr.ecr.us-west-2.amazonaws.com/sagemaker-tritonserver:22.07-py3
Importante
Os contêineres com o Triton Inference Server são os únicos contêineres compatíveis que você pode usar para endpoints multimodelo com compatibilidade com GPU.
Use o kit de ferramentas de inferência do SageMaker
nota
O kit de ferramentas de inferência do SageMaker só é compatível com endpoints multimodelo com compatibilidade com CPU. O kit de ferramentas de inferência do SageMaker atualmente não é compatível com endpoints multimodelo com suporte de GPU.
Contêineres pré-construídos que oferecem apoio a endpoints multimodelo estão listados em Algoritmos, frameworks e instâncias compatíveis para endpoints multimodelo. Se você quiser usar qualquer outra estrutura de trabalho ou algoritmo, será necessário criar um contêiner. A maneira mais fácil de fazer isso é usando o kit de ferramentas de inferência do SageMaker
nota
O kit de ferramentas de inferência do SageMaker oferece apoio apenas a manipuladores de modelos do Python. Se você quiser implementar o manipulador em qualquer outra linguagem, será necessário criar seu próprio contêiner que implementa as APIs adicionais do endpoint multimodelo. Para ter mais informações, consulte Contrato para contêineres personalizados para endpoints multimodelo.
Como ampliar um contêiner usando o toolkit de inferência do SageMaker
-
Crie um manipulador de modelo. O MMS espera um manipulador de modelo, que é um arquivo Python que implementa funções para pré-processar, obter predições de modelo e processar a saída em um manipulador de modelo. Para obter um exemplo de um manipulador de modelo, consulte model_handler.py
no caderno de exemplo. -
Importe o toolkit de inferência e use sua função
model_server.start_model_server
para iniciar o MMS. O exemplo a seguir é do arquivodockerd-entrypoint.py
do caderno de exemplo. Observe que a chamada paramodel_server.start_model_server
transmite o manipulador de modelo descrito na etapa anterior:import subprocess import sys import shlex import os from retrying import retry from subprocess import CalledProcessError from sagemaker_inference import model_server def _retry_if_error(exception): return isinstance(exception, CalledProcessError or OSError) @retry(stop_max_delay=1000 * 50, retry_on_exception=_retry_if_error) def _start_mms(): # by default the number of workers per model is 1, but we can configure it through the # environment variable below if desired. # os.environ['SAGEMAKER_MODEL_SERVER_WORKERS'] = '2' model_server.start_model_server(handler_service='/home/model-server/model_handler.py:handle') def main(): if sys.argv[1] == 'serve': _start_mms() else: subprocess.check_call(shlex.split(' '.join(sys.argv[1:]))) # prevent docker exit subprocess.call(['tail', '-f', '/dev/null']) main()
-
No
Dockerfile
, copie o manipulador de modelo da primeira etapa e especifique o arquivo Python da etapa anterior como o ponto de entrada noDockerfile
. As linhas a seguir são do Dockerfileusado no caderno de exemplo: # Copy the default custom service file to handle incoming data and inference requests COPY model_handler.py /home/model-server/model_handler.py # Define an entrypoint script for the docker image ENTRYPOINT ["python", "/usr/local/bin/dockerd-entrypoint.py"]
-
Crie e registre o contêiner. O seguinte script de shell do caderno de exemplo constrói o contêiner e o carrega em um repositório do Registro de Contêiner Elástico da Amazon (Amazon ECR) na sua conta AWS:
%%sh # The name of our algorithm algorithm_name=demo-sagemaker-multimodel cd container account=$(aws sts get-caller-identity --query Account --output text) # Get the region defined in the current configuration (default to us-west-2 if none defined) region=$(aws configure get region) region=${region:-us-west-2} fullname="${account}.dkr.ecr.${region}.amazonaws.com/${algorithm_name}:latest" # If the repository doesn't exist in ECR, create it. aws ecr describe-repositories --repository-names "${algorithm_name}" > /dev/null 2>&1 if [ $? -ne 0 ] then aws ecr create-repository --repository-name "${algorithm_name}" > /dev/null fi # Get the login command from ECR and execute it directly $(aws ecr get-login --region ${region} --no-include-email) # Build the docker image locally with the image name and then push it to ECR # with the full name. docker build -q -t ${algorithm_name} . docker tag ${algorithm_name} ${fullname} docker push ${fullname}
Agora é possível usar esse contêiner para implantar endpoints multimodelo no SageMaker.