Mémoire de Master 2
Mémoire de Master 2
Mémoire de Master 2
Mémoire de Master 2
en Informatique
Spécialité
Génie Systèmes Informatiques (GSI)
Ingénierie des Systèmes d’Information et de Logiciel (ISIL)
Thème
Autoscaling Prédictif
2021/2022
République Algérienne Démocratique et Populaire
Mémoire de Master 2
en Informatique
Spécialité
Génie Systèmes Informatiques (GSI)
Ingénierie des Systèmes d’Information et de Logiciel (ISIL)
Thème
2021/2022
Remerciements
On tient à remercier nos très chers parents que nul remerciement, aucun mot ne pourrait
exprimer à leur juste valeur la gratitude et l’amour qu’on vous porte. On met entre vos mains,
le fruit de longues années d’études, de votre amour de votre tendresse, de longs jours
d’apprentissage. Votre éducation votre soutien et votre encouragement nous a toujours donné
de la force pour persévérer et pour prospérer dans la vie. Chaque ligne de cette thèse chaque
mot et chaque lettre vous exprime la reconnaissance, le respect, l’estime et le merci d’être nos
parents que Dieu vous garde.
On tient à exprimer nos sincères remerciements avec un grand plaisir et un grand respect à
notre encadreur DOCTEUR BADIS LYES professeur à l’université de Bouira, pour ses précieux
conseils, sa disponibilité et ses encouragements qui nous ont permis de réaliser ce travail.
Nous tiendrons aussi à exprimer l’honneur aux membres du jury, en acceptant d’évaluer
notre travail. Nous nous acquittons, enfin, volontiers d’un devoir de gratitude et de
remerciements a tous nos enseignants pour la qualité de l’enseignement qu’ils ont bien voulu
nous prodiguer durant nos études afin de nous fournir une formation efficiente.
On ne peut pas nommer ici toutes les personnes qui de prés ou de loin nous a aidé et
encouragé mais nous les remercions vivement.
Dédicaces
Ma plus grande gratitude et tout mon amour à mes parents, qui ont su me faire confiance, me
soutenir et m’encourager au cours de ma vie.
BOUZIDI Adel
Dédicaces
L’âme de ma chère grand-mère GOUAA Tassaidit, J’aurais tant aimé que vous soyez présents.
Que Dieu ait vos âmes dans sa sainte miséricorde.
Mes chers parents, frères, soeurs et amis.
HAMIDOU Imane
jÊÓ
k áÓ AK @QÖÏ @ áÓ YK YªË@ ÉJÖß èQªÖÏ @ HAÓY
éKPA®Ó ð à PñË@ é®kð É® JË@ éËñîD
©ñJË@ éËñîD IJ mÌ '@
áÓ YK YjJË@ ék. ð úΫ , HAK YjJË@ áÓ YK YªË@ ék. @ñK AîE @ B@ . éJ @Q¯B@ èQêk. B@ úÍ@ èYJÖ Ï @ éJ @Q¯BAK
.
Q
'
B . úΫA®K úG@ X AJ¯ éÒ¢ AK. AJKQK. ñJ» ÉJÓ éÒ¢B@ Ñ¢ªÓ êm. Õç' , ©¯@ñË@ ú¯ . ©ñJË@ éJÊK. A¯ IJk
ÉJÒjJË@ I.Jm.' ú¯ AîD¢J.Ë @Q ¢ éK . ñÊ¢ÖÏ @ éÓY mÌ '@ èXñk áÒ à @ è Yë éJ Ê«A®JË@ ùKA®Ê JË@ AJ®Ë@
.
éÒ ¢ B áºÖß
.ùKA®Ê JË@ AJ®Ë@
éJ JªË éjJ jË@ Q« éÒJ á« Am' AK àñºK à @ áºÖß ø YË@ð , úΫA®JË@ AJ®Ë@
®Ë@ ZAJK @ YK@QË@
. .
ÐA¢ úΫ ÉÒªK úæË@ èQªÖÏ @ HAÓY
mÌ '@ é«ñÒj
. ÖÏ èYK Yg. éK ñJ.K ùKA®ÊK AJ¯ é®K Q£ h Q®K , ÉÒªË@ @ Yë ú¯
AJ. Jk. AJAK P ùKA®Ê JË@ AJ®Ë@
éʾ Ó ék YÒJK Ðñ® K , ½Ë X YªK . éK PAJªÓ éJ K h Q® K , éK @YJË@ ú¯ . AJKQK ñJ»
. . . . . .
ø ñJ.K h. XñÖß YJ®JKð ÕæÒJK. Ðñ®K , ½Ë X YªK. . ÐAªË@ ÕæÒJË@ úΫ ZñË@ ¡JÊË éJÓPP@ñk ©Ó I.Jk. úÍ@
ÐA¢ QK ñ¢JK. Ðñ® K , ½Ë X YªK. .øYÖÏ @ èQ¯ éÊK ñ£ èQ» @ YË@ éºJ Õæ AK é¯ðQªÖÏ @ ñJJË@ é®K Q£ úΫ YÒJªK
. . .
ɾ
. èYK Yg. éÊKAÒJÓ q é¯AB , H. PYÖÏ @ øYÖÏ @ èQ¯ éÊK ñ£ èQ» @ YË@ h. XñÖß Ð@YjJAK. ùKA®Ê JË@ AJ®Ë@
HA JÓ Ð@YjJAK ñJJË@ Pñ¢ lñK , @Q g @ . AJJ ªÓ @ Yg
KAJJ.Ë@ ÉJÊm' é ©¯ñ JÖÏ @ Ð@YjJB@ PðAm' @ X@ ú¯AJ @
. . . .
Qê¢ , éJ .K Qj.JË@ l. ' AJJË@ ©Ó I.Jk. úÍ@ AJ. Jk. . úæ.K X » C®K@ éJ JÓQË@ ÉCË@ HA KAJK. èY«A¯ ð AKA¯@Q¯
úΫ PXA¯ ø ñJ.JË@ð ùKA®Ê JË@ Õæj.jJË@ à @ ø ñJ.JË@ð ùKA®Ê JË@ Õæj.jJË@ H. ùÒÖÏ @ Pñ¢ÖÏ @ úÍð B@ h. XñÒJË@
mÌ '@ èXñk úÍAJËAK áÒ AÜØ , YK@QË@ ÉJÒjJË@ IJm' ð Z@X B@ ám'
. éK . ñÊ¢ÖÏ @ éÓY . . . .
øYÖÏ @ èQ¯ éÊK
ñ£ èQ»@ YË@ , HAK ðAmÌ '@ , AJ®Ë@ , èQªÖÏ @ HAÓY mÌ '@ , éJ K. AjË@ éJ . ñmÌ '@ : éË@YË@
HAÒʾË@
. AJKQK. ñJ» , éK ñJ.JË@ Q¢Ë@
,
Abstract
1 Introduction Générale 1
1.1 Contexte Général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Problématique et Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Contributions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Organisation du Travail . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
i
Table des matières
ii
Table des matières
4.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
5 Travaux connexes 43
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2 Travaux Connexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.1 Proactive Autoscaling for Cloud-Native Applications using Machine Lear-
ning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.2 Agnostic Approach for Microservices Autoscaling in Cloud Applications . 45
5.2.3 An Improved Kubernetes Scheduling Algorithm For Deep Learning Platform 45
5.2.4 An Experimental Evaluation of the Kubernetes Cluster Autoscaler in the
Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2.5 Adaptive scaling of Kubernetes Pods LIBRA . . . . . . . . . . . . . . . . 47
5.2.6 Proactive Autoscaling for Edge Computing Systems with Kubernetes . . . 47
5.2.7 A lightweight autoscaling mechanism for fog computing in industrial ap-
plications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.2.8 Quantifying Cloud Elasticity with Container-Based Autoscaling . . . . . . 48
5.2.9 A study on performance measures for auto-scaling CPU-intensive contai-
nerized applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.2.10 Building an open source cloud environment with auto-scaling resources for
executing bioinformatics and biomedical workflows . . . . . . . . . . . . . 48
5.2.11 Autoscaling Pods on an On-Premise Kubernetes Infrastructure QoS-Aware 48
5.3 Analyse Comparative . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
7 Tests et Résultats 58
7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.2 Plateforme de Mise à l’Échelle Automatique et Prédictive . . . . . . . . . . . . . 59
iii
Table des matières
Bibliographie 91
iv
Table des matières
v
Table des figures
vi
Table des figures
vii
Liste des tableaux
5.1 Analyse Comparative entre notre Contribution MEAP et les différents Travaux
Connexes Analysés précédemment . . . . . . . . . . . . . . . . . . . . . . . . . . 49
viii
Liste des abréviations
CA Cluster Autoscaler
IA Intelligence Artificielle
LR Linear Regression
MP Machine Physique
MV Machine Virtuelle
ix
Liste des abréviations
SE Système d’Exploitation
VM Virtual Machine
x
Chapitre 1
Introduction Générale
Contents
1.1 Contexte Général . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 2
1.2 Problématique et Objectifs . . . . . . . . . . . . . . . . . . . . . . . . . 3
1.3 Contributions . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 4
1.4 Organisation du Travail . . . . . . . . . . . . . . . . . . . . . . . . . . . 6
1
Chapitre 1 : Introduction Générale
ien que les données aident les différentes industries, telles que les grands fournisseurs des
B systèmes logiciels (Google, Amazon et Facebook) à mieux servir les clients existants, à
atteindre de nouveaux marchés, à simplifier les opérations grâce à l’optimisation et à monétiser
les données analysées grâce à une prise de décision rapide, la croissance explosive des données
présente un défi majeur. Il est donc prioritaire de fournir, d’une part, une assurance élevée en
terme de métriques de QoS telles que les temps de réponse, le débit élevé et la disponibilité des
services, d’autre part, une utilisation efficace des ressources telles que (CPU, Mémoire, Énergie).
Le non-respect de de ces mesures de QoS et de consommation des ressources, entraîne une
diminution du nombre d’utilisateurs et une perte importante des revenus.
Avec cette augmentation importante de la demande de trafic ainsi que les services fortement
consommateurs de ressources tels que les services d’apprentissage automatique, le cloud com-
puting est adopté comme un acteur principal pour offrir la flexibilité nécessaire et la qualité de
service requise. Le terme cloudification est l’action de déplacer l’infrastructure matérielle dans le
cloud en utilisant les technologies de virtualisation. Traditionnellement, pour gérer les MV sur
le cloud, la virtualisation basée sur un hyperviseur était utilisée. Avec les récents progrès de la
technologie de virtualisation, la virtualisation au niveau du Système d’Exploitation (SE) a été
introduite, connue sous le nom de conteneurisation. En comparant avec la virtualisation basée
sur des MV, la conteneurisation présente l’avantage principalement en raison d’une meilleure por-
tabilité, d’une infrastructure légère, rapide et isolée pour exécuter des applications ainsi qu’une
mise à d’échelle facile.
L’environnement basé sur les conteneurs, connue sous le nom cloud natif, a changé la façon
dont les utilisateurs conçoivent le processus de développement, de déploiement et de mainte-
nance des applications logicielles. Le nom cloud natif provient des capacités d’isolation natives
des conteneurs des systèmes d’exploitation modernes, tout en obtenant une grande flexibilité
dans leur déploiement et une faible surcharge en consommation de ressources. Cela a donné nais-
sance à des architectures d’applications basées sur des microservices. Qui consiste à découper
une application en services distincts et différents et à les emballer dans des conteneurs distincts
et inter-communicants. Ensuite, en les déployant dans un cluster de machines virtuelles ou phy-
siques. La croissance des conteneurs avec la complexité de ces applications a donné naissance
à l’orchestration des conteneurs, qui consiste à fournir un mécanisme pour automatiser le dé-
ploiement et la configuration, l’auto-réparation et la tolérance aux pannes ainsi que la mise à
l’échelle automatique des ressources en fonction des besoins du déploiement. L’un des systèmes
d’orchestration les plus utilisés est Kubernetes.
2
Chapitre 1 : Introduction Générale
La mise à l’échelle des conteneurs consiste à rajouter des ressources (CPU, Mémoire) au
même ensemble de conteneurs, faisant référence à la mise à l’échelle verticale. En revanche,
l’ajout d’un ensemble de conteneurs à un déploiement existant correspond à la mise à l’échelle
horizontale. Ces méthodes de la mise à l’échelle sont utilisées pour maintenir une bonne latence de
réponse pour les requêtes simultanées concurrentes, améliorer l’utilisation des ressources (CPU,
Mémoire) et aider à garantir les Service-Level Objective (SLO)s. La plupart des méthodes de mise
à l’échelle proposées dans la littérature sont réactives, qui consistent à augmenter les ressources
des microservices (CPU, Mémoire) pour le cas de la mise à l’échelle verticale et le nombre de
conteneurs pour le cas de la mise à l’échelle horizontale, chaque fois que la moyenne CPU,
mémoire ou l’utilisation réseau franchit un certain seuil [4]. Cependant, la difficulté de trouver
des seuils optimaux ainsi que le délai lors de la mise à l’échelle d’un conteneur surchargé, rendent
la mise à l’échelle réactive inefficace et incapable de garantir le SLO requis.
Plusieurs méthodes de mise à l’échelle automatique et prédictive ont été proposées dans la
littérature : [4], [2], [3], [64], leurs idées principales est d’utiliser des techniques d’apprentissage
automatique pour prédire les ressources nécessaires pour servir la charge de travail. Ensuite,
allouer proactivement des ressources ou augmenter le nombre de conteneurs avant d’atteindre
un certain seuil. Leurs objectifs est de minimiser la violation de temps de réponse correspondant
aux SLOs. Cependant, la plupart des méthodes proposées présentent deux inconvénients : i) la
nécessité d’un temps considérable pour faire fonctionner l’application prédictive sur l’infrastruc-
ture pour recueillir des données d’entraînements couvrant différents comportements de charge de
travail, ii) l’absence de modèle prédictif efficace, accumulant continuellement les données d’entraî-
nement sans affecter les ressources du cluster, où la plupart des approches proposées utilisent des
méthodes de prédictions basées sur des modèles de régression tels que : Linear Regression (LR),
Auto Regressive Moving Average (ARMA).
Dans ce qui suit, nous présentons la problématique et objectifs dans la Section 1.2. Ensuite,
nous présentons la liste des contributions dans la Section 1.3, et finalement l’organisation de ce
travail sera présentée dans la Section 1.4.
Ce travail traite des défis de recherche associés à la mise à l’échelle automatique et prédictive.
L’approche du cloud natif doit être mise en œuvre pour tirer pleinement parti de l’approche du
cloud computing. Ainsi, la gestion de l’infrastructure d’orchestration doit être traitée avec le
problème d’allocation des ressources dans un environnement cloud. En particulier, les questions
suivantes doivent être abordées :
3
Chapitre 1 : Introduction Générale
1.3 Contributions
Dans ce travail, nous proposons une nouvelle méthode de mise à l’échelle automatique et pré-
dictive MEAP, pour une application basée sur des microservices hébergée dans une infrastructure
4
Chapitre 1 : Introduction Générale
cloud natif Kubernetes K8s, avec l’utilisation du méthode de prédiction LSTM qui a montré dans
plusieurs travaux de recherches, son efficacité de prédiction et adaptabilité avec des modèles de
trafic non réguliers. L’objectif principale est de minimiser la consommation des ressources afin de
garantir la QoS. Le développement et déploiement du système MEAP proposé consiste en : 1) dé-
ploiement d’un cluster d’orchestration Kubernetes sur deux machines virtuelles, 2) déploiement
des différents composant permettant d’activer la surveillance des ressources (CPU, Mémoire), en
utilisant le système Metrics-Server de Kubernetes, 3) développement d’un système de stress et de
monitoring permettant d’interagir avec le cluster Kubernetes pour stresser le CPU d’un microser-
vice puis le monitoring des ressources, 4) développement du modèle prédictif basé sur LSTM qui
s’entraîne d’une manière continue, sachant que notre travail sera basé sur un ordinateur portable
de la marque HP avec un processeur Intel Core i7 et 8 Go de RAM.
Les principaux contributions de ce travail incluent :
— Le choix de la méthode de prédiction LSTM, qui pour le meilleur de nos connaissances,
nous sommes les premiers à utiliser le type de LSTM Encodeur-Décodeur pour un système
de mise à l’échelle automatique et prédictive MEAP.
— La modularité de notre architecture proposée, dont la majorité des travaux proposés dans
la littérature sont dépendant des technologies d’orchestration et difficile à ajouter des
extensions ou à changer la méthode de prédiction.
— L’entraînement continu du système prédictif sans affecter les performances du système de
mise à l’échelle automatique et prédictive MEAP ainsi que le cluster d’orchestration.
Notes bien que, dans ce travail, nous avons considéré que la mise à l’échelle automatique et
horizontale, dans lequel on rajoute de nouveaux réplicas ou conteneurs si la consommation des
ressources dépasse un certain seuil. En ce qui concerne les ressources nous avons considéré que
l’utilisation du CPU.
5
Chapitre 1 : Introduction Générale
Chapitre 1 présente une introduction générale, dans lequel on commence par le contexte
général du travail, ensuite la problématique et nos éventuels objectifs, les principaux contributions
en comparant avec l’état de l’art, et finalement se termine par l’organisation du rapport.
Chapitre 5 présente l’état de l’art, dans lequel nous soulignons et revoyons la probléma-
tique, identifions les lacunes et proposons nos contributions.
Chapitre 8 conclut ce travail et synthétise ces objectifs ainsi que les contributions associées
et présente une perspective pour des travaux futurs.
6
Chapitre 2
La technologie de conteneurisation Docker
Contents
2.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.2 Cloud Natif . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3 Les MicroServices . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.3.1 Les Avantages des MicroServices . . . . . . . . . . . . . . . . . . . . . . 8
2.4 La Virtualisation . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 8
2.5 La Conteneurisation (Virtualisation par Conteneurs) . . . . . . . . . 9
2.5.1 Ce qui Différencie la Virtualisation de la Conteneurisation . . . . . . . . 9
2.5.2 Les MicroServices et les Conteneurs . . . . . . . . . . . . . . . . . . . . 9
2.6 La Technologie des Conteneurs Docker . . . . . . . . . . . . . . . . . 10
2.6.1 C’est Quoi Docker . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 10
2.6.2 Architecture et Principaux Composants de Docker . . . . . . . . . . . . 10
2.7 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 12
7
Chapitre 2 La technologie de conteneurisation Docker
2.1 Introduction
Le cloud natif concentre sur la façon de créer et d’exécuter des applications pour tirer parti du
modèle de cloud computing. Les technologies cloud natives telles que Les conteneurs, les orches-
trateurs, les maillages de services, les microservices, l’infrastructure immuable et les Interfaces
de Programmation d’Application (API) déclaratives permettent aux organisations de créer et
d’exécuter des applications évolutives dans des environnements modernes et dynamiques [56].
• Beaucoup plus faciles à créer, tester, déployer et mettre à jour par rapport aux applications
monolithiques ;
• Ils permettent aux organisations de réagir plus rapidement aux nouvelles demandes et
d’éviter un processus de développement interminable sur plusieurs années ;
• Les différentes tâches de développement peuvent être réalisées simultanément et de façon
agile pour apporter immédiatement de la valeur aux clients [57].
2.4 La Virtualisation
La virtualisation est utilisée pour générer un système physique simulé sur un système physique
réel. Elle permet d’utiliser une ressource informatique virtuelle à partir d’une Machine Physique
(MP) réelle. Nous pouvons avoir plusieurs systèmes virtuels, appelés MV, fonctionnant sur un
8
Chapitre 2 La technologie de conteneurisation Docker
seul système physique. Ces systèmes virtuels partagent l’utilisation des ressources physiques tels
qu’un processeur, une interface réseau ou un disque dur, ces derniers sont allouées à une MV
pour que celle-ci fonctionne comme une MP [79].
Il s’agit d’une forme de virtualisation du SE dans laquelle on peut exécuter des applications
dans des espaces utilisateurs isolés appelés conteneurs qui utilisent le même SE partagé. Un
conteneur d’applications est un environnement informatique entièrement regroupé en package et
portable et dispose de tout ce qu’une application a besoin pour s’exécuter [57].
Avec les méthodes traditionnelles, coder dans un environnement informatique spécifique en-
traîne souvent des erreurs et des bogues lorsqu’on transfère ce code dans un nouvel emplacement,
la conteneurisation supprime ce problème et permettant de regrouper le code de la demande avec
les fichiers de configuration, les dépendances et les bibliothèques associées. On peut ensuite, isoler
ce package unique (conteneur) du SE hôte, ce qui le rend autonome et portable, c’est-à-dire qu’il
peut s’exécuter sur n’importe quelle plate-forme ou n’importe quel cloud sans aucun problème.
Cette solution permet aux développeurs de logiciels de créer et de déployer des applications de
façon plus rapide et plus sécurisée [1].
Avec les conteneurs, les applications basées sur des microservices disposent d’une unité de
déploiement et d’un environnement d’exécution parfaitement adaptés. Lorsque les microservices
sont stockés dans des conteneurs, il est plus simple de tirer parti du matériel et d’orchestrer les
services, notamment les services de stockage, de réseau et de sécurité. C’est pour cette raison que
les microservices et les conteneurs constituent la base du développement d’applications cloud-
native [57].
9
Chapitre 2 La technologie de conteneurisation Docker
Docker est un outil open source, développé initialement par Solomon Hykes en 2008 (dot-
Cloud), [14], il est destiné aux développeurs et administrateurs systèmes, dont l’objectif est de
faciliter le développement, la diffusion et le déploiement d’applications web autonomes, il repré-
sente la plateforme de conteneurisation la plus utilisée, il permet aussi de créer facilement des
conteneurs et des applications basées sur les conteneurs, son principal intérêt est d’assembler les
briques d’une application en conteneurs pouvant être partagés, sous forme d’images, et de les
exécuter quels que soient la plateforme et l’environnement [15].
La figure 2.1 représente l’architecture Docker, elle fournit des détails sur les principaux com-
posants d’une plate-forme Docker et sur la manière dont l’utilisateur commande le démon Docker
via le client.
Docker utilise une architecture serveur-client. Où le client est Docker Client (Command Line
Interface (CLI)) et le processus serveur est Docker Daemon qui s’exécute sur l’hôte. Le serveur
et le client peuvent être sur le même ordinateur.
Voici les différents composants d’une plate-forme Docker.
Image Docker
C’est un modèle en lecture seule, qui sert à créer des conteneurs Docker. Une image Docker est
composée de plusieurs couches empaquetant toutes les installations, dépendances, bibliothèques,
10
Chapitre 2 La technologie de conteneurisation Docker
Conteneur Docker
Un conteneur Docker est une instance d’image Docker exécutée. On peut gérer, créer, démarrer,
arrêter, déplacer ou supprimer un conteneur à l’aide de l’API ou de la CLI Docker. L’image Docker
crée un conteneur Docker.
Par défaut, un conteneur est relativement bien isolé des autres conteneurs et de sa machine hôte,
on peut contrôler le degré d’isolement du réseau, du stockage ou d’autres sous-systèmes sous-
jacents d’un conteneur par rapport aux autres conteneurs ou à la machine hôte, ce qui permet à
l’application d’être exécutée d’une manière isolée [25] [24] [66].
Le client Docker
Le client Docker est le principal moyen utilisé par de nombreux utilisateurs Docker pour
interagir avec Docker, le client envoie ces commandes au démon Docker, qui les exécute, on
utilisant l’API Docker. Ce dernier peut communiquer avec plusieurs démons [24].
Démon Docker
Le démon docker s’exécute en arrière-plan sur le système hôte et sert à contrôler le moteur
Docker de manière centralisée. Dans cette fonction, il écoute les requêtes API et il crée et gère
toutes les images, conteneurs ou réseaux [20].
11
Chapitre 2 La technologie de conteneurisation Docker
Registre Docker
Un registre Docker stocke les images Docker. Ce système de catalogage permettant l’héber-
gement et le ”push and pull” des images Docker, on peut même exécuter un registre privé,
lorsqu’on utilise les commandes "docker pull" ou "docker run", les images requises sont extraites
du registre configuré et lorsqu’on utilise la commande "docker push", l’image est poussée vers le
registre configuré.
Docker Hub représente le registre officiel de Docker, il est un registre public que tout le monde
peut utiliser [25] [24] [66].
2.7 Conclusion
Dans ce chapitre, nous avons présenté une vue globale sur l’un des systèmes et technologies
permettant de concevoir et réaliser notre approche MEAP, qui est le système de conteneurisation
Docker.
Dans le chapitre suivant, on va présenter le système d’orchestration Kubernetes.
12
Chapitre 3
L’orchestration des conteneurs Kubernetes
Contents
3.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 14
3.2 L’Orchestration des Conteneurs . . . . . . . . . . . . . . . . . . . . . . 14
3.3 Le Système d’orchestration Kubernetes . . . . . . . . . . . . . . . . . 14
3.3.1 Architecture de Kubernetes . . . . . . . . . . . . . . . . . . . . . . . . . 15
3.3.2 Composants d’un Cluster Kubernetes . . . . . . . . . . . . . . . . . . . 15
3.3.3 Élément Nécessaire Pour le Déploiement d’un Microservice sur Kubernetes 17
3.4 La Mise à l’Échelle Automatique de Kubernetes (Autoscaling) . . . 19
3.4.1 Le Type HPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 19
3.4.2 Le Type VPA . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 20
3.4.3 Le type de Mise à l’échelle Automatique du Cluster . . . . . . . . . . . 20
3.5 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 21
13
Chapitre 3 L’orchestration des conteneurs Kubernetes
3.1 Introduction
Kubernetes est un système Open Source qui exécute et coordonne des applications conteneu-
risées dans des clusters. Il gère le cycle complet de vie des applications et des services permettant
ainsi de limiter le nombre de processus nécessaire au déploiement et à la mise à l’échelle des appli-
cations conteneurisées [41], qu’elles soient d’ancienne génération, conteneurisées ou cloud-native,
transformées en microservices dans différents environnements [42].
Kubernetes est disponible sur site ou sur le Cloud. Aujourd’hui, K8s est maintenu par la Cloud
Native Computing Foundation (CNCF) de la Linux Foundation. Il s’agit de l’un des principaux
outils de développement à l’ère du Cloud Computing [37].
Le développeur n’a plus à s’occuper de la gestion des MV, il n’a pas besoin de savoir où sont
les applications et l’infrastructure sous-jacente étant masqué pour lui, c’est K8s qui va s’occuper
de tous ces détails [32].
14
Chapitre 3 L’orchestration des conteneurs Kubernetes
Les déploiements d’applications utilisent souvent plusieurs instances de conteneur appelé clus-
ters. K8s permet l’orchestration et la gestion du ces derniers à grande échelle. Un cluster K8s se
compose d’un ensemble de machines de travail appelées nœuds, qui exécutent des applications
conteneurisées, Chacun a au moins un noeud worker. Si on exécute K8s, on exécutez un cluster.
Le plan de contrôle est responsable du maintien du cluster dans un état souhaité, par exemple
il vérifie les applications exécutées et les images de conteneurs utilisées. Ainsi, le rôle de K8s est
de gérer de manière automatisé les besoins en sécurité, données, stockage et mise en réseau des
conteneurs [17].
Selon la figure 3.1, un cluster K8s comprend les principaux composants suivants :
15
Chapitre 3 L’orchestration des conteneurs Kubernetes
L’API-Server
L’API-Server est la partie "front-end" du plan de contrôle K8s. L’API-Server détermine si une
requête est valide pour ensuite la traiter. L’API-Server est l’interface utilisée pour gérer, créer
et configurer les clusters K8s, il garantit la communication entre les utilisateurs, les composants
externes et certaines parties du cluster [7].
Le Scheduler
Le scheduler est le planificateur K8s, prend en compte les besoins en ressources (par exemple,
processeur ou mémoire) d’un Pod, il planifie ensuite l’attribution du Pod au nœud de calcul
adéquat. Le planificateur K8s assure que le cluster en bonne santé, son intégrité, la possibilité
d’intégrer de nouveaux conteneurs si besoin [60].
Le Controller Manager
Il correspond au gestionnaire de contrôleur K8s, qui regroupe plusieurs fonctions. Un contrôleur
se réfère au planificateur pour assurer qu’un nombre suffisant de Pods est exécuté, si un Pod
est défaillant, le contrôleur le remarque et réagit. Il connecte les services aux Pods afin que les
demandes soient acheminées jusqu’aux points de terminaison appropriés [60].
Le Pod
Le Pod est l’unité la plus petite et la plus simple dans le modèle d’objets de K8s. Il représente
une instance unique d’une application. Comme montre la figure 3.2, chaque Pod est constitué
d’un conteneur ou d’une série de conteneurs étroitement couplés, ainsi que des options permettant
de contrôler l’exécution de ces conteneurs, chaque Pod au sein d’un node possède : 1) Une adresse
IP locale, 2) Un ou plusieurs conteneurs, 3) Un ou plusieurs volumes associés à ces conteneurs,
c’est-à-dire des ressources de stockage persistant.
Le Service
Un service maintient une liste logique de Pods qui acceptent le trafic entrant et exposent un
port interne pour accéder aux Pods sous-jacents, il gère les changements de trafic en modifiant
le nombre de Pods [61] [41].
16
Chapitre 3 L’orchestration des conteneurs Kubernetes
Le Composant kubelet
L’agent de surveillance de Kubernetes (kubelet) est une minuscule application située au sein
de chaque nœud de travail qui communique avec le plan de contrôle. Le kubelet s’assure que les
conteneurs sont exécutés dans un Pod. Lorsque le plan de contrôle envoie une requête vers un
nœud, le kubelet exécute l’action. Si un noeud ne répond plus, les Pods déployés sur ce noeud
de travail seront transférés à un autre noeud de travail pour assurer la stabilité [26] [40].
Le Composant kube-proxy
Chaque nœud de calcul contient également un proxy réseau appelé « kube-proxy » qui facilite
la mise en œuvre des services de mise en réseau de K8s et gère les communications réseau dans
et en dehors du cluster [60].
Dans cette section, on va présenter quelques éléments nécessaire pour le déploiement d’une
application sur Kubernetes :
• kubectl
Interface en ligne de commande dans laquelle on peut gérer votre cluster K8s [60].
• Volume
Un volume Kubernetes est un répertoire qui contient des données accessibles aux conte-
17
Chapitre 3 L’orchestration des conteneurs Kubernetes
neurs d’un Pod donné dans la plate-forme d’orchestration et de planification. Les volumes
fournissent un mécanisme de plug-in pour connecter des conteneurs éphémères à des don-
nées persistants ailleurs.
• L’Espace de Nom (NameSpace)
Les espaces de noms fournissent un mécanisme pour isoler des groupes de ressources au
sein d’un seul cluster K8s . Les noms de ressources doivent être uniques au sein d’un
même namespace, mais pas entre namespaces [41].
• Le Composant ReplicaSet
Un ReplicaSet est conçu pour maintenir un ensemble stable de Pods à tout moment.
18
Chapitre 3 L’orchestration des conteneurs Kubernetes
K8s offre plusieurs niveaux de contrôle de la gestion de la capacité pour la mise à l’échelle
automatique. Les planificateurs K8s attribuent des Pods de conteneurs aux nœuds de cluster
avec l’ensemble du processus contrôlable par les paramètres de configuration dans les fichiers Yet
Another Markup Language (YAML). À l’aide de ces fichiers, les administrateurs K8s peuvent
demander et définir des limites maximales pour le processeur et la mémoire disponibles pour une
utilisation par chaque conteneur dans un Pod [43].
Les administrateurs peuvent également fournir des instructions à K8s pour allouer automati-
quement plus de CPU et de mémoire à un Pod en fonction des critères d’utilisation du CPU et
de la mémoire [ également appelé mise à l’échelle automatique des Pods verticaux ou bien VPA
en anglais ]. En outre, ils peuvent configurer K8s pour répliquer automatiquement les Pods pour
les charges de travail d’application sans état [ également appelée mise à l’échelle automatique des
Pods horizontaux ou bien HPA en anglais ]. Enfin, ils peuvent également configurer le cluster
pour ajouter plus de nœuds une fois que les autres nœuds sont entièrement utilisés ou réservés [
également appelé Mise à l’échelle automatique du cluster ] [43].
Ajoute et supprime des Pods. Une fonctionnalité K8s pour augmenter ou diminuer le nombre
de réplicas de Pod automatiquement en fonction de métriques définies [77].
19
Chapitre 3 L’orchestration des conteneurs Kubernetes
Augmente et diminue le processeur et la mémoire du Pod, c’est une fonctionnalité K8s pour
dimensionner correctement les Pods de déploiement et éviter les problèmes d’utilisation des
ressources sur le cluster [77].
Ajoute et supprime des nœuds de cluster. À mesure que de nouveaux Pods sont déployés
et que le nombre de réplicas pour les Pods existants augmente, les nœuds de travail du clus-
ter peuvent utiliser toutes leurs ressources allouées. Par conséquent, plus aucun Pod ne peut
être programmé sur les nœuds de calcul existants. Certains Pods peuvent entrer dans un état
d’attente. Attendre le processeur et la mémoire et éventuellement créer une panne. En tant qu’ad-
ministrateur K8s, vous pouvez résoudre manuellement ce problème en ajoutant plus de nœuds
de travail au cluster pour permettre la planification de Pods supplémentaires. Le problème est
que ce processus manuel prend du temps et s’adapte mal. Heureusement, K8s Cluster Autoscaler
peut résoudre ce problème en automatisant la gestion de la capacité. Plus précisément, Cluster
Autoscaler automatise le processus d’ajout et de suppression de nœuds de travail d’un cluster
K8s [77].
20
Chapitre 3 L’orchestration des conteneurs Kubernetes
3.5 Conclusion
Dans ce chapitre, nous avons présenté une vue globale sur l’un des systèmes et technologies
permettant de concevoir et réaliser notre approche MEAP, qui est le système d’orchestration
Kubernetes.
Dans le chapitre suivant, on va présenter la méthode de prédiction LSTM.
21
Chapitre 4
La méthode de prédiction LSTM
Contents
4.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 23
4.2 La Méthode de Prédiction (LSTM) . . . . . . . . . . . . . . . . . . . 23
4.2.1 L’Apprentissage Automatique (Machine Learning) . . . . . . . . . . . . 23
4.2.2 Apprentissage Profond (Deep Learning) . . . . . . . . . . . . . . . . . . 23
4.2.3 Différents Types de Réseaux de Neurones dans Deep Learning . . . . . 23
4.2.4 Entraîner LSTM . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 32
4.2.5 Modes d’Utilisations de LSTM . . . . . . . . . . . . . . . . . . . . . . . 35
4.2.6 Types des Modèles LSTM . . . . . . . . . . . . . . . . . . . . . . . . . . 38
4.2.7 Préparation des Données pour les Réseaux LSTM . . . . . . . . . . . . 40
4.3 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 42
22
Chapitre 4 La méthode de prédiction LSTM
4.1 Introduction
Dans cette section, on va commencer par donner une vue globale sur l’apprentissage auto-
matique et l’apprentissage profond, comme ils sont la base pour bien comprendre LSTM.
L’apprentissage automatique est une technique utilisée dans Intelligence Artificielle (IA). Il se
compose de modèles formés dans une base de connaissances pour effectuer des tâches complexes.
Il s’agit d’une technique de programmation informatique qui utilise la probabilité statistique pour
permettre aux ordinateurs d’apprendre par eux-mêmes sans être explicitement programmés. Pour
son objectif fondamental, l’apprentissage automatique apprend aux ordinateurs à apprendre, puis
à agir et à réagir comme des humains, améliorant de manière autonome leur façon d’apprendre
et ce qu’ils savent au fil du temps. Les programmes de développement utilisés par l’apprentissage
automatique s’ajustent chaque fois qu’il est exposé à un type différent de données d’entrée [53]
[54].
Il y a trois types importants de réseaux de neurones qui constituent la base de la plupart des
modèles pré-formés en apprentissage profond [23] :
• Réseaux de neurones artificiels (ANN) ;
• Réseaux de neurones convolutifs (CNN) ;
• Réseaux de neurones récurrents (RNN).
23
Chapitre 4 La méthode de prédiction LSTM
On va se concentrer beaucoup plus sur les RNN qui sont la base pour bien comprendre La
méthode LSTM.
Le réseau de neurones artificiel a la même fonction et nature que les réseaux de notre cerveau.
Les données sont transférées dans le neurone par l’entrée, et les données sont envoyées en sortie
après traitement. Les ANNs aident à effectuer des tâches telles que la classification des données
[5].
Parmi les limites des architectures traditionnelles (ANN) on peut citer [6] :
— Taille fixe de la couche d’entrée et de la couche de sortie ;
— Architecture fixe du réseau ;
— Ne tiennent pas compte de l’ordre des données ;
— Non adaptées aux séries temporelles .
Réseaux de neurones convolutifs est un type de réseau de neurones artificiels largement utilisé
pour la reconnaissance et la classification d’images/d’objets. Le Deep Learning reconnaît ainsi
des objets dans une image en utilisant un CNN. Les CNN jouent un rôle majeur dans diverses
tâches/fonctions telles que les problèmes de traitement d’image, les tâches de vision par ordina-
teur telles que la localisation et la segmentation, l’analyse vidéo, la reconnaissance des obstacles
dans les voitures autonomes, ainsi que la reconnaissance vocale dans le traitement du langage
naturel. Comme les CNN jouent un rôle important dans ces domaines à croissance rapide et
émergents, ils sont très populaires dans le Deep Learning [18].
24
Chapitre 4 La méthode de prédiction LSTM
Les RNNs sont une catégorie de réseaux de neurones dédiée au traitement de séquences.
On peut dire que les réseaux de neurones récurrents reposent sur deux principes : 1) Un RNN
peut traiter des données de taille variable, 2) Utilisation de connexions récurrentes qui permettent
d’analyser la partie passée du signal (se "souvenir" de sa décision à un instant précédent).
Dans les RNNs la sortie du réseau d’un pas de temps est fournie comme entrée dans le pas de
temps suivant, cela permet au modèle de prendre une décision quant à ce qu’il faut prédire en
fonction à la fois de l’entrée pour l’étape de temps actuelle et de la connaissance directe de ce
qui a été produit à l’étape de temps précédente.
Dans la méthode traditionnelle, nous n’étions pas en mesure de considérer collectivement les
différents intrants et extrants. Même si l’information était connectée, nous la considérions comme
un individu. Cela a créé divers défis pour de nombreuses tâches. Par exemple, dans un problème
de prédiction d’un mot à partir d’une séquence de mots, il est évident qu’il faut connaître le
premier mot pour prédire le mot suivant car les deux sont interconnectés. Le RNN traite la
même tâche de la même manière, en conservant les données dans un ordre précis et peut revenir
sur quelques étapes pour utiliser les informations précédentes pour les résultats actuels [5] [70].
 l’exception de la notion de récursivité, les RNN sont similaires aux réseaux de neurones
