Créer votre propre conteneur avec le serveur multimodèle - Amazon SageMaker

Créer votre propre conteneur avec le serveur multimodèle

Les images Elastic Container Registry (ECR) personnalisées déployées dans Amazon SageMaker doivent respecter le contrat de base décrit dans Utilisation de votre propre code d'inférence avec les services d'hébergement, qui régit la façon dont SageMaker interagit avec un conteneur Docker qui exécute votre propre code d'inférence. Pour qu'un conteneur puisse charger et servir plusieurs modèles simultanément, il existe des API et des comportements supplémentaires qui doivent être suivis. Ce contrat supplémentaire inclut de nouvelles API pour charger, lister, obtenir et décharger des modèles, ainsi qu'une API différente pour appeler des modèles. Il existe également différents comportements pour les scénarios d'erreur que les API doivent respecter. Pour indiquer que le conteneur satisfait aux exigences supplémentaires, vous pouvez ajouter la commande suivante à votre fichier Docker :

LABEL com.amazonaws.sagemaker.capabilities.multi-models=true

SageMaker injecte également une variable d'environnement dans le conteneur

SAGEMAKER_MULTI_MODEL=true

Si vous créez un point de terminaison multimodèle pour un pipeline d'inférence série, votre fichier Docker doit avoir les étiquettes requises pour les pipelines multimodèles et d'inférence série. Pour de plus amples informations sur les pipelines d'informations série, veuillez consulter Réalisation de prédictions en temps réel avec un pipeline d'inférence.

Pour vous aider à implémenter ces exigences pour un conteneur personnalisé, deux bibliothèques sont disponibles :

  • Multi Model Server est un framework open source destiné à servir des modèles de machine learning qui peuvent être installés dans des conteneurs pour fournir l'interface frontale qui répond aux exigences des nouvelles API de conteneur de point de terminaison multi-modèles. Il fournit les fonctionnalités de gestion frontale et de modèle HTTP requises par les points de terminaison multi-modèles pour héberger plusieurs modèles dans un conteneur unique, y charger des modèles et décharger dynamiquement des modèles hors du conteneur, et effectuer une inférence sur un modèle chargé spécifié. Il fournit également un backend enfichable qui prend en charge un gestionnaire backend personnalisé enfichable où vous pouvez implémenter votre propre algorithme.

  • SageMaker Inference Toolkit est une bibliothèque qui amorce Multi Model Server avec une configuration et des paramètres qui le rendent compatible avec les points de terminaison multimodèles SageMaker. Il vous permet également de modifier des paramètres de performance importants, tels que le nombre de employés par modèle, en fonction des besoins de votre scénario.

Utilisation de la boîte à outils d'inférence SageMaker

Actuellement, les seuls conteneurs préconçus prenant en charge les points de terminaison multimodèles sont le conteneur d'inférence MXNet et le conteneur d'inférence PyTorch. Si vous voulez utiliser un autre framework ou algorithme, vous devez créer un conteneur. La façon la plus simple de le faire est d'utiliser la boîte à outils d'inférence SageMaker pour étendre un conteneur préconçu existant. La boîte à outils d'inférence SageMaker est une implémentation de Multi Model Server (MMS) qui crée des points de terminaison pouvant être déployés dans SageMaker. Pour obtenir un exemple de bloc-notes qui montre comment configurer et déployer un conteneur personnalisé prenant en charge les points de terminaison multimodèles dans SageMaker, veuillez consulter l'exemple de bloc-notes BYOC de point de terminaison multimodèles.

Note

La boîte à outils d'inférence SageMaker prend uniquement en charge les gestionnaires de modèles Python. Si vous souhaitez implémenter votre gestionnaire dans une autre langage, vous devez créer votre propre conteneur qui implémente les API de point de terminaison multimodèle supplémentaires. Pour plus d'informations, veuillez consulter Contrat prévoyant que des conteneurs personnalisés servent plusieurs modèles.

Pour étendre un conteneur à l'aide de la boîte à outils d'inférence SageMaker

  1. Créez un gestionnaire de modèles. Le serveur MMS attend un gestionnaire de modèles, qui est un fichier Python implémentant des fonctions pour prétraiter, obtenir des prédictions à partir du modèle et traiter la sortie dans un gestionnaire de modèles. Pour obtenir un exemple de gestionnaire de modèles, veuillez consulter model_handler.py dans l'exemple de bloc-notes.

  2. Importez la boîte à outils d'inférence et utilisez sa fonction model_server.start_model_server pour démarrer le serveur MMS. L'exemple suivant provient du fichier dockerd-entrypoint.py de l'exemple de bloc-notes. Notez que l'appel à model_server.start_model_server transmet le gestionnaire de modèles décrit à l'étape précédente :

    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()
  3. Dans votre fichier Dockerfile, copiez le gestionnaire de modèles de la première étape et spécifiez le fichier Python de l'étape précédente comme point d'entrée dans votre Dockerfile. Les lignes suivantes proviennent du fichier Dockerfile utilisé dans l'exemple de bloc-notes :

    # 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"]
  4. Créez et enregistrez votre conteneur. Le script shell suivant provenant de l'exemple de bloc-notes crée le conteneur et le charge dans un référentiel Elastic Container Registry de votre compte 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}

Vous pouvez désormais utiliser ce conteneur pour déployer des points de terminaison multimodèles dans SageMaker.