Le Blog Amazon Web Services
Déploiement continu et automatisé de modèles Amazon SageMaker à l’aide d’AWS Step Functions
Amazon SageMaker est un service complet d’apprentissage automatique (ML) prévu pour le développement, la formation et le déploiement de modèles de Machine Learning. Amazon SageMaker offre également de nombreux algorithmes prédéfinis permettant d’accélérer l’implémentation de cas d’usage les plus classiques. Vous pouvez également créer vos propres algorithmes en fournissant des images Docker : une image d’entrainement pour entraîner votre modèle et un modèle d’inférence à déployer et à exposer via un point d’accès REST.
L’automatisation de la construction et du déploiement des modèles de machine learning est une étape importante dans la création de ces services en production. Dans ce post, nous allons discuter d’une technique d’automatisation possible d’Amazon SageMaker en utilisant AWS Step functions. Nous en ferons la démonstration dans le cadre d’un nouveau projet open source, aws-sagemaker-build. Ce projet fournit une implémentation complète de notre workflow. Il comprend des bloc-notes Jupyter montrant comment créer, lancer, arrêter et suivre la progression de la construction d’un modèle en utilisant Python et même Amazon Alexa ! Le but de aws-sagemaker-build est de fournir un dépôt de pipelines standards et utiles qui utilisent Amazon SageMaker et AWS Step functions afin d’être partagés avec la communauté et développés par la communauté.
Le code est open source et est hébergé sur GitHub.
Modèles personnalisés
Ce blog n’abordera pas les détails de la manière d’écrire et de concevoir vos fichiers Dockerfile pour les tâches d’entraînement ou d’inférence. Pour plus de détails, vous pouvez vous référer à notre documentation ci-dessous :
- Exemple de projet et tutoriel utilisant aws-sagemaker-build
- Documentation pour les images d’entraînement
- Documentation pour les images d’inférence
De quels services AWS avons-nous besoin ?
Nous nous concentrons sur les technologies serverless et les services entièrement opérés par AWS pour que cette solution reste simple. Il est important que notre solution soit évolutive et maîtrisée en termes de coûts, même lorsque l’entrainement du modèle prend beaucoup de temps. L’entrainement de grands réseaux neuronaux peut parfois prendre plusieurs jours !
AWS Step Functions
Il existe plusieurs services AWS pour l’orchestration de workflow, tels que AWS CloudFormation, AWS Step Functions, AWS CodePipeline, AWS Glue et d’autres. Pour notre application, AWS Step Functions fournit les bons outils pour mettre en œuvre notre workflow. AWS Step Functions agit comme une machine à états. Elles commencent par un état initial et utilisent les fonctions lambda d’AWS pour transformer l’état en le modifiant, ou permettant des boucles de traitements selon les besoins. Cette abstraction rend les Steps Functions très flexibles. Elles ne sont facturées qu’au moment de la transition, ce qui en fait un outil évolutif et peu coûteux pour notre cas d’utilisation.
AWS CodeBuild
AWS CodeBuild est un service de construction de code à la demande. Nous l’utiliserons pour construire nos images Docker et les pousser vers un dépôt Amazon Elastic Container Registry (Amazon ECR). Pour plus d’informations, voir la documentation.
AWS Lambda
Les AWS Step functions utilisent les fonctions AWS Lambda afin d’effectuer les tâches de construction. Il existe des fonctions pour démarrer l’entraînement du modèle, vérifier le statut de l’entraînement, démarrer le job AWS CodeBuild, vérifier l’exécution du job AWS CodeBuild, etc.
Un des défis était de trouver comment fournir des paramètres de configuration aux différentes étapes de la construction, étant donné que si certains paramètres sont statiques, d’autres dépendent des étapes de construction précédentes, et d’autres encore sont spécifiques aux besoins ou environements du client. Par exemple, les identifiants des images d’entrainement et d’inférence doivent être transmis aux steps functions d’entrainement et de déploiement, le nom du compartiment Amazon S3 est statique par rapport au pipeline, et les instances ML utilisées pour l’entrainement du modèle et l’inférence doivent être choisies par l’utilisateur. La solution consiste donc à utiliser des fonctions Lambda en complément. Il existe deux fonctions Lambda qui prennent en entrée l’état actuel du build et en sortie le job d’entrainement et les configurations des endpoints. Vous pouvez modifier ou écraser le code de ces fonctions pour répondre à vos besoins. Par exemple, la fonction Lambda peut interroger un catalogue de données pour obtenir l’emplacement Amazon S3 d’un ensemble de données pré-existant, etc.
Les fonctions Lambda sont également utilisées pour diverses ressources personnalisées nécessaires à la mise en place et à la suppression du script CloudFormation. Les fonctions Lambda des ressources personnalisées comprennent : la suppression d’un bucket S3, le téléchargement d’un bloc-note Jupyter dans l’instance Amazon SageMaker ou la suppression des ressources Amazon SageMaker.
AWS Systems Manager Parameter Store
AWS Systems Manager Parameter Store fournit un moyen de stockage de données de configuration durable, centralisé et évolutif. Nous y stockons les paramètres de nos entraînements de modèle et de nos déploiements, et les fonctions Lambda invoquées par les Step Functions interrogent les paramètres de Systems Manager. Pour modifier les paramètres, il suffit de changer le fichier JSON dans le Parameter Store.
Les exemples de bloc notes du projet aws-sagemaker-build vous montrent comment faire.
Amazon SNS
Le service Amazon Simple Notification (Amazon SNS) est utilisé pour le démarrage des builds et pour les notifications. AWS CodeCommit, GitHub et Amazon S3 peuvent publier dans un topic SNS lorsqu’une modification est apportée. Nous publions également dans un topic SNS lorsque le build a commencé, s’est terminée ou a échoué. Vous pouvez utiliser ces topics pour connecter aws-sagemaker-build à d’autres systèmes.
La machine à état supportée par les Step Functions du projet se résume par :
Le schéma ensuite montre comment les services travaillent ensemble.
Lancer cette architecture dans votre environnement
Le modèle CloudFormation suivant créera des ressources dans votre compte. Il s’agit notamment d’une instance de notebook Amazon SageMaker et d’un endpoint Amazon SageMaker, deux ressources que vous payez à l’heure.
Note : afin d’éviter des frais inutiles, veuillez supprimer cette stack lorsque vous avez terminé !
Cliquez sur le bouton « Lancer la pile » ci-dessous pour lancer le modèle CloudFormation de aws-sagemaker-build. Choisissez un nom pour votre stack CloudFormation et laissez tous les autres paramètres par défaut.
Une fois votre modèle créé, suivez les instructions suivantes :
Dans les sorties de votre stack, choisissez le lien à côté de NoteBookUrl
- Dans le navigateur Jupyter, choisissez le dossier SageBuild
- Consultez les exemples de bloc-notes pour savoir comment utiliser aws-sagemaker-build.
Mise en place des événements et des notifications
La stack CloudFormation peut créer automatiquement un repository CodeCommit et un bucket Amazon S3 qui lancera un build lors de toute mise à jour.
Vous pouvez faire en sorte que d’autres événements déclenchent des recompilations en publiant dans la rubrique « LaunchTopicSNS
» dans les sorties du template CloudFormation. Pour configurer un repo GitHub afin de déclencher des rebuilds en cas de changement, suivez les instructions de cet article.
Vous pouvez également demander au topic TrainStatusTopic
d’envoyer des e-mails ou des SMS de mise à jour en vous y abonnant.
Skill Alexa
La stack CloudFormation a une sortie nommée AlexaLambdaArn
. Vous pouvez utiliser cette fonction Lambda pour créer une skill Alexa afin de gérer la construction d’aws-sagemaker :
1 – Télécharger la définition du template JSON
2 – La fonction Lambda est déjà configurée avec les autorisations nécessaires pour être appelée par Alexa
3 – Créez un compte de développeur Amazon si vous n’en avez pas. Ce compte est différent de votre compte AWS
4 – Créez la compétence Alexa en suivant ces instructions :
- Connectez-vous à la console du développeur Amazon et choisissez l’onglet « Kit de compétences Alexa ».
- Dans l’écran suivant, choisissez «
custom
» pour votre type de compétence et donnez un nom à votre compétence. - Dans le menu de gauche, choisissez « Invocation » et donnez à votre compétence un nom d’invocation comme « sagebuild ».
- Dans le menu de gauche, choisissez « Endpoint » et copiez la sortie
AlexaLambdaArn
de votre stack de construction aws-sagemaker et collez-la dans le champ de la région par défaut sous «AWSLambdaArn
« . - Dans le menu de gauche, choisissez « JSON Editor » et copiez le modèle de définition que vous avez téléchargé et collez le dans l’éditeur
- Choisissez « Sauvegarder le modèle » et ensuite « Construire le modèle« .
Vous disposez désormais d’un workflow qui vous permet de pousser les modifications de code vers un dépôt (ou de télécharger de nouvelles données), de préparer un dîner et de demander périodiquement à Alexa : « Alexa, demande à SageBuild si mon build est terminé ». Je l’ai fait et c’est très impressionnant !
Validation
aws-sagemaker-build ne fait aucune validation sur votre entraînement. Cela signifie que si votre entrainement n’échoue pas, le modèle est déployé, même si ce modèle n’est pas plus performant que le modèle actuel. Votre job d’entraînement doit contenir une logique permettant de valider votre modèle et de faire échouer l’entrainement si nécessaire.
Frameworks
Le projet aws-sagemaker-build prend en charge quatre configurations différentes : Bring-Your-Own-Docker (BYOD), les algorithmes d’Amazon SageMaker, TensorFlow et MXNet. La configuration est définie comme un paramètre du template CloudFormation mais peut être modifiée après le déploiement. Pour les configurations TensorFlow et MXNet, les scripts utilisateur sont copiés et enregistrés avec les noms de version afin que les roll backs ou le redéploiement des anciennes versions fonctionnent correctement. Le bloc-notes qui est lancé via la stack aws-sagemaker-build contient des exemples de chacune des configurations.
Phase avancée
Déploiements Dev/Prod
Tout d’abord, créez un repo CodeCommit et un bucket Amazon S3. Ensuite, lancez deux stacks aws-sagemaker-build, toutes deux en utilisant le repo et le bucket S3 que vous venez de créer. Configurez une stack pour utiliser la branche « master » et une autre pour utiliser la branche « dev ».
Voici un schéma de ce à quoi ressemblerait cette architecture :
Événements Amazon CloudWatch
Avec Amazon CloudWatch Events, vous pouvez publier dans topic “LaunchTopic
” de votre stack selon un horaire régulier (par exemple, tous les jours à 17h ou une fois par semaine le vendredi à 21h). Vous pouvez l’utiliser dans un workflow dans lequel vous disposez d’un ensemble de données de développement avec lequel vous développez pendant la semaine. Vous poussez vos changements testés vers votre branche Git, et vous ne redéployez cette branche qu’à la fin de la semaine. De cette façon, vous n’entrainez pas constamment de gros modèles ce qui contribue à réduire les coûts.
Conclusion
Si cet article de blog vous aide à résoudre un problème ou vous inspire, nous serions ravis d’en entendre parler ! Nous avons également mis en place le code sur GitHub pour que vous puissiez l’utiliser et y contribuer. Les contributions sont toujours les bienvenues !
Remerciements
Article adapté par Dorian Richard, Solutions Architect accompagnant les clients français dans leur transformation digitale et leur adoption du cloud, Linkedin – Article d’origine en anglais