Skip to content
Learni
Voir tous les tutoriels
Machine Learning

Comment entraîner et déployer un modèle ML avec SageMaker en 2026

Read in English

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

setup-aws.sh
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

prepare_data.py
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

train_model.py
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

deploy_endpoint.py
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

monitor_endpoint.py
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_endpoint en fin de test.
  • Région mismatch : Image XGBoost varie par région ; utilisez sagemaker.image_uris.retrieve() dynamique.

Pour aller plus loin