Introduction
Lorsque les organisations mettent à l'échelle leurs opérations de machine learning, un problème courant apparaît : la gestion du coût et de la complexité des points de terminaison d'inférence. Les points de terminaison SageMaker traditionnels provisionnent des instances EC2 dédiées, ce qui est excellent pour un trafic élevé et constant, mais une proposition coûteuse pour des charges de travail sporadiques ou des modèles avec des schémas d'utilisation imprévisibles. C'est là qu'AWS SageMaker Serverless Inference change la donne. Il nous permet de déployer des modèles sans gérer l'infrastructure sous-jacente, en adaptant automatiquement les ressources de calcul en fonction du trafic.
Ce guide vous présentera une approche pour déployer et gérer des points de terminaison d'inférence sans serveur sur SageMaker. Nous aborderons le quoi, le pourquoi et, surtout, le comment.
Dans le parcours d'un modèle d'IA développé dans un notebook vers une API robuste et prête pour la production, le déploiement de modèles introduit souvent une surcharge opérationnelle significative. Pendant de nombreuses années, la configuration par défaut sur SageMaker impliquait le provisionnement d'instances EC2, parfois même avec GPU, qui fonctionnaient 24h/24 et 7j/7, quel que soit le trafic. Les organisations pouvaient épuiser leurs budgets en laissant des instances ml.g4dn.xlarge inactives pendant des heures, attendant simplement la prochaine requête d'inférence. Ce n'est pas seulement inefficace ; c'est contraire à la promesse même de l'élasticité du cloud et aux défis de la durabilité.
Le défi technique spécifique que nous abordons ici est la fourniture efficace, évolutive et rentable de modèles de machine learning pour l'inférence, en particulier lorsque les charges de travail sont en rafales ou de faible volume. AWS SageMaker Serverless Inference offre une solution convaincante en faisant abstraction de la gestion des serveurs, nous permettant de ne payer que pour la durée du traitement de l'inférence et la quantité de données traitées. C'est le paradigme du sans serveur appliqué directement à l'inférence ML, permettant des économies significatives et une simplicité opérationnelle pour de nombreux cas d'utilisation.
Prérequis
Avant de nous plonger dans l'implémentation, assurez-vous d'avoir les éléments suivants :
- Compte AWS : Avec un accès administratif ou les autorisations IAM appropriées pour SageMaker, S3 et les rôles IAM.
- AWS CLI : Version 2 configurée avec vos identifiants. Je recommande toujours d'utiliser la dernière version stable pour une fonctionnalité complète et les corrections de bugs. Vous pouvez vérifier votre version avec
aws --version. - Python 3.8+ : Installé et configuré. Nous utiliserons les SDK
boto3etsagemaker. Le SDK SageMaker est compatible avec plusieurs versions de Python ; 3.8+ est une base sûre.
python3 --version
pip install boto3 sagemaker --upgrade
- Un modèle SageMaker existant : Pour ce guide, nous supposerons que vous disposez d'un artefact de modèle (par exemple, un fichier
.tar.gzcontenant votre modèle, votre code d'inférence et vos dépendances) stocké dans un compartiment S3 dans une région européenne (par exemple,eu-west-1). Si vous n'en avez pas, vous pouvez utiliser un modèle pré-entraîné ou en entraîner un simple pour les tests.
Dépôt d'exemples : Vous pouvez trouver des exemples basiques de SageMaker pour le packaging et le déploiement de modèles dans le GitHub AWS Samples officiel.
Architecture et concepts
Au fond, AWS SageMaker Serverless Inference introduit un nouveau type de configuration de point de terminaison conçu pour les charges de travail sporadiques et en rafales. Contrairement aux points de terminaison traditionnels qui provisionnent et gèrent des instances EC2 dédiées, les points de terminaison sans serveur adaptent automatiquement la capacité de calcul de zéro pour gérer les requêtes d'inférence et la réduisent lorsqu'ils ne sont pas utilisés. Ce modèle de "paiement par inférence" réduit considérablement les coûts pour de nombreux cas d'utilisation courants du ML.
Lors de l'architecture de ces systèmes, les paramètres clés sur lesquels se concentrer pour l'inférence sans serveur sont MemorySizeInMB et MaxConcurrency. Ceux-ci influencent directement les performances et les caractéristiques de coût du point de terminaison :
MemorySizeInMB: Ceci définit la quantité de mémoire allouée à votre point de terminaison sans serveur. SageMaker propose des options par incréments de 1 Go (1024 Mo, 2048 Mo, etc., jusqu'à 6144 Mo). La taille de votre modèle, les dépendances de votre code d'inférence et la taille de la charge utile des données dicteront le réglage de mémoire optimal. Une erreur courante est de prendre par défaut la plus petite taille, ce qui entraîne des erreurs de mémoire insuffisante ou une latence accrue car les données doivent être échangées.MaxConcurrency: C'est le nombre maximum de requêtes d'inférence simultanées que votre point de terminaison peut traiter. Le définir trop bas peut entraîner un étranglement sous une charge élevée, tandis que le définir trop haut pourrait provisionner plus de calcul sous-jacent que nécessaire pour la gestion des rafales. C'est un équilibre entre la réactivité et le coût.ProvisionedConcurrency: Bien que sans serveur, vous pouvez également allouer uneProvisionedConcurrencyde base pour réduire la latence de démarrage à froid. Cela maintient un certain nombre d'environnements d'exécution "chauds". Pour les applications critiques à faible latence avec un trafic en rafales, cela peut être un bon compromis, bien que cela réintroduise une composante de coût fixe.
D'un point de vue architectural, lorsqu'une requête atteint un point de terminaison sans serveur, SageMaker démarre une instance de conteneur si aucune instance "chaude" n'est disponible. Il charge votre modèle, traite la requête, puis arrête l'instance après une période d'inactivité. Cette mise à l'échelle dynamique est entièrement gérée par AWS, masquant les complexités de Kubernetes, des groupes d'autoscaling ou de l'application de correctifs aux instances.
Voici un flux conceptuel du fonctionnement d'un point de terminaison d'inférence sans serveur au sein de SageMaker :
Le dilemme du démarrage à froid
Si le sans serveur est excellent pour l'efficacité des coûts, le compromis est souvent la latence de démarrage à froid. Si votre modèle n'a pas été invoqué récemment, la première requête pourrait subir un délai pendant que SageMaker initialise le conteneur. Pour les applications en temps réel à faible latence, mesurez cela attentivement. Parfois, une petite quantité de concurrence provisionnée ou même un point de terminaison basé sur des instances pourrait être un meilleur choix si les exigences de latence sont extrêmement strictes. Cependant, pour la plupart des charges de travail en rafales, les économies de coûts l'emportent sur le démarrage à froid occasionnel.
Pour la gouvernance et la sécurité des modèles, les points de terminaison sans serveur SageMaker héritent des fonctionnalités de sécurité robustes de la plateforme SageMaker. Cela inclut IAM pour le contrôle d'accès, l'intégration VPC pour l'isolation réseau, et le chiffrement au repos et en transit. Toutes les invocations sont journalisées dans CloudWatch, fournissant une piste d'audit pour la conformité et la surveillance opérationnelle. Assurez-vous que votre rôle d'exécution SageMaker dispose des autorisations appropriées pour accéder à S3 (où réside votre artefact de modèle) et aux autres services AWS avec lesquels votre code d'inférence pourrait interagir.
Exemple de code (ServerlessInferenceConfig) : Cet extrait, directement issu du SDK Python de SageMaker, montre comment configurer les paramètres sans serveur.
from sagemaker.serverless import ServerlessInferenceConfig
# Configure serverless endpoint with specific memory and concurrency
serverless_config = ServerlessInferenceConfig(
memory_size_in_mb=2048, # Allocate 2GB of memory
max_concurrency=10 # Allow up to 10 concurrent requests
)
print(f"Serverless configuration created: Memory={serverless_config.memory_size_in_mb}MB, MaxConcurrency={serverless_config.max_concurrency}")
Implémentation de référence : Un modèle architectural plus détaillé utilisant l'inférence sans serveur pour les tâches NLP en temps réel peut être trouvé sur le GitHub AWS Samples, en examinant spécifiquement leurs exemples SageMaker pour le déploiement de modèles.
Guide d'implémentation
Parcourons le processus de déploiement d'un modèle vers un point de terminaison d'inférence sans serveur SageMaker. Pour ce guide, je supposerai que vous avez un artefact de modèle prêt dans S3. Je préfère utiliser le SDK Python de SageMaker car il simplifie de nombreux appels Boto3 sous-jacents et fournit une interface plus conviviale pour les développeurs, en particulier lorsque vous l'intégrez à des pipelines ML existants.
1. Préparez votre artefact de modèle et votre rôle IAM
Tout d'abord, vous avez besoin d'un artefact de modèle entraîné (par exemple, model.tar.gz) dans un compartiment S3 et d'un rôle IAM que SageMaker peut assumer pour accéder à S3 et effectuer l'inférence. Assurez-vous que votre compartiment S3 se trouve dans une région européenne comme eu-west-1.
import boto3
import sagemaker
from sagemaker.serverless import ServerlessInferenceConfig
import time
import os
# --- Configuration --- #
aws_region = 'eu-west-1' # Always use European regions for consistency
sagemaker_session = sagemaker.Session(boto3.Session(region_name=aws_region))
bucket = sagemaker_session.default_bucket()
role = sagemaker.get_execution_role()
# Ensure this role has S3 read/write and SageMaker permissions
# Assuming your model artifact is already uploaded to S3
# Example: s3://your-sagemaker-eu-west-1-xxxxxxxxxxxx/model.tar.gz
# For demonstration, we'll use a placeholder model data path
model_data_uri = f"s3://{bucket}/my-nlp-model/model.tar.gz"
# For a real scenario, you would upload your model.tar.gz:
# boto3_session = boto3.Session(region_name=aws_region)
# s3_client = boto3_session.client('s3')
# s3_client.upload_file('local_model.tar.gz', bucket, 'my-nlp-model/model.tar.gz')
print(f"Using Sagemaker Session in region: {aws_region}")
print(f"Default S3 bucket: {bucket}")
print(f"SageMaker Execution Role ARN: {role}")
print(f"Model data URI: {model_data_uri}")
Sortie attendue :
Using Sagemaker Session in region: eu-west-1
Default S3 bucket: sagemaker-eu-west-1-xxxxxxxxxxxx
SageMaker Execution Role ARN: arn:aws:iam::xxxxxxxxxxxx:role/service-role/AmazonSageMaker-ExecutionRole-xxxxxxxxxxxx
Model data URI: s3://sagemaker-eu-west-1-xxxxxxxxxxxx/my-nlp-model/model.tar.gz
2. Définissez la configuration d'inférence sans serveur
C'est ici que nous spécifions les paramètres spécifiques au sans serveur, tels que la mémoire et la concurrence. Je commence généralement avec 2 Go de mémoire et j'ajuste en fonction de la taille du modèle et des performances observées.
# Define the Serverless Inference Configuration
serverless_config = ServerlessInferenceConfig(
memory_size_in_mb=2048, # 2GB memory allocation
max_concurrency=5 # Up to 5 concurrent invocations
)
print(f"Serverless configuration defined: Memory={serverless_config.memory_size_in_mb}MB, Max Concurrency={serverless_config.max_concurrency}")
Sortie attendue :
Serverless configuration defined: Memory=2048MB, Max Concurrency=5
3. Créez un objet Modèle SageMaker
Nous devons créer un objet sagemaker.model.Model. Cet objet encapsule votre artefact de modèle et l'image de conteneur d'inférence (souvent un conteneur SageMaker Deep Learning (DLC) pré-construit ou une image personnalisée).
from sagemaker.model import Model
# You would typically use a framework-specific image (e.g., PyTorchModel, TensorFlowModel)
# For a generic example, we use the Model class with a pre-built Scikit-learn image
# Always check for the latest image URI in your desired European region
# Example: https://docs.aws.amazon.com/sagemaker/latest/dg/pre-built-containers-frameworks-reference.html
framework_version = '1.2-1' # Example Scikit-learn version
python_version = 'py3'
processor_type = 'cpu'
# Construct the image URI dynamically for eu-west-1
# This example uses a common pattern for DLCs, but verify against SageMaker documentation
# sagemaker.image_uris.retrieve is the recommended way to get image URIs
container_image_uri = sagemaker.image_uris.retrieve(
framework='sklearn',
region=aws_region,
version=framework_version,
py_version=python_version,
instance_type='ml.m5.xlarge' # Instance type here is just for image retrieval, not for actual deployment instance
)
model = Model(
image_uri=container_image_uri,
model_data=model_data_uri,
role=role,
sagemaker_session=sagemaker_session
)
print(f"SageMaker Model object created using image URI: {container_image_uri}")
Sortie attendue :
SageMaker Model object created using image URI: xxxxx.dkr.ecr.eu-west-1.amazonaws.com/sagemaker-sklearn:1.2-1-cpu-py3
4. Déployez le modèle sur un point de terminaison sans serveur
Nous déployons maintenant le modèle, en passant notre serverless_config à la méthode deploy. Le endpoint_name est crucial pour l'invocation. Utilisez un nom descriptif et versionné.
# Generate a unique endpoint name
endpoint_name = f"my-serverless-nlp-endpoint-{int(time.time())}"
try:
# Deploy the model with the serverless configuration
# The 'instance_type' and 'initial_instance_count' are NOT needed for serverless inference
# if 'serverless_inference_config' is provided.
predictor = model.deploy(
endpoint_name=endpoint_name,
serverless_inference_config=serverless_config,
wait=True # Wait for the deployment to complete
)
print(f"Successfully deployed serverless endpoint: {endpoint_name}")
print(f"Endpoint ARN: {predictor.endpoint_name}") # predictor.endpoint_name holds the actual name
except Exception as e:
print(f"Error deploying endpoint: {e}")
# Implement retry logic or detailed error logging in production
Sortie attendue :
... (SageMaker deployment logs) ...
Successfully deployed serverless endpoint: my-serverless-nlp-endpoint-xxxxxxxxxx
Endpoint ARN: my-serverless-nlp-endpoint-xxxxxxxxxx
5. Invoquez le point de terminaison sans serveur
Une fois le point de terminaison InService, vous pouvez l'invoquer en utilisant l'objet predictor ou directement via le client sagemaker-runtime dans Boto3. N'oubliez pas d'envoyer vos données d'entrée dans le ContentType correct.
from sagemaker.predictor import Predictor
from sagemaker.serializers import JSONSerializer
from sagemaker.deserializers import JSONDeserializer
# If you don't have the predictor object from deployment, you can instantiate it:
# predictor = Predictor(endpoint_name=endpoint_name, sagemaker_session=sagemaker_session)
# Configure serializer/deserializer for JSON input/output
predictor.serializer = JSONSerializer()
predictor.deserializer = JSONDeserializer()
# Example input for an NLP model (e.g., sentiment analysis)
input_payload = {"instances": ["This is a fantastic article!", "I am not happy with this service."]}
try:
print(f"Invoking endpoint: {endpoint_name} with payload: {input_payload}")
response = predictor.predict(input_payload)
print(f"Inference result: {response}")
except Exception as e:
print(f"Error invoking endpoint: {e}")
# Common errors include incorrect input format, IAM permissions, or model loading issues
Sortie attendue :
Invoking endpoint: my-serverless-nlp-endpoint-xxxxxxxxxx with payload: {'instances': ['This is a fantastic article!', 'I am not happy with this service.']}
Inference result: {'predictions': [0.98, 0.12]}
6. Nettoyez les ressources
N'oubliez jamais de supprimer votre point de terminaison et votre modèle pour éviter d'engager des coûts inutiles. C'est une étape critique : les services gérés sont excellents, mais oublier de nettoyer les ressources est une source courante de factures cloud inattendues.
# Delete the endpoint
try:
predictor.delete_endpoint()
print(f"Endpoint {endpoint_name} deleted successfully.")
except Exception as e:
print(f"Error deleting endpoint {endpoint_name}: {e}")
# Delete the model as well if it's no longer needed
# model.delete_model()
# print(f"Model associated with {endpoint_name} deleted successfully.")
Sortie attendue :
Endpoint my-serverless-nlp-endpoint-xxxxxxxxxx deleted successfully.
Vous trouverez l'implémentation complète de ces étapes dans [lien vers votre dépôt interne].
Dépannage et vérification
S'assurer que votre point de terminaison sans serveur se comporte comme prévu est crucial. Voici comment je vérifie et dépanne généralement.
Commandes de vérification :
Pour vérifier l'état de votre point de terminaison et sa configuration :
# Check endpoint status
aws sagemaker describe-endpoint \
--endpoint-name "my-serverless-nlp-endpoint-xxxxxxxxxx" \
--region eu-west-1
# Expected output for InService status:
# {
# "EndpointName": "my-serverless-nlp-endpoint-xxxxxxxxxx",
# "EndpointArn": "arn:aws:sagemaker:eu-west-1:xxxxxxxxxxxx:endpoint/my-serverless-nlp-endpoint-xxxxxxxxxx",
# "EndpointConfigName": "my-serverless-nlp-endpoint-xxxxxxxxxx-Config",
# "EndpointStatus": "InService",
# ...
# }
# Check endpoint configuration details (including serverless config)
aws sagemaker describe-endpoint-config \
--endpoint-config-name "my-serverless-nlp-endpoint-xxxxxxxxxx-Config" \
--region eu-west-1
# Expected output showing ServerlessConfig:
# {
# "EndpointConfigName": "my-serverless-nlp-endpoint-xxxxxxxxxx-Config",
# "EndpointConfigArn": "arn:aws:sagemaker:eu-west-1:xxxxxxxxxxxx:endpoint-config/my-serverless-nlp-endpoint-xxxxxxxxxx-Config",
# "ProductionVariants": [
# {
# "VariantName": "AllTraffic",
# "ModelName": "sagemaker-sklearn-2026-03-14-xxxxxx",
# "ServerlessConfig": {
# "MemorySizeInMB": 2048,
# "MaxConcurrency": 5
# },
# "InitialVariantWeight": 1.0
# }
# ],
# ...
# }
Erreurs courantes et solutions :
- Erreur :
ValidationException: Could not find model data in S3 location
An error occurred (ValidationException) when calling the CreateModel operation: Could not find model data in S3 location: s3://your-bucket/non-existent-model.tar.gz
**Solution :** Cela signifie généralement que le chemin S3 (`model_data_uri`) fourni lors de la création de l'objet `sagemaker.model.Model` est incorrect, ou que le rôle d'exécution SageMaker n'a pas les autorisations de lecture pour ce compartiment S3. Vérifiez à nouveau votre URI S3 et assurez-vous que le rôle IAM dispose de `s3:GetObject` sur l'artefact du modèle et de `s3:ListBucket` sur le compartiment.
- Erreur :
ClientError: An error occurred (ModelError) when calling the InvokeEndpoint operation: Received client error (4xx) from model with message "Failure loading model"
sagemaker.exceptions.UnexpectedStatusException: Error hosting model: Failed. Reason: ClientError: An error occurred (ModelError) when calling the InvokeEndpoint operation: Received client error (4xx) from model with message "Failure loading model"
**Solution :** Il s'agit d'un problème courant lors de l'invocation, indiquant que votre conteneur d'inférence n'a pas réussi à charger le modèle ou à traiter l'entrée. Le problème se situe dans votre `model.tar.gz` et le script `inference.py` qu'il contient. Vérifiez :
* **Dépendances :** Toutes les bibliothèques requises sont-elles répertoriées dans `requirements.txt` à l'intérieur de votre `model.tar.gz` ?
* **`model_fn` :** Votre `inference.py` implémente-t-il correctement `model_fn` pour charger l'artefact de modèle depuis `/opt/ml/model` ?
* **`predict_fn` :** `predict_fn` gère-t-il correctement le format d'entrée (par exemple, JSON) et renvoie-t-il la sortie comme prévu ?
* **Journaux :** L'étape la plus cruciale est de vérifier les journaux CloudWatch de votre point de terminaison SageMaker. Recherchez les groupes de journaux nommés `/aws/sagemaker/Endpoints/your-endpoint-name` pour trouver des messages d'erreur détaillés de votre conteneur d'inférence.
- Erreur :
ValidationException: You must provide either an InstanceType and InitialInstanceCount or a ServerlessConfig.
# During model.deploy()
ValidationException: You must provide either an InstanceType and InitialInstanceCount or a ServerlessConfig.
**Solution :** Cette erreur vous indique explicitement que vous essayez de mélanger les types de configuration. Assurez-vous que lorsque vous appelez `model.deploy()`, vous passez soit `serverless_inference_config=serverless_config` (pour le sans serveur) OU `instance_type='ml.m5.xlarge', initial_instance_count=1` (pour les instances), mais pas les deux ou aucun des deux. Pour le sans serveur, omettez entièrement les paramètres basés sur les instances.
Script de test : Pour des tests robustes, vous pouvez développer un petit script Python qui déploie un modèle de test, l'invoque avec diverses charges utiles, puis effectue le nettoyage. Cela permet une validation automatisée dans les pipelines CI/CD. Une version de base pourrait ressembler au script combiné de la section d'implémentation, enrichie d'assertions pour la sortie attendue.
Conclusion et prochaines étapes
AWS SageMaker Serverless Inference est un outil puissant dans la boîte à outils de l'architecture cloud, en particulier pour ceux qui visent à optimiser les coûts et à rationaliser les opérations d'inférence IA. Ce n'est pas une solution miracle pour tous les scénarios – les exigences de débit élevé et de latence extrêmement faible pourraient encore bénéficier d'instances provisionnées avec un autoscaling minutieux. Cependant, pour la grande majorité des charges de travail d'inférence imprévisibles ou de faible volume, le sans serveur offre une combinaison imbattable d'efficacité des coûts, d'évolutivité et de réduction de la surcharge opérationnelle. Les organisations peuvent réduire leurs coûts d'inférence mensuels jusqu'à 80 % en migrant les modèles appropriés vers des points de terminaison sans serveur.
Points clés à retenir :
- Optimisation des coûts : L'inférence sans serveur élimine les coûts d'inactivité, ne payant que pour l'utilisation réelle.
- Simplicité opérationnelle : Aucune gestion d'instances, de correctifs ou de politiques de mise à l'échelle à configurer.
- Évolutivité : S'adapte automatiquement de zéro pour répondre à la demande.
- Configuration : Les paramètres clés sont
MemorySizeInMBetMaxConcurrencyviaServerlessInferenceConfig. - Démarrages à froid : Soyez attentif à la latence potentielle de démarrage à froid pour la première invocation après inactivité ;
ProvisionedConcurrencypeut l'atténuer.
La clé est d'évaluer attentivement les modèles de trafic de votre modèle. S'ils sont en rafales, intermittents ou de faible volume, SageMaker Serverless Inference est probablement votre meilleure option pour un déploiement rentable. Commencez avec des valeurs conservatrices pour MemorySizeInMB et MaxConcurrency, puis surveillez et ajustez en fonction de la charge réelle et des métriques de performance de CloudWatch.
Ressources du dépôt : * Exemples officiels : Explorez une large gamme d'exemples SageMaker officiels sur le GitHub AWS Samples. * Projets connexes : Pour des plongées plus approfondies dans les modèles MLOps, considérez des projets comme les SageMaker MLOps Templates.
Exemples de code supplémentaires : Pour des scénarios plus complexes impliquant des conteneurs personnalisés ou des points de terminaison multi-modèles avec le sans serveur, je me réfère souvent aux exemples avancés fournis par AWS dans leur Guide du développeur Amazon SageMaker.