classiques (perceptron multicouche) appelés MultiLayer Perceptrons (MLP) (Le MLP est un
type de ANN). Les MLP sont des algorithmes d’apprentissage automatique supervisé, prennent
la description d’un objet en entrée, et fournissent une prédiction en sortie. L’entrée est représentée
par un vecteur numérique, qui décrit les caractéristiques (features) de l’objet. Ce vecteur traverse
une succession de couches de neurones, où chaque neurone est une unité de calcul élémentaire.
La prédiction est fournie en sortie sous la forme d’un vecteur numérique [58].
Dans le schéma suivant, une couche de MLP reçoit en entrée un vecteur, par exemple : [a, b,
c], et produit en sortie un vecteur, par exemple [h1, h2, h3, h4], et nous pouvons représenter une
couche entière sous la forme d’une cellule [58].
25
Chapitre 4 La méthode de prédiction LSTM
Le plus souvent les RNNs ne gèrent pas bien les dépendances a long terme a cause de la
disparition du gradient (vanishing gradient) comme conséquence de l’utilisation de "tanh".
h = fw (x1 , h0 )
1
h2 = fw (x2 , h1 ) = fw (x2 , fw (x1 , h0 ))
h = f (x , h ) = f (x , f (x , f (x , h )))
3 w 3 2 w 3 w 2 w 1 0
26
Chapitre 4 La méthode de prédiction LSTM
entre 0 et 1 entre elles, plus le résultat se rapproche de 0. Le gradient prend donc des valeurs
très petites lorsque les séquences sont longues. La mise à jour des paramètres devient donc très
lente et l’entraînement du modèle est mis à mal [51].
Comme nous l’avons vu dans la section précédente, afin de modéliser des dépendances à long
terme, il est nécessaire de donner aux réseaux de neurones récurrents la capacité de maintenir
un état sur une longue période de temps. C’est le but des cellules LSTM, qui possèdent une
mémoire interne appelée cellule. La cellule permet de maintenir un état aussi longtemps que
27
Chapitre 4 La méthode de prédiction LSTM
nécessaire [45]. Les LSTMs se composent de plusieurs unités appelées Cellule, chaque cellule se
compose de trois portes appelées portes d’entrée, sortie et oubli. Les portes d’oubli s’occupent
des informations qui doivent être autorisées à traverser le réseau. De cette façon, nous pouvons
avoir une mémoire à court et à long terme. La figure 4.5 montre l’architecture de LSTM [65].
L’idée de LSTM est de diviser le signal entre ce qui est important à court terme à travers l’état
caché (hidden state), et ce qui l’est à long terme, à travers la cellule d’état (cell state). Ainsi, le
fonctionnement global d’un LSTM peut se résumer en trois étapes [51] :
— Détecter les informations pertinentes venant du passé, piochées dans le cell state à travers
la forget gate ;
— Choisir, à partir de l’entrée courante, celles qui seront pertinentes à long terme, via l’input
gate. Celles-ci seront ajoutées au cell state qui fait office de mémoire longue ;
— Piocher dans le nouveau cell state les informations importantes à court terme pour générer
le hidden state suivant à travers l’output gate.
Comme LSTM est conçu pour éviter le problème de dépendance à long terme. On introduit
une nouvelle variable Ct qui permettra de se souvenir des informations pendant de longues pé-
riodes.
La mise à jour des variables se fera alors selon les équations suivante :
Ct = Ct−1 + tanh(Whg ht−1 + Wxg xt + bg )
(4.1)
h = tanh(C )
t t
28
Chapitre 4 La méthode de prédiction LSTM
Cette fois on est assuré que l’état caché ht calculé à instant t tient compte de tous les états
cachés précédent qui sont conservés dont l’état de la cellule Ct .
Cela présente des inconvénients. Dont, le passé est toujours aussi important que le présent ce
qui n’est pas pertinent. la solution idéale pour cela est de permettre aux réseaux de garder ou
d’oublier les informations du passé selon qu’elles soient déterminantes ou pas [6].
Cette porte décide de quelle information doit être conservée ou jetée : l’information de l’état
caché précédent est concaténé à la donnée en entrée (par exemple le mot « des » vectorisé) puis
on y applique la fonction sigmode afin de normaliser les valeurs entre 0 et 1. Si la sortie de la
sigmode est proche de 0, cela signifie que l’on doit oublier l’information et si on est proche de 1
alors il faut la mémoriser pour la suite [6] [33].
29
Chapitre 4 La méthode de prédiction LSTM
ft = σ (whf × ht−1 + wxf × xt + bf ).O :
σ (X) = 1/(1 + e−1 ), Donc : 0 ≤ σ (X) ≤ 1
(4.2)
Ct = ft × Ct−1 + tanh(Whg × ht−1 + Wxg × xt + bg )
ht = tanh(Ct )
[6]
Si par exemple
:
0.2 0.9 0.18
-0.4 0.01 0.00 => Oubli
Ct−1 =
et ft =
Alors : Ct =
0.75 0.3 0.23
0.83 0.95 0.79
Donc, l’oubli est appliquée au deuxième élément de Ct−1 . le premier et le troisième élément
restent pratiquement inchangé donc on dit qu’ils sont conservés [6].
Porte d’Entrée
Une autre porte est ajouté pour pondérer la mise à jour (additive) de l’état de la cellule Ct
par la sortie "T anh" prenant comme entrée ht−1 et xt .
Cette porte qui s’appelle input gate va apprendre à utiliser, à ignoré ou à moduler les infor-
mations entrées selon leur importance [6].
- Sigmode va renvoyer un vecteur pour lequel une coordonnée proche de 0 signifie que la coor-
donnée en position équivalente dans le vecteur concaténé n’est pas importante.
- A l’inverse, une coordonnée proche de 1 sera jugée importante (i.e. utile pour la prédiction que
cherche à faire le LSTM).
30
Chapitre 4 La méthode de prédiction LSTM
- T anh va simplement normaliser les valeurs (les écraser) entre -1 et 1 pour éviter les problèmes
de surcharge de l’ordinateur en calculs.
- Le produit des deux permettra donc de ne garder que les informations importantes, les autres
étant quasiment remplacées par 0 [6] [33].
ft = σ (whf × ht−1 + wxf × xt + bf ).
it = σ (whi × ht−1 + wxi × xt + bi ).
(4.3)
C = ft × Ct−1 + it × tanh(Whg × ht−1 + Wxg × xt + bg ).
t
ht = tanh(Ct ).
[6].
L’État de la Cellule
On parle plus de l’état de la cellule avant d’aborder la dernière porte (porte de sortie), car la
valeur calculée ici est utilisée dedans.
Dans l’état de la cellule, d’abord on multiplie coordonnée à coordonnée la sortie de l’oubli avec
l’ancien état de la cellule. Cela permet d’oublier certaines informations de l’état précédent qui
ne servent pas pour la nouvelle prédiction à faire. Ensuite, on additionne le tout (coordonnée
à coordonnée) avec la sortie de la porte d’entrée, ce qui permet d’enregistrer dans l’état de la
cellule ce que le LSTM (parmi les entrées et l’état caché précédent) a jugé pertinent [33].
Porte de Sortie
La porte de sortie est ajoutée pour pondérer la mise à jour de l’état caché ht . Cela permet de
décider quelles informations l’état caché ht doit porter, cette porte est appelé porte de sortie ou
31
Chapitre 4 La méthode de prédiction LSTM
ft = σ (whf × ht−1 + wxf × xt + bf ).
it = σ (whi × ht−1 + wxi × xt + bi ).
ot = σ (who × ht−1 + wxo × xt + bo ). (4.4)
Ct = ft × Ct−1 + it × tanh(Whg × ht−1 + Wxg × xt + bg ).
h = o × tanh(C ). [6].
t t t
Comme montré dans des sections précédentes, un réseau de neurones est une séquence de
fonctions simples, prenant en entrée les données de notre problème, Cette séquence de fonctions
prend comme paramètres des poids "W ". L’apprentissage consiste à modifier les poids "W " afin
de minimiser une erreur données par une fonction de coût "L". Cette erreur mesure la différence
entre les données réels "y" et les données prédites par le modèle "y". L’entraînement se déroule
comme suit :
- Les poids W sont initialisés aléatoirement,
- On fait passer Xtrain par le modèle pour obtenir une prédiction y train ,
- On calcule ensuite la valeur de la fonction de coût L(ytrain , y train ),
32
Chapitre 4 La méthode de prédiction LSTM
- On calcule le gradient de cette fonction L par rapport aux paramètres W : (dw1 et dw2 ),
- On cherche à minimiser la fonction de coût en mettant à jour les paramètres W . Pour cela, on
effectue une descente de gradient grâce au gradient calculé à l’étape précédente.
W = W − α.dW
f (W, b) = (4.5)
b = b − α.d
b
Dans les réseaux de neurones, on fait la propagation vers l’avant pour obtenir la sortie d’un
modèle et vérifier si cette sortie est correcte, pour obtenir l’erreur, on fait Rétro-propagation
(en anglais : Backward-Propagation), qui n’est rien d’autre que de revenir en arrière à travers le
réseau de neurones pour trouver les dérivées partielles de l’erreur par rapport aux poids "W ", ce
qui nous permet de soustraire les valeurs des poids.
Ensuite, ces dérivées sont utilisées par "descente de gradient", qui est un algorithme utilisé afin
de minimiser itérativement une fonction donnée. Ensuite, il ajuste les poids vers le bas ou vers
le haut, de façon à diminuer l’erreur [69].
Exemple Illustratif
Soit xt l’entrée à l’instant t dans une cellule LSTM, l’état de la cellule à partir de l’instant
t − 1 et t soit ct−1 et ct et la sortie pour l’instant t − 1 et t soit ht−1 et ht . La valeur initiale de
ct et ht à t = 0 sera zéro.
La Propagation vers l’Avant (The Forward Propagation), [27] :
- Étape 1 : Initialisation des Poids
-La Porte d’entrée : wxi , wxg , whg , whi , bi , bg ;
33
Chapitre 4 La méthode de prédiction LSTM
34
Chapitre 4 La méthode de prédiction LSTM
sigmoid(zf ) × xt
dE/dwhf = dE/df ×(df/dwhf ) = E_delta × o × (1-tanh2(ct )) × ct−1 × sigmoid(zf ) × (1-
sigmoid(zf ) × ht−1
dE/dbo = dE/df ×(df/dbo ) = E_delta × o × (1-tanh2(ct )) × ct−1 × sigmoid(zf ) × (1-sigmoid(zf )
Le Gradient par Rapport aux Poids de la Porte d’Entrée :
dE/dwxi = dE/di × (di/dwxi ) = E_delta × o × (1-tanh2 (ct )) × g × sigmoid(zi ) × (1-sigmoid(zi )
× xt
dE/dwhi = dE/di × (di/dwhi ) = E_delta × o × (1-tanh2 (ct )) × g × sigmoid(zi ) × (1-
sigmoid(zi ) × ht−1
dE/dbi = dE/di × (di/dbi ) = E_delta × o × (1-tanh2 (ct )) × g × sigmoid(zi ) × (1-sigmoid(zi )
dE/dwxg = dE/dg × (dg/dwxg ) = E_delta × o × (1-tanh2 (ct )) × i × (1-tanh2(zg )) × xt
dE/dwhg = dE/dg × (dg/dwhg ) = E_delta × o × (1-tanh2 (ct )) × i × (1-tanh2(zg )) × ht−1
dE/dbg = dE/dg ×(dg/dbg ) = E_delta × o × (1-tanh2 (ct )) × i × (1-tanh2(zg )).
Ces calculs sont répétés, Jusqu’à trouver les meilleurs paramètres, tel qu’on utilise ces dérivés
pour mettre à jour les poids basant sur une fonction de mise à jour (Descente de Gradient
Stochastique (SGD)) [46] :
wnew = wold − α × dwold (4.6)
Bien que les réseaux neuronaux Feed-Forward fassent correspondre une entrée à une sortie,
les RNN peuvent correspondre à : un à plusieurs, plusieurs à plusieurs et plusieurs à un, il existe
35
Chapitre 4 La méthode de prédiction LSTM
principalement quatre modes pour faire fonctionner un réseau de neurones récurrent de type
LSTM, chacun de ces modes a son cas d’utilisation [59].
Un à Un (One to One)
Les problèmes de séquence "Un à un" sont des problèmes de séquence où les données d’entrée
ont un pas de temps, et les données de sortie ont un pas de temps [59].
36
Chapitre 4 La méthode de prédiction LSTM
Plusieurs à Un (Many-to-One)
Dans les problèmes de "Plusieurs à un", comme montre la figure 4.14, nous avons une séquence
de données en entrée, et nous devons prédire une sortie unique. L’analyse des sentiments ou la
classification de textes est un tel cas d’utilisation.
Comme expliqué dans les sections Précédentes, les réseaux de neurones récurrents, ou RNN,
sont spécifiquement conçus pour travailler, apprendre et prédire les données de séquence. où
la sortie du réseau d’un pas de temps est fournie comme entrée dans le pas de temps suivant.
En outre, les LSTMs offrent un certain nombre d’avantages en matière de prévision de séries
chronologiques à plusieurs étapes [55] :
37
Chapitre 4 La méthode de prédiction LSTM
- Les LSTMs prennent directement en charge plusieurs séquences d’entrée parallèles pour les
entrées multivariées, contrairement à d’autres modèles où les entrées multivariées sont présentées
dans une structure plate.
- Comme d’autres réseaux de neurones, les LSTMs sont capables de mapper les données d’entrée
directement sur un vecteur de sortie qui peut représenter plusieurs pas de temps de sortie.
-Des architectures spécialisées ont été développées qui sont spécifiquement conçues pour effectuer
des prédictions de séquences en plusieurs étapes, généralement appelées prédiction séquence à
séquence (Seq_T o_Seq) ou plusieurs à plusieurs (Many To Many). Un exemple d’architecture
de RNN conçu pour les problèmes (Seq_T o_Seq) est l’encodeur-décodeur LSTM.
4.2.6.1 Modèles LSTM Uni-Variés avec une Seule Étape (One Step)
LSTM peut être utilisé pour modéliser des problèmes de prédiction de séries chronologiques
univariées. Il existe multiple variations du modèle LSTM pour la prévision de séries chronolo-
giques univariées. parmi ces modèles, on a :
Figure 4.16 – Archiecture de Mémoire à Long Terme Empilée [ Basé sur [49]]
38
Chapitre 4 La méthode de prédiction LSTM
le contexte futur. Pour ces problèmes, il est possible d’utiliser un réseau appelé BLSTM, qui
consiste à dédoubler une couche LSTM, l’une étant apprise pour parcourir le signal de gauche à
droite, et l’autre de droite à gauche.
Il existe différents modèles LSTM qui peuvent être utilisés pour les problèmes de prédiction
des séries chronologiques qui nécessitent une prédiction de plusieurs pas de temps dans le futur,
parmi eux, nous citons le modèle Encodeur-Décodeur.
Le Modèle Encodeur-Décodeur
Comme son nom l’indique, le modèle est composé de deux sous-modèles : l’encodeur et le
décodeur. L’encodeur est un modèle responsable de la lecture et de l’interprétation de la séquence
d’entrée. La sortie de l’encodeur est un vecteur de longueur fixe qui représente l’interprétation de
la séquence par le modèle. L’encodeur est traditionnellement un modèle Vanilla LSTM, bien que
d’autres modèles d’encodeurs puissent être utilisés, tels que les modèles empilés, bidirectionnels
39
Chapitre 4 La méthode de prédiction LSTM
et CNN.
Comme déjà indiqué, l’encodeur LSTM joue le même rôle de lecture de la séquence d’entrée et
de génération des vecteurs : (hk , ck ). Cependant, le décodeur doit prédire la séquence de sortie
entière compte tenu des vecteurs : (hk , ck ) [50] [52].
Pour bien comprendre comment préparer les données pour les réseau LSTM, on va présenter
les critères sur lesquels reposent les résultats des modèle LSTM en expliquant la relation entre
le modèle et les données d’entraînement par rapport à ces critères.
40
Chapitre 4 La méthode de prédiction LSTM
cachées, Le nombre d’unités est en fait la dimension de l’état caché (ou la dimension de la sortie
"ht "). En général, Plus le nombre d’unités est grand (plus grande dimension d’états cachés), plus
le réseau devient capable à se souvenir de motifs plus complexes. Le nombre d’unités définit la
dimension des états cachés (ou sorties) et le nombre de paramètres dans la couche LSTM [78].
41
Chapitre 4 La méthode de prédiction LSTM
4.3 Conclusion
Dans ce chapitre, nous avons présenté une vue globale sur l’un des systèmes et technologies
permettant de concevoir et réaliser notre approche MEAP, qui est la méthode de prédiction
LSTM.
Dans le chapitre suivant, on va présenter les travaux connexes afin de montrer la valeur
ajoutée dans notre approche MEAP.
42
Chapitre 5
Travaux connexes
Contents
5.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2 Travaux Connexes . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.1 Proactive Autoscaling for Cloud-Native Applications using Machine Lear-
ning . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 44
5.2.2 Agnostic Approach for Microservices Autoscaling in Cloud Applications 45
5.2.3 An Improved Kubernetes Scheduling Algorithm For Deep Learning Plat-
form . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 45
5.2.4 An Experimental Evaluation of the Kubernetes Cluster Autoscaler in
the Cloud . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 46
5.2.5 Adaptive scaling of Kubernetes Pods LIBRA . . . . . . . . . . . . . . . 47
5.2.6 Proactive Autoscaling for Edge Computing Systems with Kubernetes . . 47
5.2.7 A lightweight autoscaling mechanism for fog computing in industrial
applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 47
5.2.8 Quantifying Cloud Elasticity with Container-Based Autoscaling . . . . . 48
5.2.9 A study on performance measures for auto-scaling CPU-intensive contai-
nerized applications . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.2.10 Building an open source cloud environment with auto-scaling resources
for executing bioinformatics and biomedical workflows . . . . . . . . . . 48
5.2.11 Autoscaling Pods on an On-Premise Kubernetes Infrastructure QoS-Aware 48
5.3 Analyse Comparative . . . . . . . . . . . . . . . . . . . . . . . . . . . . 48
5.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 49
43
Chapitre 5 Travaux connexes
5.1 Introduction
ans ce chapitre on va présenter une étude bibliographique sur plusieurs travaux connexes
D dans la littérature dans la Section 5.2, et nous terminons par une analyse comparative,
dans la Section 5.3, afin de montrer la valeur ajoutée de notre approche MEAP.
Dans l’un des premiers articles sur le thème de mise à l’échelle automatique et prédictive,
Nicolas Marie-Magdelaine et Toufik Ahmed [56] ont proposé la mise à l’échelle proactive pour les
applications cloud natives utilisant Machine Learning qui est basé sur L’approche architecturale
des microservices qui consiste à développer l’application comme une collection de petits services.
Chacun est indépendant et implémente atomique fonctionnalités. Les demandes de services aux
entreprises sont traitées par plusieurs microservices interagissant les uns avec les autres. Comme
ils sont composants indépendants, des microservices peuvent être déployés, mis à niveau, mis à
l’échelle et redémarré indépendamment, permettant ainsi des versions rapides et fréquentes sur
les applications en direct avec peu ou pas d’impact sur les utilisateurs finaux.
Conteneurisé les microservices offrent plus d’efficacité et de rapidité que le virtuel ceux des
machines. Les conteneurs peuvent être instanciés avec la vitesse et facilité de tout processus de
SE. Plusieurs conteneurs peuvent s’exécutent sur le même SE et bénéficient de l’isolation entre
eux. Cette capacité à mutualiser les ressources et réduire les frais généraux fait des conteneurs le
facteur de forme idéal pour microservices. Les conteneurs offrent également une flexibilité avec
l’API de gestion qui permet une automatisation complète de leur cycle de vie. Des fonctionnalités
telles que des orchestrateurs effectuant des mises à jour continues, la mise à l’échelle automatique
de base et bien d’autres peuvent utiliser l’API.
Les méthodes proposées dans ces travaux présentent des limites qu’ils s’agit principalement :
les applications basées sur des conteneurs et des microservices sont plus volatiles, plus difficiles à
surveiller et présentent les problèmes d’allocation des ressources principalement en terme d’iso-
lement. Par rapport aux applications de microservices basées sur des MV, les applications cloud
natives sont basées sur des conteneurs partageant une infrastructure sous-jacente, gérée de ma-
nière dynamique et basée sur le millage de services, découverte de services, messagerie, etc., qui
44
Chapitre 5 Travaux connexes
Abeer Abdel Khaleq, Ilkyeun Ra [38] adaptent la méthode de mise à l’échelle automatique
Kubernetes basée sur les microservices. On teste l’effet d’autres métriques sur le temps de réponse
des microservices non consommateurs de CPU.
L’évolutivité du conteneur par défaut de K8s est basée sur l’utilisation du processeur des Pods.
Cela fonctionnera bien pour une application consommatrice de CPU. Cependant, les applications
ont des différences besoins en ressources et différentes demandes de qualité de service. Ce travail
présente l’approche agnostique pour adapter le K8s autoscaler basé sur les exigences spécifiques
du microservice, et tester cette approche sur des applications non gourmandes en CPU et micro-
services utilisant différentes métriques telles que la mémoire et nombre de messages non distribués
dans la file d’attente. Ces tests montrent une amélioration du temps de réponse du microservice
par rapport à la mise à l’échelle automatique du processeur par défaut.
Dans cet article [34] SHI HUAXIN, GU XIAOFENG, KUANG PING, HUANG HONGYU pro-
posent une solution multi-tenant pour améliorer l’Algorithme de planification K8s orienté modèle.
Basé sur la stratégie de planification HiveDScheduler qui modélise les utilisateurs comme clusters
virtuels, on mesure la situation de charge du cluster périodiquement, le Pod sur le nœud est pro-
grammé pour effectuer l’équilibrage de charge des clusters. Cette méthode améliore la stabilité
et la disponibilité de la plateforme, et fonctionnent bien dans des scénarios de développement
collaboratif multi-équipes.
HiveDScheduler partant du principe que les utilisateurs de plusieurs équipes utilisent le même
pool de ressources, HiveDScheduler modélise différents utilisateurs dans différents clusters vir-
tuels, et gère les ressources de calcul pour chaque cluster virtuel. Les utilisateurs au sein du cluster
ont le plus haute priorité et peuvent utiliser les ressources allouées à volonté. Lorsqu’un cluster
virtuel a un degré élevé d’inactivité, les utilisateurs en dehors du cluster peuvent également uti-
liser les ressources informatiques du cluster pour travailler, mais leur priorité est moindre. Cette
conception peut répondre aux besoins des utilisateurs de plusieurs équipes de partager le même
pool de ressources tout en améliorant l’utilisation des ressources.
45
Chapitre 5 Travaux connexes
L’expérience montre que cette méthode peut répondre aux besoins des utilisateurs des diffé-
rentes équipes, et détecter la charge du cluster pour assurer l’équilibrage de charge périodique-
ment.
Mulugeta Ayalew Tamiru, Johan Tordsson, Erik Elmroth, Guillaume Pierre [73] présentent le
Cluster Autoscaler (CA) qui ajuste dynamiquement le nombre et la taille des MV sur lesquelles
les conteneurs fonctionnent. Comme les autres composants K8s, CA est hautement configurable.
Dans sa configuration par défaut, CA ajoute ou supprime les nœuds identiques.
Les principaux résultats de leurs expériences approfondient sur les performances de mise à
l’échelle automatique de CA et CA-NAP :
— CA-NAP surpasse CA, car il provisionne nœuds de tailles différentes pour répondre à la
demande du meilleure charge de travail ;
— CA-NAP ne propose pas économie de coûts significative par rapport à CA ;
— La performance de CA-NAP est influencée principalement par la composition de la charge
de travail, plus performante pour charges de travail composées de plusieurs durées courtes
et longues Pods avec diverses demandes de ressources ;
— CA et CA-NAP affichent un surapprovisionnement pire mais meilleure précision de sous-
provisionnement en temps partagé ;
— CA et CA-NAP pourraient offrir des performances encore meilleures si les autres para-
mètres de configuration tels que l’intervalle de mise à l’échelle automatique, le temps de
mise à l’échelle automatique sont réglé correctement.
46
Chapitre 5 Travaux connexes
Les algorithmes de mise à l’échelle automatique deviennent de plus en plus mis en avant dans le
domaine du cloud computing. Dans cet article, l’auteur a proposé un autoscaler adaptatif Libra,
qui détecte automatiquement l’ensemble de ressources optimaux pour un seul Pod, gère ensuite le
processus de la mise à l’échelle automatique horizontale. De plus, si la charge ou l’environnement
virtualisé sous-jacent change, Libra adapte la définition de ressource pour le Pod et ajuste le
processus de mise à l’échelle horizontale en conséquence.
Afin de fournir un mécanisme de mise à l’échelle automatisé dans K8s Balla, Csaba Simon,
Markosz Maliosz [10] proposent Libra, un autoscaler pour les applications s’exécutant sur K8s.
L’idée principale derrière Libra est que les algorithmes de mise à l’échelle automatique tradition-
nels prennent le niveau de mise à l’échelle de l’utilisateur et déclenchent un événement de mise à
l’échelle au cas où la consommation de ressource dépasse ces limites. Cependant, l’attribution de
la bonne mise à l’échelle des niveaux des services n’est pas triviale pour les opérateurs humains.
Habituellement, ces niveaux de mise à l’échelle sont définis après une surveillance de longue durée
de services.
Dans cet article [36], les auteurs ont proposé un autoscaler proactif de Pod multi-métriques et
personnalisable. L’autoscaler est capable de collecter plusieurs métriques, de prévoir les charges
de travail et de mettre à l’échelle les applications cibles à l’avance. De plus, il permet aux
utilisateurs de personnaliser leurs propres politiques de mise à l’échelle et modèles de prédiction
pour mieux s’adapter à leurs applications.
Les auteurs dans [76] ont combiné hyperviseur et virtualisation conteneurisée pour la plate-
forme Fog afin de déployer, gérer et mettre à l’échelle automatiquement les applications indus-
trielles. Les auteurs ont utilisé la logique floue pour construire la méthode de mise à l’échelle
automatique afin de réduire les coûts opérationnels et d’améliorer les performances des applica-
47
Chapitre 5 Travaux connexes
tions. Cependant, la méthode proposée est réactive et basée sur des règles, ce qui ne permet pas
d’assurer des garanties de temps de réponse.
Les auteurs dans [74] ont discuté des différentes mesures de performance pour la mise à
l’échelle automatique des applications basées sur des conteneurs sous la charge de travail intensive
en CPU.
Les auteurs dans [16] ont proposé un cadre pour mettre à l’échelle automatiquement les
applications conteneurisées en surveillant l’utilisation des ressources des conteneurs et gérant la
charge de travail fluctuante.
Les auteurs dans [39] ont proposé une méthode de mise à l’échelle automatique réactive pour
mettre à l’échelle les applications bioinformatique et biomédicales hébergées sur le cloud. La mé-
thode proposée utilise la mise à l’échelle automatique horizontale pour améliorer les performances
de l’application.
Les auteurs dans [71] on présenté une architecture sur site basée sur des conteneurs Kuber-
netes et Docker visant à améliorer la QoS concernant l’utilisation des ressources et les objectifs
de niveau de service SLO. La principale contribution de cette proposition est ses capacités de
mise à l’échelle dynamique pour ajuster les ressources système à la charge de travail actuelle tout
en améliorant la qualité de service.
La Table 5.1 présente une analyse comparative entre notre approche proposée MEAP et les
différentes approches analysés précédemment, en terme de : 1) prédiction (Préd), 2) une méthode
de prédiction efficace telle que LSTM, 3) la modularité (Mod) où le système de la mise à l’échelle
48
Chapitre 5 Travaux connexes
automatique est modulaire et extensible de façon que le module de prédiction est séparé, 4) le
modèle mathématique (Modèle), 5) l’utilisation d’un cluster réel (Cluster), et finalement, 6) la
proposition d’un algorithme.
Table 5.1 – Analyse Comparative entre notre Contribution MEAP et les différents Travaux
Connexes Analysés précédemment
Différent de ces travaux qui présentent plusieurs limites, l’approche MEAP considère tous ces
aspects cités au dessus, comme montre la dernière ligne de la Table 5.1, ce qui montre la valeur
ajoutée de notre contribution.
5.4 Conclusion
Dans ce chapitre, nous avons élaboré une étude bibliographique sur plusieurs approches de
mise à l’échelle automatique proposées dans la littérature. Ensuite, nous avons présenté une
analyse comparative entre ces approches et notre approche MEAP selon plusieurs critères fon-
damentaux. Cette analyse comparative montre la valeur ajoutée de notre approche.
Dans le chapitre suivant, on va présenter l’architecture globale de l’approche MEAP ainsi
que le modèle prédictif LSTM, et nous terminons par un modèle mathématique ainsi qu’une
heuristique.
49
Chapitre 6
L’Approche de Mise à l’Échelle Automatique
et Prédictive (MEAP) - Conception
Contents
6.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 51
6.2 Architecture Globale de MEAP . . . . . . . . . . . . . . . . . . . . . . 51
6.3 Le Modèle Prédictif Choisi . . . . . . . . . . . . . . . . . . . . . . . . . 53
6.4 Formulation Mathématique du Problème Correspondant à MEAP 54
6.5 L’Algorithme de Mise à l’Échelle Automatique et Prédictive MEAP 56
6.6 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 57
50
Chapitre 6 L’Approche de Mise à l’Échelle Automatique et Prédictive (MEAP) - Conception
6.1 Introduction
La figure 6.1, représente l’architecture globale de l’approche MEAP, elle se compose de plu-
sieurs modules, qui sont répartis entre le noeud master et les noeuds workers d’un certain or-
chestrateur.
51
Chapitre 6 L’Approche de Mise à l’Échelle Automatique et Prédictive (MEAP) - Conception
va monitorer l’utilisation de ces ressources et l’enregistre dans une base de données temps
réel déployée dans le système d’orchestration (Ressources Monitorées).
52
Chapitre 6 L’Approche de Mise à l’Échelle Automatique et Prédictive (MEAP) - Conception
Par référence à l’étude qu’on a élaboré dans les chapitres "Vue Globale sur les Différentes
Technologies Utilisées", "État de l’Art", notre choix s’est tombé sur le type "Encodeur-Décodeur"
de la méthode de prédiction LSTM.
53
Chapitre 6 L’Approche de Mise à l’Échelle Automatique et Prédictive (MEAP) - Conception
Il est à noter que, une couche LSTM prend la séquence d’utilisation de CPU avec la dimension
(Taille_Batch, TimeSteps, Features), et comme la sortie de la première couche, qui est h, c, est de
dimension (taille du vecteur h, TimeSteps), il est nécessaire de répéter le vecteur h afin d’assurer
les trois dimensions pour la deuxième couche LSTM.
Ensuite, une deuxième couche LSTM qui prend comme entrée les vecteurs "h, c", prédire les
futures utilisations de CPU, d’où vient le nom "Décodeur". Chaque cellule LSTM donne comme
sortie les vecteurs h ,c. Ensuite, un nouveau réseau de neurones va prendre comme entrée ce
dernier vecteur h, pour interpréter une seule valeur du CPU prédite. En effet, chaque cellule
LSTM est complètement connectée (dense) à un réseau de neurones séparé, son nombre égale à
"TimeSteps".
Il est à noter que, la mise à jour des poids (W, b) des cellules de la couche Encodeur, est
connue sous le nom Back-Propogation Over Time, où chaque cellule a ses propres poids qui
sont différents de ceux des autres cellules, la mise à jour se fait dans la première cellule : E −Cellt
et se propage vers la plus loin (la dernière cellule : E − Cellt−9 ), d’où le nom "Over Time". D’un
autre coté, la mise à jour des poids (W, b) des cellules de la couche Décodeur, se fait en suivant la
méthode Teacher Forcing, qui permet d’utiliser dans l’entrainement les valeurs réelles de CP U
(yt ) pour faire la prédiction, ensuite, les poids (W, b) sont mis à jour au fur et à mesure qu’on
fait la prédiction, contrairement à la couche Encodeur, où on doit attendre la dernière prédiction
dans la séquence.
54
Chapitre 6 L’Approche de Mise à l’Échelle Automatique et Prédictive (MEAP) - Conception
dont :"γ" représente le seuil maximal d’utilisation de CPU (Threshold), en dépassant ce seuil,
le Pod commence à être surchargé.
P
- Lmsi : représente le nombre de fois que l’utilisation du CPU ( CP Umsj i ) arrive ou dépasse
le seuil γ.
- θ : représente le seuil de confiance de prédiction, il correspond au nombre de fois qu’on
prédit l’utilisation du CPU dépasse le seuil γ dans l’intervalle Ts . La mise à l’échelle se déclenche
après qu’on prédit le dépassement du seuil γ, θ fois.
- ScaleTDs : permet de détecter si le nombre de prédiction de dépassement du seuil γ, atteint
le seuil θ. Il prend deux valeurs (1 ou 0),
P
X
ScaleTDs = (CP Umsj i > γ) ≥ θ = {1 sinon 0} (6.2)
Objectif :
|Pj |
P
X
M in(ψ. .CP Umsj i + β.Lmsi ). (6.3)
j=1
Contraintes :
Ts | < ω.
1. Limitations de nombre de replicas : |Rmsi
55
Chapitre 6 L’Approche de Mise à l’Échelle Automatique et Prédictive (MEAP) - Conception
Pour résoudre le modèle mathématique proposé dans la Section 6.4, nous proposons l’Algo-
rithme 1. Cet algorithme fonctionne comme suit : il prend comme entrée le TimeSteps Ts et
l’intervalle I, il va vérifier pour tous les Pods Pj faisant partie d’un microservice msi , comme
P
montré dans la ligne (5), si l’utilisation prédite du CPU du Pods : PJ (CP Umsj i ) dépasse le
threeshold γ, il va incrémenter la variable S, comme montré dans la ligne (6), si le nombre de
fois qu’on prédit le dépassement du threshold γ dépasse le seuil de confiance θ, il va déclencher
56
Chapitre 6 L’Approche de Mise à l’Échelle Automatique et Prédictive (MEAP) - Conception
une mise à l’échelle, comme montré dans les lignes : (9 :11), ainsi comme on doit respecter la
contrainte du limitation du nombre de replicas d’un même microservice, la ligne (11) permet de
limiter ce nombre à ω.
Finalement, le dernier bloque "if " permet de compter le nombre de fois que l’utilisation CPU
P
actuelle CP Umsj i dépasse le threshold γ.
6.6 Conclusion
Dans ce chapitre, nous avons présenté l’architecture globale du système MEAP, ensuite, nous
avons présenté la conception de notre modèle prédictif, permettant de prédire l’utilisation de CPU
selon le type Encodeur-Décodeur de la méthode de prédiction LSTM. Après, nous avons montré
le modèle mathématique correspondant à l’approche proposée MEAP, pour résoudre ce modèle
mathématique, nous avons proposé l’algorithme MEAP.
Dans le chapitre suivant, on va présenter la plateforme de MEAP, ensuite, on va discuter les
différents résultats.
57
Chapitre 7
Tests et Résultats
Contents
7.1 Introduction . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 59
7.2 Plateforme de Mise à l’Échelle Automatique et Prédictive . . . . . . 59
7.2.1 Scénario et Procédure de Mise à l’Échelle Automatique . . . . . . . . . 59
7.2.2 Technologies et Outils Utilisés Pour le Déploiement de MEAP . . . . . . 72
7.2.3 Procédure de Déploiement du Système de Mise à l’Échelle Automatique
et Prédictive . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 73
7.3 Résultats . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 79
7.3.1 La méthode Root Mean Square Error (RMSE) . . . . . . . . . . . . . . 79
7.3.2 Évaluation du Modèle LSTM . . . . . . . . . . . . . . . . . . . . . . . . 79
7.3.3 Évaluation de l’approche de Mise à l’Échelle Automatique et Prédictive
MEAP . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 86
7.4 Conclusion . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . . 88
58
Chapitre 7 Tests et Résultats
7.1 Introduction
ans ce chapitre, nous évaluons l’efficacité de notre approche MEAP. Nous commençons
D par la présentation de la plateforme de mise à l’échelle automatique et prédictive dans
la Section 7.2, dans laquelle nous présentons le Scénario de simulation dans la Section 7.2.1.
Ensuite, la liste des technologies utilisées dans la Section 7.2.2, et la procédure de déploiement
de MEAP dans la Section 7.2.3. Finalement, nous présentons l’évaluation de l’approche MEAP
dans la Section 7.3.
Dans cette section, on va présenter la plateforme montrée dans la figure 7.1, dont, on va
expliquer le rôle de chaque composant ou module, ainsi l’interconnexion entre ces modules.
Afin de montrer l’efficacité et la précision de prédiction de notre modèle LSTM Encodeur-
Décodeur, nous avons simulé manuellement un modèle de données représentant l’utilisation de
CPU. Ensuite, nous avons forcé le CPU du Pod "pas-ss-0" à être chargé en suivant exactement ce
modèle, et comme nous avons conçu l’entraînement contenu du modèle LSTM, le modèle simulé
s’accumule continuellement avec des consommation réels de CPU.
Initialement, le modèle simulé contient des évolutions qui dépassent un certain seuil de
consommation de CPU que nous avons fixé dans notre plateforme à 85%. L’idée c’est de mettre
59
Chapitre 7 Tests et Résultats
à l’échelle "pas-ss-0" proactivement avant que l’utilisation de CPU atteint ce seuil. Également,
nous avons fixé le nombre maximum de replicas, après mise à l’échelle automatique, à 5, et ce
pour n’est pas affecter les ressources des autres microservices.
La figure 7.1 montre une description détaillée du scénario montré ci-dessus, et comme notre
approche MEAP est modulaire, elle se compose de plusieurs modules. Dans ce qui suit, on va
détailler ces modules :
cpu_usage_training_model.csv :
Il correspond à un fichier Comma Separated Values (CSV) contenant le modèle simulé de
l’utilisation de CPU qu’on doit utiliser pour stresser le CPU du Pod : "pas-ss-0".
load_cpu_usage_training_model.py :
C’est un script Python permettant de charger les données depuis le fichier "CSV" :
"cpu_usage_training_model.csv" vers le measurement d’influxdb : "cpu_usage
training_model". Dans ce qui suit, on va expliquer les fonctions composants ce script :
La fonction connect permet de connecter avec le serveur influxdb :
On fait appel à la fonction connect pour se connecter au serveur influxdb, ici, l’adresse IP
10.111.219.45 corresponde à l’adresse du service influxdb du Kubernetes :
60
Chapitre 7 Tests et Résultats
Une fois les données récupérées dans la variable "dataset", ainsi que la connexion avec in-
fluxdb est initialisée, les instructions suivantes servent à insérer ces données dans le measurement
cpu_usage_training_model :
cpu_usage_training_model
Il correspond à un measurement dans influxdb, qui sert à sauvegarder les données du modèle
simulé d’utilisation de CPU.
monitor_cpu.py
Il correspond à un script Python, qui permet de stresser le CPU du Pod "pas-ss-0" par le
modèle enregistré dans cpu_usage_training_model, et ce en utilisant l’outil "stress-ng" déjà
installé au niveau du Pod "pas-ss-0". Ensuite, on collecte la consommation de CPU en utilisant
le module "Metrics-Server" du Kubernetes. Dans ce qui suit, on détaille les fonctions construisant
ce script :
La fonction get_training_data permet de récupérer le modèle d’entraînement depuis le
measurement : cpu_usage_training_model :
def get_training_data():
query = ’select cpu_usage from cpu_usage_training_model order by time asc’
result = client.query(query)
data = []
for point in result.get_points():
data.append(point[’cpu_usage’])
return data
Afin de communiquer entre le module autoscaler.py, qui change l’état de la mise à l’échelle
périodiquement, et le module monitor_cpu.py, nous avons créé un measurement "scalestate" qui
sauvegarde l’état de la mise à l’échelle. Ensuite, on peut récupérer cette état ("True","False")
via la fonction get_state :
61
Chapitre 7 Tests et Résultats
def get_state():
query = ’select scale from scalestate’
result = client.query(query)
for point in result.get_points():
state = point[’scale’]
return eval(str(state))
def update_state(scale=False):
client.query(’drop measurement scalestate’)
timestamp = datetime.now()
json_body = [
{
"measurement": "scalestate",
"tags": {
"host": "pas-ss-0"
},
"time": timestamp.strftime("%Y-%m-%d %H:%M:%S"),
"fields": {
"scale": scale
}
}
]
result = client.write_points(json_body)
return result
Comme on fait le stress, ensuite le monitoring chaque 30s, à chaque valeur monitorée, on
appelle la fonction insert_cpu_usage pour insérer un seul enregistrement dans le measurement
monitored_cpu_usage :
La fonction stress_cpu_monitor permet d’exercer un stresse sur le Pod "pas-ss-0" d’un pour-
centage : "percentage" et pendant une durée : "duration". Ensuite, elle fait le monitoring, en
utilisant le module "Metrics-Server" du Kubernetes, via la commande : "kubectl top Pod |
grep pas-ss-0" :
62
Chapitre 7 Tests et Résultats
def init_all():
proc1 = subprocess.Popen("kubectl scale sts pas-ss –replicas=1", shell=True,
stdout=subprocess.PIPE)
update_state(False)
clear_cpu_usage()
return proc1
Les instructions suivantes font appel à la fonction stress_cpu_monitor qui va stresser et moni-
torer selon le modèle cpu_usage_training_model, après, ils vont sauvegarder la consommation
de CPU dans le measurement monitored_cpu_usage. De plus, ils vont mettre à jour l’état de la
mise à l’échelle :
63
Chapitre 7 Tests et Résultats
i = 0
while True:
state = get_state()
if state:
i = random.randint(0, int(len(data)/1000) - 1) * 100
update_state(False)
print("la valeur de i est: ", i)
print("CPU will be loaded by: ", data[i], " %")
int(data[i]), 30)
cpu_usage = str(int(((stress_cpu_monitor(int(data[i]),
30))*100)/1000))
print("cpu_usage: ", cpu_usage, " %")
"monitored_cpu_usage" dans "influxdb"
timestamp = datetime.now()
insert_cpu_usage(cpu_usage, timestamp)
i = (i + 1) % len(data)
monitored_cpu_usage
Il correspond à un measurement dans influxdb, dans lequel on sauvegarde au fur et à mesure la
consommation monitorée du CPU, et qu’elle sera utilisé, par la suite, par le module autoscaler.
Build_model.py
Il correspond à un script Python, il prend comme entrée la concaténation de la consommation
de CPU actuellement monitorée, depuis le measurement "monitored_cpu_usage", ainsi que le
modèle de simulation de la consommation de CPU initiale. Ensuite, il va répartir ces données
entre données d’entraînement (train) et données de test (test), une fois le modèle est entraîné,
il sera sauvegardé dans un fichier séparé "lstm_model.h5", également, il sera évalué en utilisant
la méthode RMSE. Il est à noter que l’entraînement, la sauvegarde du modèle entraîné et l’éva-
luation de ce modèle se font périodiquement, d’où la notion de continuité de ce module. Dans
ce qui suit, on va détailler les fonctions constituant ce module. Rappelant que le TimeSteps
correspond au nombre de pas qu’on fait dans le passée pour prédire une séquence de même taille
(TimeSteps), l’instruction suivante sert à initialiser ce paramètre à "10" :
La fonction get_training_data permet de récupérer le modèle d’entraînement, elle consiste
à concaténer les données sauvegardé dans le measurement "cpu_usage_training_model" et le
measurement "monitored_cpu_usage" :
def get_training_data():
data = []
query_cpu_usage_training_model = ’select cpu_usage from cpu_usage_training_model order
by time asc’
result_cpu_usage_training_model =
client.query(query_cpu_usage_training_model)
for point in result_cpu_usage_training_model.get_points():
data.append(int(point[’cpu_usage’]))
query_monitored_cpu_usage = ’select cpu_usage from monitored_cpu_usage order by time
asc’
result_monitored_cpu_usage = client.query(query_monitored_cpu_usage)
64
Chapitre 7 Tests et Résultats
def split_dataset(data):
up_to_ts = len(data) % timestep
if up_to_ts = 0:
train, test = data[:-up_to_ts], data[-(100 + up_to_ts):-up_to_ts]
train = array(split(train, len(train)/timestep))
test = array(split(test, len(test)/timestep))
else:
train, test = data, data[-100:]
train = array(split(train, len(train)/timestep))
test = array(split(test, len(test)/timestep))
return train, test
La fonction summarize_scores permet d’afficher le RMSE globale et pour chaque pas de temps :
Comme la taille des données d’entraînement n’est pas suffisante, la fonction split_dataset
permet encore de minimiser cette taille car on regroupe ces données d’entraînement sous des
65
Chapitre 7 Tests et Résultats
vecteurs de taille "TimeSteps", ce qui mène à avoir un modèle d’entraînement pauvre en terme
de taille du modèle. De ce fait, on construit des vecteurs par un décalage d’une position à chaque
fois, par exemple : au lieu d’avoir [1,2,3,4],[5,6,7,8] on construit les données d’entraînement de
la façon suivante : [1,2,3,4],[2,3,4,5],[3,4,5,6], ... etc. Ensuite, on doit répartir ces vecteurs entre
deux groupes "X" correspondant au données réelles et "Y" correspondant au données qu’on doit
prédire de la façon suivante : [1,2,3,4] ∈ "X" et [2,3,4,5] ∈ "Y", ainsi de suite. Cette répartition
corresponde à construire un modèle d’entraînement supervisé : f (X) = Y :
model.add(TimeDistributed(Dense(1)))
model.compile(loss=’mse’, optimizer=’adam’)
model.fit(train_x, train_y, epochs=epochs, batch_size=batch_size,
verbose=verbose)
model.save(’lstm_model.h5’)
return model
66
Chapitre 7 Tests et Résultats
teurs, pour faire la prédiction, on prend juste les 10 dernières valeurs dans input_x: input_x
= data[-n_input:, 0], ensuite, on utilise le modèle entraîné pour faire la prédiction dans le
vecteur "yhat" :
La fonction evaluate_model permet d’évaluer le modèle LSTM, en utilisant test. En fait, test
est un vecteur de 10 vecteurs, et chaque sous vecteur contient 10 valeurs. L’idée de cette fonction
est d’utiliser les 10 dernières valeurs de train c’est à dire, le dernier vecteur dans train pour
prédire les 10 premières valeurs de test c’est à dire le premier vecteur dans test. Ensuite, elle
va rajouter le vecteur prédit dans train via l’instruction : history.append(test[i,:]), pour
avoir un nouveau vecteur d’entraînement : history, ensuite, elle utilise le dernier vecteur dans
history, c’est à dire, le vecteur prédit précédemment pour prédire le deuxième vecteur dans
test, jusqu’à arrivée au vecteur "10" :
67
Chapitre 7 Tests et Résultats
many_to_many.py
Il correspond à un script Python, qui consiste, de manière similaire au module "Build_model",
à entraîner un modèle prédictif LSTM et l’évaluer, la seule différence est que le module
"many_to_many" est utilisé juste pour trouver les meilleurs hyperparamètre tel que le nombre
d’époques (epoch), taille de lot (batch size), la taille du vecteur "h", pour qu’ils soient utilisé
dans le modèle construit "Build_model".
lstm_model.h5
Pour séparer l’entraînement continu du modèle LSTM au module autoscaler, nous avons sauve-
gardé le modèle entraîné dans un fichier séparé, ce dernier sera utilisé par le script "autoscaler.py".
autoscaler.py
Il correspond à un script Python, qui prend comme entrée : 1) La consommation du CPU ac-
tuellement monitorée, à partir du measurement "monitored_cpu_usage", 2) Le modèle LSTM
entraîné et sauvegardé dans le fichier "lstm_model.h5". À partir d’une séquence de consomma-
tion de CPU de taille "TimeSteps", récupéré depuis le measurement "monitored_cpu_usage",
le modèle LSTM sauvegardé prédit une séquence de taille "TimeSteps". Si une valeur dans la
séquence prédite dépasse le seuil 85%, ce module déclenche la mise à l’échelle prédictive, en
communiquant avec le cluster Kubernetes via "Kubectl". Il est à noter que, ce script s’exécute
périodiquement. Dans ce qui suit, on va détailler les fonctions de ce script.
La fonction insert_replicas permet d’insérer le nombre de replicas du microservice "pas-ss-0" :
68
Chapitre 7 Tests et Résultats
La Fonction get_input permet de récupérer les données actuellement monitorées depuis le mea-
surement "monitored_cpu_usage" :
def get_input():
query = ’select cpu_usage from monitored_cpu_usage order by time asc’
result = client.query(query)
data = []
for point in result.get_points():
data.append(int(point[’cpu_usage’]))
return data[-timestep:]
69
Chapitre 7 Tests et Résultats
La fonction forecast permet de prédire une séquence de taille "TimeSteps" dans le vecteur
"yhat", en donnant comme entrée, le vecteur input_x représentant une séquence de taille "Ti-
meSteps" dans cpu_usage :
La Fonction is_scale_out retourne "True" si une des valeurs de la séquence prédites dépasse le
seuil 85% :
def scale(replicas=1):
proc1 = subprocess.Popen("kubectl scale sts pas-ss
–replicas="+str(replicas)+"", shell=True, stdout=subprocess.PIPE)
return proc1
La fonction update_state permet de modifier l’état de la mise à l’échelle, pour qu’elle soit utilisée
par le module "monitor_cpu.py" :
def update_state(scale=False):
client.query(’drop measurement scalestate’)
timestamp = datetime.now()
json_body = [
{
"measurement": "scalestate",
"tags": {
"host": "pas-ss-0"
},
"time": timestamp.strftime(" %Y-%m-%d %H:%M:%S "),
"fields": {
"scale": scale
}
}
]
result = client.write_points(json_body)
return result
70
Chapitre 7 Tests et Résultats
La fonction init_all permet d’initialiser l’état de la mise à l’échelle ainsi que l’ensemble de
measurements : cpu_usage_current , cpu_usage_predicted. Elle est exécutée à chaque fois on
lance le module "autoscaler" :
def init_all():
update_state(False)
client.query(’drop measurement cpu_usage_current’)
client.query(’drop measurement cpu_usage_predicted’)
client.query(’drop measurement replicas’)
timestamp = datetime.now()
insert_replicas(1, timestamp)
init_all()
cpu_threshold = 85
replicas = 1
Les instructions suivantes consistent à : 1) Charger une séquence de taille "TimeSteps" : "X",
pour qu’elle sera l’entrée du modèle LSTM (LSTM(X)=Y), 2) Prédiction de la séquence futur
"Y", 3) Si une valeur de "Y" dépasse le seuil "85%" on fait appel à la fonction "scale" pour mettre
à l’échelle le microservice "pas-ss-0", 4) Charge les deux measurements "cpu_usage_current" et
"cpu_usage_predicted", pour visualiser sur "Grafana" :
while True:
inpt_list = get_input()
if len(inpt_list) = timestep:
n_input = timestep * 1
model = load_model(’lstm_model.h5’)
input_x, yhat = forecast(model, inpt_list, n_input)
print("yhat = LSTM_MODEL[input_x]")
print("les ", timestep," dernières valeurs de cpu_usage input_x
:\n", input_x)
print("les ", timestep," valurs de cpu_usage à prédir yhat
:\n", yhat)
input_x = input_x.reshape(10, 1)
input_x = [x[0] for x in input_x]
input_x = [input_x[len(input_x) - i] for i in range(1,
len(input_x) + 1)]
timestamp = datetime.now()
71
Chapitre 7 Tests et Résultats
insert_input_x(input_x, timestamp)
insert_yhat(yhat, timestamp)
replicas = get_replicas()
if is_scale_out(yhat, cpu_threshold):
replicas = 1 + (replicas % 5)
update_state(True)
insert_replicas(replicas, timestamp)
proc1 = scale(replicas)
time.sleep(2)
proc1.kill()
print("pas-ss has been scaled succesfuly !!!")
else:
insert_replicas(replicas, timestamp)
else:
print("La taille du vecteur: input_x is < ", timestep, " !!!,
yhat = LSTM_MODEL[input_x]")
time.sleep(300)
cpu_usage_current
Il correspond à un measurement dans influxdb, il est utilisé pour visualiser la consommation
actuelle du CPU sur "Grafana".
cpu_usage_predicted
Il correspond à un measurement dans influxdb, il est utilisé pour visualiser la consommation
prédite du CPU sur "Grafana".
Pod : pas-ss-0
Il correspond au microservice sur lequel on applique le mécanisme de la mise à l’échelle auto-
matique.
Pour implémenter et déployer notre solution proposée MEAP, nous avons installé un cluster
Kubernetes version "v1.24.3", ce cluster est composé d’un noeud master et un autre noeud
worker, les deux installés sur deux machines virtuelle, en utilisant l’hyperviseur "VirtualBox", et
"Ubuntu" version "20.04". Le cluster Kubernetes installé utilise comme "Container Runtime" :
Docker. Ainsi, les Pods dans les différents noeuds du cluster, communiquent entre eux via le
plugin réseau "calico".
Comme montre la figure 7.1, nous avons utilisé l’API Kubernetes "kubectl" pour déployer :
1) Le microservice sur lequel on va appliquer la mise à l’échelle automatique "pas-ss-0", 2) L’outil
de visualisation et monitoring "Grafana", 3) Le microservice "build_model" afin t’entraîner le
modèle LSTM d’une manière continue, au fur et à mesure qu’on reçoit de nouvelles données
monitorées. D’un autre coté, nous avons utilisé l’outil "Helm", pour installer la base de données
72
Chapitre 7 Tests et Résultats
série temporelle "influxdb", en effet, l’outil "Helm" permet l’automatisation de l’installation des
applications sur Kubernetes. Également, nous avons utilisé des volumes de stockage persistants
pour : "influxdb, Grafana et build_model" , afin de garder leur configurations. Pour collecter
des statistiques sur l’utilisation du CPU et Mémoire, nous avons activé "Metrics-Server" au sein
de Kubernetes.
Pour le développement des scripts de stresse et monitoring, de mise à l’échelle automatique
et d’entraînement du modèle LSTM, nous avons utilisé le langage de programmation "Python".
De plus, pour construire le modèle de prédiction LSTM, nous avons utilisé les bibliothèques :
"Keras", "TensorFlow" et "Numpy". Il est à noter que, nous avons construit les images pour les
microservices "pas-ss-0" et "Build_model", en utilisant Dockerfile. Le fichier Dockerfile associé à
"pas-ss-0" permet de construire une image avec l’outil "stress-ng", ce dernier permet de stresser le
CPU et le forcer à être chargé par une valeur personnalisée. D’un autre coté, le fichier Dockerfile
associé à "Build_model" permet de construire une image avec toutes les bibliothèques nécessaires
pour entraîner le modèle LSTM, telles que "Keras", "TensorFlow" et "Numpy". Les images
construites à partir de ces deux fichiers Dockerfile, sont uploadé dans le noeud worker, afin qu’elle
soit utilisées, par la suite, par les microservices "pas-ss-0" et "Build_model", respectivement.
Finalement, nous avons utilisé la bibliothèque "matplotlib" pour dessiner les figures des tests et
résultats.
3. Essaye la commande "kubectl top Pods" : pour voir l’utilisation des ressources (CPU,
73
Chapitre 7 Tests et Résultats
Mémoire)
4. Essaye la commande "watch kubectl top Pods" : pour voir l’utilisation des ressources
(CPU, Mémoire) en temps réel
1. Comme le système MEAP va exercer un stress sur le CPU, on doit construire un container,
qui va être exécuté sur un Pod (pas-ss-0), et qui contient le programme "stress-ng"
déjà installé. Pour ça, on a créé un fichier dockerfile contenant les packages nécessaires,
dans le répertoire : "/home/master/pfe/pas/dockerfiles/server"
2. Exécuter la commande : "sudo docker build -t server:pfe .", il va builder une image
"server:pfe" à partir du fichier "dockerfile" existant dans le répertoire courant "."
Installation de HELM :
Comme un déploiement d’une application sur Kubernetes consiste à installer plusieurs com-
posants séparés, HELM permet, via une seule commande d’installer une application, ce qui est
par exemple l’équivalent de "apt-get" sur Linux.
_ Pour installer Helm, nous référons à : "https://helm.sh/fr/docs/intro/install/"
Déploiement de influxdb :
74
Chapitre 7 Tests et Résultats
Déploiement de Grafana :
75
Chapitre 7 Tests et Résultats
influxdb CLI :
1. Pour récupérer le nom de influxdb Pod, exécuter la commande : "kubectl get all"
76
Chapitre 7 Tests et Résultats
6. Notes bien que le container qui va être crée à partir de cette image, il va lancer le script
build_model.py comme point d’entrer. Ce script génère le modèle : "lstm_model.h5"
dans un volume, qui va être crée par la suite dans la machine worker "/mnt/bm". Ensuite,
il envoie automatiquement "lstm_model.h5" au répertoire : "/home/master/pfe/pas"
dans la machine "master"
Vérification de la plateforme :
Avant de lancer le système "MEAP", les 4 Pods (bm-ss-0, grafana-xxx, influxdb-0, pas-ss-0)
doivent avoir l’état : "running" :
77
Chapitre 7 Tests et Résultats
Lancement de Grafana :
78
Chapitre 7 Tests et Résultats
1. Ajouter une source de données vers la base de données influxdb : "pas" : "10.111.219.45"
5. Le Dashboard va afficher dans une figure, l’utilisation actuelle et prédictive, qui sont dans
les 2 measurements "cpu_usage_current", "cpu_usage_predicted" dans "influxdb", et
qui sont remplis au fur et à mesure en exécutant le script "autoscaler.py"
7.3 Résultats
r
1 n yˆi − yi 2
RM SE = Σ (7.1)
n i=1 n
Dans cette section, on va commence par évaluer le modèle LSTM Encodeur-Décodeur qu’on
a implémenté pour prédire l’utilisation de CPU. Pour réaliser ça, on va recourir à la méthode
d’estimation de la précision de la prédiction RMSE. Nous rappelons que, dans notre travail, nous
avons considéré le RMSE par période ou TimeSteps dans lequel on calcule la précision de la
prédiction période par période, d’un autre coté le RMSE globale consiste à calculer la précision
de la prédiction entre une séquence actuelle et prédite à la fois.
Une fois le modèle prédictif LSTM sera évalué, on va présenter quelques résultats d’évaluation
de l’approche MEAP, en montrant la minimisation de consommation de CPU.
79
Chapitre 7 Tests et Résultats
petite valeur du "RMSE". Sachant que jusqu’ici nous avons choisi les valeurs d’époque d’entraî-
nement et de la taille du vecteur "h" d’une manière spéculative [epoch = 20,la taille du vecteur
"h" = 200].
La figure 7.3, représente l’évolution de RMSE par période en utilisant le batch size "32"
correspondant au meilleur RMSE trouvé ci-dessus. On remarque que la précision de prédiction
s’améliore pour les cellules LSTM les plus loin, contrairement à celles les plus proches, ce qui
signifie que la partie long terme du LSTM performe mieux que la partie short terme.
80
Chapitre 7 Tests et Résultats
Comme montre cette figure, les valeurs d’époque très petites ne donnent pas de bonnes
prédictions car le RMSE associé est très élevée, on remarque aussi que la meilleure valeur de la
taille d’époque parmi les valeurs que nous avons essayées est "24", car elle correspond à la plus
petite valeur du "RMSE".
Sachant que jusqu’ici, nous avons choisi la valeur de la taille du vecteur "h" de manière spé-
81
Chapitre 7 Tests et Résultats
La figure 7.5, représente l’évolution de RMSE par période en utilisant le batch size "32" et
l’époque "24" correspondants au meilleurs RMSE trouvés ci-dessus. On remarque, similairement
au résultat précédant, que la précision de prédiction s’améliore pour les cellules LSTM les plus
loin, contrairement à celles les plus proches, ce qui signifie que la partie long terme du LSTM
performe mieux que la partie short terme.
Figure 7.6 – RMSE Globale pour Chaque Valeur de Batch Size avec le Meilleur Nombre
d’époques Trouvé
82
Chapitre 7 Tests et Résultats
83
Chapitre 7 Tests et Résultats
Figure 7.10 – RMSE Globale pour Chaque Taille de la Fenêtre de Prédiction (TimeSteps)
84
Chapitre 7 Tests et Résultats
Comme notre modèle a pour but de prendre une séquence de consommation de CPU et
prédire la prochaine séquence, la figure 7.10 représente la précision de prédiction RMSE en
changeant la taille de la séquence à prédire (TimeSteps), et en utilisant les paramètres trouvés
dans les résultats précédents (batch_size = 16, epoch = 24, vecteur h = 180). On remarque
similairement au résultat trouvé dans la figure 7.9, la précision de prédiction se dégrade pour les
cellule long terme. De ce fait, la valeur de TimeSteps associé au meilleur RMSE, corresponde à
"9". Cela est expliqué par le choix de la taille du vecteur "h" : "180", qui a impacté le choix de
la taille de la séquence de prédiction "TimeSteps".
Figure 7.11 – RMSE par TimeSteps avec la Meilleur Taille de la Fenêtre de Prédiction
La figure 7.11 représente l’évolution de RMSE par période en utilisant le batch size "16" et
l’époque "24" et la taille du vecteur "h" : "180" et TimeSteps :"9" correspondants au meilleurs
RMSE correspondant à la figure 7.10. On remarque, contrairement à tous les résultats précédents,
que la précision de prédiction est plus ou moins stable, ce qui signifie que les deux parties du
LSTM : long et short performent bien.
85
Chapitre 7 Tests et Résultats
Figure 7.12 – RMSE Globale en Changeant la Valeur du taux d’apprentissage (Learning Rate
α)
86
Chapitre 7 Tests et Résultats
précédent nous avons trouvé le meilleur TimeSteps = "9", cependant, le TimeSteps = "10" donne
aussi des résultats proches de ceux où TimeSteps = "9", de ce fait nous considérons le TimeSteps
= "10".
On peut bien remarquer, à partir de la figure 7.13, que l’activation de la prédiction dans la
ligne verte, améliore beaucoup la consommation de CPU, en comparant avec celle où la prédiction
est désactivée. De plus, on peut remarquer que la consommation de CPU en activant la prédiction
n’atteint jamais le seuil fixé "85%".
La figure 7.14 montre la philosophie derrière notre approche proposée MEAP, dans laquelle on
démontre l’évolution de la consommation de CPU ainsi que le nombre de réplicas du microservice
"pas-ss-0". On peut bien remarquer que MEAP proactivement met à l’échelle le microservices
"pas-ss-0", ce qui mène à minimiser la consommation du CPU, où l’utilisation du CPU n’atteint
jamais le seuil de "85%".
87
Chapitre 7 Tests et Résultats
Figure 7.15 – Maximum consommation de CPU en variant la valeur du seuil de mise à l’échelle
qu’on doit tester, ce qui motive à laisser cette question ouverte pour qu’elle soit traitée comme
perspective.
7.4 Conclusion
Dans ce chapitre, nous avons évalué notre approche proposée MEAP. Nous avons commencé
par une présentation de la plateforme de test, en expliquant le rôle de chaque module ainsi que son
fonctionnement d’une manière technique. Ensuite, nous avons présenté les technologies et outils
utilisés pour implémenter et déployer l’approche MEAP, ainsi qu’une procédure de déploiement
de la plateforme de test. Après, nous avons présenté des résultats sur : 1) l’évaluation du modèle
de prédiction LSTM, et 2) l’évaluation de l’approche MEAP. Les résultats trouvés montrent
l’efficacité de MEAP à améliorer l’utilisation des ressources (CPU).
Dans le chapitre suivant, on va conclure ce travail et on donne quelques perspectives pour les
travaux futurs.
88
Chapitre 8
Conclusion Générale et Perspectives
89
Chapitre 8 Conclusion Générale et Perspectives
90
Bibliographie
[2] Muhammad Abdullah et al. “Burst-aware predictive autoscaling for containerized micro-
services”. In : IEEE Transactions on Services Computing (2020).
[3] Muhammad Abdullah et al. “Learning predictive autoscaling policies for cloud-hosted
microservices using trace-driven modeling”. In : 2019 IEEE International Conference on
Cloud Computing Technology and Science (CloudCom). IEEE. 2019, p. 119-126.
[4] Muhammad Abdullah et al. “Predictive autoscaling of microservices hosted in fog mi-
crodata center”. In : IEEE Systems Journal 15.1 (2020), p. 1275-1286.
[10] David Balla, Csaba Simon et Markosz Maliosz. “Adaptive scaling of Kubernetes pod-
s”. In : NOMS 2020-2020 IEEE/IFIP Network Operations and Management Symposium.
IEEE. 2020, p. 1-5.
91
Chapitre 8 Bibliographie
[15] C’est quoi Docker. [Online]. (consulté le 05/08/2022). url : https : / / www . disko . fr /
reflexions/technique/introduction-docker/.
[17] Cluster k8S. [Online]. (consulté le 18/08/2022). url : https : / / www . redhat . com / fr /
topics/containers/what-is-a-kubernetes-cluster.
[20] Demon Docker. [Online]. (consulté le 15/08/2022). url : https : / / www . ionos . fr /
digitalguide/serveur/configuration/tutoriel-docker-installation-et-premiers-
pas/.
[23] Différents types de réseaux de neurones dans le Deep Learning. [Online]. (consulté le 03/09/2022).
url : https : / / www . analyticsvidhya . com / blog / 2020 / 02 / cnn - vs - rnn - vs - mlp -
analyzing-3-types-of-neural-networks-in-deep-learning/.
92
Chapitre 8 Bibliographie
[34] Shi Huaxin et al. “An improved kubernetes scheduling algorithm for deep learning plat-
form”. In : 2020 17th International Computer Conference on Wavelet Active Media Tech-
nology and Information Processing (ICCWAMTIP). IEEE. 2020, p. 113-116.
[36] Li Ju, Prashant Singh et Salman Toor. “Proactive autoscaling for edge computing sys-
tems with kubernetes”. In : Proceedings of the 14th IEEE/ACM International Conference
on Utility and Cloud Computing Companion. 2021, p. 1-8.
93
Chapitre 8 Bibliographie
[38] Abeer Abdel Khaleq et Ilkyeun Ra. “Agnostic approach for microservices autoscaling
in cloud applications”. In : 2019 International Conference on Computational Science and
Computational Intelligence (CSCI). IEEE. 2019, p. 1411-1415.
[39] Michael T. Krieger et al. “Building an open source cloud environment with auto-scaling
resources for executing bioinformatics and biomedical workflows”. In : Future Generation
Computer Systems 67 (2017), p. 329-340. issn : 0167-739X. doi : https : / / doi . org /
10.1016/j.future.2016.02.008. url : https://www.sciencedirect.com/science/
article/pii/S0167739X16300218.
[42] Kubernetes. [Online]. (consulté le 18/08/2022). url : https : / / www . redhat . com / fr /
topics/containers/learning-kubernetes-tutorial#pr%5C%C3%5C%A9sentation.
[43] L’autoscaling. [Online]. (consulté le 25/08/2022). url : https : / / www . densify . com /
kubernetes-autoscaling.
[44] La taille du vecteur "h". [Online]. (consulté le 23/09/2022). url : https : / / medium .
com/deep-learning-with-keras/lstm-understanding-the-number-of-parameters-
c4e087575756.
[48] LSTM architecture. [Online]. (consulté le 07/09/2022). url : https : / / medium . com /
smileinnovation/lstm-intelligence-artificielle-9d302c723eda.
94
Chapitre 8 Bibliographie
[50] LSTM Encoder Decoder. [Online]. (consulté le 20/09/2022). url : https : / / pradeep -
dhote9.medium.com/seq2seq-encoder-decoder-lstm-model-1a1c9a43bbac.
[51] Lstm fonctionnement. [Online]. (consulté le 04/09/2022). url : https : / / blog . octo .
com/les- reseaux- de- neurones- recurrents- des- rnn- simples- aux- lstm/?fbclid=
IwAR2a5nwZGXSaloH0_GfV_pDWWoO0lWVfluHGeVxJAchEIVXDVlo-gCBH2ro.
[60] Noeud cluster. [Online]. (consulté le 21/08/2022). url : https : / / www . redhat . com /
fr/topics/containers/kubernetes- architecture#que- se- passe- t- il- dans- un-
n%5C%C5%5C%93ud%5C%C2%5C%A0.
95
Chapitre 8 Bibliographie
[64] Vladimir Podolskiy et al. “Forecasting models for self-adaptive cloud applications : A
comparative study”. In : 2018 ieee 12th international conference on self-adaptive and self-
organizing systems (saso). IEEE. 2018, p. 40-49.
[65] Problème de dépendance à long terme. [Online]. (consulté le 05/09/2022). url : https:
//datapeaker.com/big- data/multicolinealidad- detectando- multicolinealidad-
con-vif/.
[66] Babak Bashari Rad, Harrison John Bhatti et Mohammad Ahmadi. “An introduction to
docker and analysis of its performance”. In : International Journal of Computer Science
and Network Security (IJCSNS) 17.3 (2017), p. 228.
[71] Lluís Mas Ruíz et al. “Autoscaling Pods on an On-Premise Kubernetes Infrastructure QoS-
Aware”. In : IEEE Access 10 (2022), p. 33083-33094. doi : 10.1109/ACCESS.2022.3158743.
[73] Mulugeta Ayalew Tamiru et al. “An Experimental Evaluation of the Kubernetes Cluster
Autoscaler in the Cloud”. In : 2020 IEEE International Conference on Cloud Computing
Technology and Science (CloudCom). IEEE. 2020, p. 17-24.
[74] Xuxin Tang et al. “Quantifying Cloud Elasticity with Container-Based Autoscaling”. In :
2017 IEEE 15th Intl Conf on Dependable, Autonomic and Secure Computing, 15th Intl Conf
on Pervasive Intelligence and Computing, 3rd Intl Conf on Big Data Intelligence and Com-
puting and Cyber Science and Technology Congress(DASC/PiCom/DataCom/CyberSciTech).
2017, p. 853-860. doi : 10.1109/DASC-PICom-DataCom-CyberSciTec.2017.143.
96
Chapitre 8 Bibliographie
[76] Fan-Hsun Tseng et al. “A Lightweight Autoscaling Mechanism for Fog Computing in
Industrial Applications”. In : IEEE Transactions on Industrial Informatics 14.10 (2018),
p. 4529-4537. doi : 10.1109/TII.2018.2799230.
[79] Soumia Zertal. Cours cloud virtualisation. Jan. 2020. doi : 10.13140/RG.2.2.35943.
60321.
97
Annexe A
Construction des Images : "pas-ss-0" et
"build_model"
A.1 Introduction
n montre dans cette annexe, les contenus des deux fichiers "Dockerfile", utilisés pour
O construire les deux images : "pas-ss-0" dans la Section A.2 et "build_model" dans la
Section A.3.
from ubuntu:latest
98
Annexe A Construction des Images : "pas-ss-0" et "build_model"
FROM python:3.6-slim
python3-dev
build-essential
iputils-ping
net-tools
vim
WORKDIR /lstm
COPY requirements.txt /lstm/requirements.txt
RUN pip3 install -r requirements.txt –src /usr/local/src
CMD [ "python3", "-u", "buildm odel.py”]
CM D[”/bin/bash”, ” − ce”, ”tail − f /dev/null”]
Le Fichier "requirements.txt" :
numpy
pandas
sklearn
tensorflow
keras
influxdb
paramiko
99
Annexe B
Les Fonctions d’Activation Utilisées par
LSTM
B.1 Introduction
n montre dans cette annexe, les deux fonctions d’activation utilisées par LSTM. Nous
O commençons par la fonction "Sigmoid" dans la Section B.2, ensuite, la fonction "Tanh"
dans la Section B.3.
100
B.3 La Fonction d’activation tangente hyperbolique (Tanh)
C’est une fonction d’activation courante dans l’apprentissage en profondeur. Elle est calculé
comme suit :
ex −e−x 1−e−2x 2
T anh(x) = ex +e−x
= 1+e−2x
= 1+e−2×x
− 1 = 2 × Sigmoid(2 × x) − 1.
La fonction tanh est une version décalée et étirée de la sigmoïde. La figure B.2 montre le tracé
de la fonction tanh lorsque l’entrée est dans la plage [-10, 10], [31] :