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
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 :
À 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é.
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.
Voici la plateforme complète de production ML :
Pipeline de production ML - 4 phases :
Phase 1 : Construire
Phase 2 : Déployer
Phase 3 : Surveiller
Phase 4 : Répondre
Code Push -> Build -> Test -> Déployer sur Staging -> Approbation -> Déployer sur Prod -> SurveillerCré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]