Production ML sur AWS : CI-CD, déploiement et surveillance à grande échelle

DEV - 30/12
Temps de lecture : ~15-20 minutes Niveau : Intermédiaire à Avancé Prérequis : Parties 1-3, Comprendre...

Temps de lecture : ~15-20 minutes Niveau : Intermédiaire à Avancé Prérequis : Parties 1-3, Compréhension des concepts CI/CD Série : Partie 4 sur 4 (Série Finale) - Partie 1 | Partie 2 | Partie 3

Bienvenue dans la finale de la série !

Nous avons parcouru un long chemin ! Dans la première partie, nous avons couvert le cadre AIDLC. Dans la deuxième partie, nous avons construit des pipelines de données sécurisés. Dans la troisième partie, nous avons formé des modèles à grande échelle avec SageMaker. Il est maintenant temps de tout rassembler et de déployer en production.

Ce que vous allez construire aujourd'hui :

  • Pipeline CI/CD pour les modèles ML avec CodePipeline
  • Points de terminaison de production SageMaker avec mise à l'échelle automatique
  • Infrastructure de tests A/B pour des déploiements sécurisés
  • Détection et surveillance de la dérive du modèle
  • Pile d'observabilité complète
  • Procédures de réponse aux incidents et de restauration

À la fin : vous disposerez d'une plate-forme ML complète et prête pour la production sur AWS, capable de déployer, surveiller et maintenir des modèles à grande échelle en toute sécurité.

Le problème du déploiement du ML

Former un bon modèle ne représente que la moitié de la bataille. Le déploiement en production apporte de nouveaux défis :

Déploiements manuels - Sujet aux erreurs, n'évolue pas Aucun test - Les mauvais modèles atteignent la production Temps d'arrêt du déploiement - Interruptions de service Aucun plan de restauration - Impossible d'annuler les mauvais déploiements Dégradation des performances - Les modèles dérivent au fil du temps Aucune observabilité - Impossible de déboguer les problèmes de production

La solution :

Un pipeline CI/CD complet avec des tests automatisés, des déploiements sécurisés et une surveillance complète.

Présentation de l'architecture

Voici la plateforme complète de production ML :

Pipeline de production ML - 4 phases :

Phase 1 : Construire

  • Code Push -> CodePipeline -> Tests CodeBuild -> Registre de modèles
  • Portes de qualité automatisées et validation des modèles

Phase 2 : Déployer

  • Déploiement intermédiaire pour les tests
  • Porte d'approbation manuelle avec examen des métriques
  • Déploiement en production avec tests A/B (répartition du trafic 90/10)

Phase 3 : Surveiller

  • Métriques et tableaux de bord CloudWatch
  • Modèle Monitor pour la détection de dérive
  • Alertes SNS en cas d'anomalies

Phase 4 : Répondre

  • Restauration automatique en cas d'erreurs critiques
  • Procédures de restauration manuelle
  • Flux de travail de réponse aux incidents

Étape 1 : Configuration du pipeline CI/CD

Architecture des pipelines

Code Push -> Build -> Test -> Déployer sur Staging -> Approbation -> Déployer sur Prod -> Surveiller
Entrer en mode plein écran Quitter le mode plein écran

Configuration du pipeline de code

Créerterraform/cicd.tf:

# Compartiment S3 pour la ressource d'artefacts de pipeline "aws_s3_bucket" "pipeline_artifacts" { bucket = "${var.project_name}-pipeline-artifacts-${data.aws_caller_identity.current.account_id}" tags = { Name = "Pipeline Artifacts" Environment = var.environment } } resource "aws_s3_bucket_versioning" "pipeline_artifacts" { bucket = aws_s3_bucket.pipeline_artifacts.id versioning_configuration { status = "Enabled" } } ressource "aws_s3_bucket_server_side_encryption_configuration" "pipeline_artifacts" { bucket = aws_s3_bucket.pipeline_artifacts.id règle { apply_server_side_encryption_by_default { sse_algorithm = "aws:kms" kms_master_key_id = aws_kms_key.data_encryption.arn } } } # Projet CodeBuild pour la ressource de test de modèle "aws_codebuild_project" "model_tests" { name = "${var.project_name}-model-tests" service_role = aws_iam_role.codebuild.arn build_timeout = 30 artefacts { type = "CODEPIPELINE" } environnement {compute_type = "BUILD_GENERAL1_MEDIUM" image = "aws/codebuild/standard:7.0" type = "LINUX_CONTAINER" privilèged_mode = true image_pull_credentials_type = "CODEBUILD" environnement_variable { name = "MODEL_PACKAGE_GROUP_NAME" valeur = aws_sagemaker_model_package_group.ml_models.model_package_group_name } environnement_variable { nom = "AWS_ACCOUNT_ID" valeur = data.aws_caller_identity.current.account_id } environnement_variable { nom = "AWS_REGION" valeur = var.aws_region } } source { type = "CODEPIPELINE" buildspec = "buildspec.yml" } tags = { Name = "Model Testing" Environment = var.environment } } # Rôle IAM pour la ressource CodeBuild "aws_iam_role" "codebuild" { name = "${var.project_name}-codebuild-role" assume_role_policy = jsonencode({ Version = "2012-10-17" Statement = [{ Action = "sts:AssumeRole" Effect = "Autoriser" Principal = { Service = "codebuild.amazonaws.com" } }] }) } ressource "aws_iam_role_policy" "codebuild" { name = "${var.project_name}-codebuild-policy" role = aws_iam_role.codebuild.id Policy = jsonencode({ Version = "2012-10-17" Statement = [ { Effect = "Autoriser" Action = [ "logs:CreateLogGroup", "logs:CreateLogStream", "logs:PutLogEvents" ] Resource = "arn:aws:logs:*:*:*" }, { Effect = "Autoriser" Action = [ "s3:GetObject", "s3:PutObject" ] Resource = [ "${aws_s3_bucket.pipeline_artifacts.arn}/*", "${aws_s3_bucket.model_artifacts.arn}/*" ] }, { Effect = "Autoriser" Action = [ "sagemaker:DescribeModelPackage", "sagemaker:ListModelPackages" ] Resource = "*" }, { Effect = "Autoriser" Action = [ "kms:Decrypt", "kms:GenerateDataKey" ] Resource = aws_kms_key.data_encryption.arn } ] }) } # Ressource CodePipeline "aws_codepipeline" "ml_pipeline" { name = "${var.project_name}-ml-pipeline" role_arn = aws_iam_role.codepipeline.arn artificial_store { location = aws_s3_bucket.pipeline_artifacts.bucket type = "S3" chiffrement_key { id = aws_kms_key.data_encryption.arn type = "KMS" } } étape { nom = "Source" action { nom = "Source" catégorie = "Source" propriétaire = "AWS" fournisseur = "S3" version = "1" output_artifacts = ["source_output"] configuration = { S3Bucket = aws_s3_bucket.model_Objectifacts.id S3Key = "latest/model.tar.gz" PollForSourceChanges = true } } } étape { nom = "Test" action { nom = "ModelValidation" catégorie = "Build" propriétaire = "AWS" fournisseur = "CodeBuild" version = "1" input_artifacts = ["source_output"] output_artifacts = ["test_output"] configuration = { ProjectName = aws_codebuild_project.model_tests.name } } } stage { nom = "DeployToStaging" action { nom = "CreateStagingEndpoint"category = "Déployer" propriétaire = "AWS" fournisseur = "CloudFormation" version = "1" input_artifacts = ["test_output...
[Courte citation de 8% de l'article original]
Loading...