Introduction
Amazon SageMaker est la plateforme managée AWS pour le machine learning end-to-end, permettant d'entraîner, déployer et monitorer des modèles à échelle sans gérer l'infrastructure sous-jacente. En 2026, avec l'intégration native d'IA générative et d'optimisations GPU comme Trainium2, SageMaker accélère les pipelines ML de 40% en moyenne selon les benchmarks AWS re:Invent 2025.
Pourquoi l'utiliser ? Contrairement à des setups locaux (Jupyter + GPU spot), SageMaker gère l'orchestration, l'hyperparamétrage automatique (SageMaker Autopilot), et la sécurité (IAM roles, VPC). Pour un data scientist intermédiaire, c'est l'outil idéal pour scaler : imaginez entraîner un XGBoost sur 1TB de données en heures au lieu de jours.
Ce tutoriel vous guide pas à pas : de la configuration AWS à l'inférence en production. À la fin, vous déployez un modèle complet, prêt pour la prod. Durée estimée : 2h. (128 mots)
Prérequis
- Compte AWS actif avec permissions SageMakerFullAccess et S3FullAccess.
- AWS CLI v2 installé (version 2.15+).
- Python 3.10+ avec pip et boto3 (installez via
pip install boto3 sagemaker scikit-learn). - Connaissances intermédiaires en Python, ML (scikit-learn) et AWS S3.
- Région AWS : us-east-1 ou eu-west-1 pour disponibilité optimale.
Configurer AWS CLI et créer un bucket S3
aws configure set aws_access_key_id YOUR_ACCESS_KEY
aws configure set aws_secret_access_key YOUR_SECRET_KEY
aws configure set default.region us-east-1
BUCKET_NAME=sagemaker-tutorial-$(date +%s)
aws s3 mb s3://${BUCKET_NAME}
echo "Bucket créé: s3://${BUCKET_NAME}"Ce script configure les credentials AWS CLI et crée un bucket S3 dédié pour stocker datasets, modèles et artefacts. Remplacez YOUR_ACCESS_KEY et YOUR_SECRET_KEY par vos valeurs IAM. Utilisez un bucket unique avec timestamp pour éviter les conflits ; vérifiez avec aws s3 ls.
Préparer les données et uploader sur S3
SageMaker attend les données en format CSV/Parquet sur S3. Nous générons un dataset synthétique Iris (classique pour classification), le splittons en train/validation, et l'uploadons. Cela simule un workflow réel où vos données proviennent d'EC2 ou Athena.
Script Python pour générer et uploader le dataset
import boto3
import pandas as pd
from sklearn.datasets import load_iris
from sklearn.model_selection import train_test_split
import io
import os
s3 = boto3.client('s3')
bucket = 'sagemaker-tutorial-1234567890' # Remplacez par votre bucket
iris = load_iris()
df = pd.DataFrame(iris.data, columns=iris.feature_names)
df['target'] = iris.target
train_df, val_df = train_test_split(df, test_size=0.2, random_state=42)
csv_buffer = io.StringIO()
train_df.to_csv(csv_buffer, index=False, header=False)
s3.put_object(Body=csv_buffer.getvalue(), Bucket=bucket, Key='data/train.csv')
csv_buffer = io.StringIO()
val_df.to_csv(csv_buffer, index=False, header=False)
s3.put_object(Body=csv_buffer.getvalue(), Bucket=bucket, Key='data/validation.csv')
print('Données uploadées sur s3://{}/data/'.format(bucket))Ce script charge Iris, splitte en 80/20, et upload CSV sans header/index sur S3 (requis par XGBoost SageMaker). Exécutez-le localement ; adaptez pour de vrais datasets volumineux via pandas.read_csv('s3://...'). Piège : toujours header=False pour éviter bias dans l'entraînement.
Créer un job d'entraînement avec XGBoost
Utilisez l'algorithme XGBoost built-in de SageMaker : pas besoin de conteneur custom. Définissez un rôle IAM SageMaker, hyperparams, et lancez le job. Instance : ml.m5.xlarge pour coût/efficacité (spot pour -70%).
Lancer le job d'entraînement via boto3
import boto3
from time import gmtime, strftime
sagemaker = boto3.client('sagemaker')
role = 'arn:aws:iam::YOUR_ACCOUNT:role/SageMakerRole' # Créez ce rôle
bucket = 'sagemaker-tutorial-1234567890'
training_job_name = 'xgboost-iris-' + strftime('%Y-%m-%d-%H-%M-%S', gmtime())
sagemaker.create_training_job(
TrainingJobName=training_job_name,
AlgorithmSpecification={
'AlgorithmName': 'xgboost',
'TrainingInputMode': 'File'
},
RoleArn=role,
InputDataConfig=[
{'ChannelName': 'train', 'DataSource': {'S3DataSource': {'S3Uri': f's3://{bucket}/data/train.csv', 'S3DataType': 'S3Prefix', 'S3InputMode': 'File'}}, 'ContentType': 'text/csv'},
{'ChannelName': 'validation', 'DataSource': {'S3DataSource': {'S3Uri': f's3://{bucket}/data/validation.csv', 'S3DataType': 'S3Prefix', 'S3InputMode': 'File'}}, 'ContentType': 'text/csv'}
],
OutputDataConfig={'S3OutputPath': f's3://{bucket}/output/'},
ResourceConfig={'InstanceType': 'ml.m5.xlarge', 'InstanceCount': 1, 'VolumeSizeInGB': 10},
EnableManagedSpotTraining=True,
TrainingJobName=training_job_name,
HyperParameters={
'num_round': '100',
'max_depth': '5',
'objective': 'multi:softmax',
'num_class': '3',
'eta': '0.2'
}
)
print(f'Job lancé: {training_job_name}. Surveillez dans SageMaker Console.')Ce code crée un training job XGBoost avec spot instances pour économies. Hyperparams adaptés à Iris (multi-classe). Remplacez role et bucket. Attendez 5-10min ; status via sagemaker.describe_training_job(). Avantage : scalable à 100+ instances sans code infra.
Déployer le modèle en endpoint serveurless
Post-entraînement, récupérez l'artifact S3 et déployez un endpoint. En 2026, optez pour Serverless Inference : payez à l'usage, auto-scale 0-1000 req/s, sans cold starts >200ms.
Déployer l'endpoint et tester l'inférence
import boto3
import time
sagemaker = boto3.client('sagemaker')
bucket = 'sagemaker-tutorial-1234567890'
training_job_name = 'xgboost-iris-2026-01-01-12-00-00' # Nom de votre job
# Récupérer model artifact
desc = sagemaker.describe_training_job(TrainingJobName=training_job_name)
model_s3 = desc['ModelArtifacts']['S3ModelArtifacts']
endpoint_name = training_job_name + '-endpoint'
sagemaker.create_model(
ModelName=endpoint_name + '-model',
PrimaryContainer={
'Image': sagemaker.get_image_uri('us-east-1', 'xgboost', '1.7-1'),
'ModelDataUrl': model_s3
},
ExecutionRoleArn='arn:aws:iam::YOUR_ACCOUNT:role/SageMakerRole'
)
sagemaker.create_endpoint_config(
EndpointConfigName=endpoint_name + '-config',
ProductionVariants=[{
'VariantName': 'AllTraffic',
'ModelName': endpoint_name + '-model',
'InitialInstanceCount': 0,
'InstanceType': 'ml.m5.xlarge',
'ServerlessConfig': {'MemorySizeInMB': 2048, 'MaxConcurrency': 50}
}],
ServerlessConfig={'MemorySizeInMB': 6144, 'MaxConcurrency': 200}
)
sagemaker.create_endpoint(EndpointName=endpoint_name, EndpointConfigName=endpoint_name + '-config')
while True:
status = sagemaker.describe_endpoint(EndpointName=endpoint_name)['EndpointStatus']
print(f'Status: {status}')
if status == 'InService': break
time.sleep(30)
runtime = boto3.client('sagemaker-runtime')
response = runtime.invoke_endpoint(
EndpointName=endpoint_name,
ContentType='text/csv',
Body='5.1,3.5,1.4,0.2'
)
print(response['Body'].read().decode())Déploie un endpoint serverless XGBoost avec auto-scaling. Teste avec features Iris. Surveillez coûts via CloudWatch (serverless ~0.06$/1000s). Piège : attendez 'InService' avant invoke ; delete avec delete_endpoint pour éviter frais.
Script de monitoring avec CloudWatch
import boto3
cloudwatch = boto3.client('cloudwatch')
endpoint_name = 'xgboost-iris-2026-01-01-12-00-00-endpoint'
response = cloudwatch.get_metric_statistics(
Namespace='AWS/SageMaker',
MetricName='InvocationsPerInstance',
Dimensions=[{'Name': 'EndpointName', 'Value': endpoint_name}],
StartTime='2026-01-01T00:00:00Z',
EndTime='2026-01-02T00:00:00Z',
Period=300,
Statistics=['Average']
)
print('Métriques invocations:', response['Datapoints'])
alarms = cloudwatch.describe_alarms(AlarmNamePrefix='SageMaker-'+endpoint_name)
print('Alarmes actives:', [a['AlarmName'] for a in alarms['MetricAlarms']])Récupère métriques CloudWatch pour monitorer latence/invocations. Configurez alarmes pour >95% CPU. Utile en prod pour autoscaling ; intégrez à Lambda pour alertes Slack.
Bonnes pratiques
- Utilisez des rôles IAM minimaux : SageMakerExecutionRole avec policies inline pour S3/modelregistry seulement.
- Hyperparamétrage automatique : Activez SageMaker Automatic Model Tuning pour +20% accuracy sans effort.
- Data versioning : Stockez datasets en S3 avec prefixes datés et utilisez SageMaker Model Registry.
- Serverless first : Pour <1000 req/jour ; passez à provisioned pour latence <100ms.
- Debug avec Debugger : Hook pour tensors/realtime metrics pendant training.
Erreurs courantes à éviter
- Oublier ContentType='text/csv' : Cause 400 errors en inference ; toujours matcher training.
- Pas de spot training : Multiplie coûts x3 ; activez EnableManagedSpotTraining=True.
- Endpoint non supprimé : Facture 1$/h ; toujours
delete_endpointen fin de test. - Région mismatch : Image XGBoost varie par région ; utilisez sagemaker.image_uris.retrieve() dynamique.
Pour aller plus loin
- Docs officielles : AWS SageMaker Developer Guide.
- Exemples avancés : JumpStart pour modèles pré-entraînés (Llama3).
- Formations : Découvrez nos formations Learni sur AWS ML.
- Suivant : SageMaker Pipelines pour CI/CD ML ou Canvas pour no-code.