diff --git a/dot/struct.dot b/dot/struct.dot new file mode 100644 index 0000000..a9ec30c --- /dev/null +++ b/dot/struct.dot @@ -0,0 +1,25 @@ +digraph struc{ + rankdir = LR + node[shape=Mrecord] + root[label = "Root - dict\{\} | charge | mesure"] + charge[label = "list[float]"] + dmesure[label="list[]"] + mesure[label = "dict\{\}|rtos | rtts | n_tokens | n_envoies | n_echec"] + rtos[label = "list[float]"] + rtts[label = "list[]"] + n_tokens[label = "list[float]"] + n_envoies[label = "list[float]"] + n_echec[label = "list[float]"] + + rtt[label = "list[float]"] + + + root: -> charge: + root: -> dmesure + dmesure -> mesure: + mesure:->rtos + mesure:->rtts->rtt + mesure:->n_tokens + mesure:->n_envoies + mesure:->n_echec +} \ No newline at end of file diff --git a/ensps.sty b/ensps.sty index 75b7491..493915d 100644 --- a/ensps.sty +++ b/ensps.sty @@ -86,7 +86,7 @@ \sisetup{locale = FR} % Pour avoir les bonnes conventions typographiques des unités % ------------- Une biliographie ------------- -\bibliographystyle{plain-fr} % Biblio en français +\bibliographystyle{alpha-fr} % Biblio en français % ------------- Les options du paquet ------------- @@ -118,6 +118,7 @@ \DeclareCaptionFont{CaptionENS}{\color{ENSRougeBrique}} \captionsetup[table]{labelfont={CaptionENS,bf}} \captionsetup[figure]{labelfont={CaptionENS,bf}} +\captionsetup[listing]{labelfont={CaptionENS,bf}} \captionsetup[subfigure]{labelfont=bf,textfont=sf} diff --git a/makefile b/makefile index 6c9ba4c..610c4fe 100644 --- a/makefile +++ b/makefile @@ -1,8 +1,16 @@ FIGURES_SVG=$(wildcard raw_img/*.svg) FIGURES_PDF=$(subst raw_img/,pdf_img/,$(FIGURES_SVG:.svg=.pdf_tex)) -all : rapport.tex rapport.bib $(FIGURES_PDF) $(UML_PNG) png_img/gain_action.png - plantuml -checkmetadata puml +DOT_DOT=$(wildcard dot/*.dot) +DOT_PNG=$(DOT_DOT:.dot=.png) + +UML_PUML=$(wildcard puml/*.puml) +UML_PNG=$(UML_PUML:.puml=.png) + +all : rapport.pdf + echo "done\a" + +rapport.pdf : rapport.tex rapport.bib $(FIGURES_PDF) $(UML_PNG) png_img/gain_action.png $(DOT_PNG) lualatex -shell-escape rapport.tex bibtex rapport makeglossaries rapport @@ -16,6 +24,8 @@ clean : clean-latex rm -f -r pdf_img/ rm -f -r puml/*.svg rm -f -r puml/*.png + rm -f -r dot/*.png + rm -f rapport.pdf clean-latex : rm -f rapport.aux @@ -23,17 +33,24 @@ clean-latex : rm -f rapport.blg rm -f rapport.out rm -f rapport.log - rm -f rapport.pdf rm -f rapport.toc rm -f rapport.lof rm -f rapport.lot + rm -f rapport.lol rm -f rapport.ist rm -f rapport.glg rm -f rapport.gls rm -f rapport.glo + rm -f texput.log pdf_img/%.pdf : raw_img/%.svg pdf_img/%.pdf_tex inkscape -D -z --file=$< --export-pdf=$@ --export-latex pdf_img/%.pdf_tex : raw_img/%.svg - inkscape -D -z --file=$< --export-pdf=$@ --export-latex \ No newline at end of file + inkscape -D -z --file=$< --export-pdf=$@ --export-latex + +puml/%.png : puml/%.puml + plantuml $< + +dot/%.png : dot/%.dot + dot -Tpng -o $@ $< \ No newline at end of file diff --git a/png_img/charge-rtts.png b/png_img/charge-rtts.png new file mode 100644 index 0000000..6e81ec5 Binary files /dev/null and b/png_img/charge-rtts.png differ diff --git a/png_img/cropped-L2S.png b/png_img/cropped-L2S.png new file mode 100644 index 0000000..6ea0e17 Binary files /dev/null and b/png_img/cropped-L2S.png differ diff --git a/png_img/distri_rtt_distant.png b/png_img/distri_rtt_distant.png new file mode 100644 index 0000000..13bfd41 Binary files /dev/null and b/png_img/distri_rtt_distant.png differ diff --git a/png_img/distri_rtt_local.png b/png_img/distri_rtt_local.png new file mode 100644 index 0000000..829d0f7 Binary files /dev/null and b/png_img/distri_rtt_local.png differ diff --git a/png_img/gain_action.png b/png_img/gain_action.png new file mode 100644 index 0000000..4fd68b5 Binary files /dev/null and b/png_img/gain_action.png differ diff --git a/png_img/n_client_saturation.png b/png_img/n_client_saturation.png new file mode 100644 index 0000000..e028d7e Binary files /dev/null and b/png_img/n_client_saturation.png differ diff --git a/png_img/varrtt_demo.png b/png_img/varrtt_demo.png new file mode 100644 index 0000000..4b0d778 Binary files /dev/null and b/png_img/varrtt_demo.png differ diff --git a/puml/edt.puml b/puml/edt.puml new file mode 100644 index 0000000..09aac92 --- /dev/null +++ b/puml/edt.puml @@ -0,0 +1,9 @@ +@startgantt + +language fr +Project starts 2021-01-01 +[Prototype design end] as [TASK1] lasts 19 days +[TASK1] is colored in Lavender/LightBlue +[Testing] lasts 14 days +[TASK1]->[Testing] +@endgantt \ No newline at end of file diff --git a/rapport.tex b/rapport.tex index 12b8eaf..598960f 100644 --- a/rapport.tex +++ b/rapport.tex @@ -6,10 +6,10 @@ \usepackage{ensps} \hypersetup{ - pdftitle={Titre}, + pdftitle={Rapport de stage, Léopold Clément}, pdfauthor={Léopold Clément}, - pdfsubject={Sujet}, - pdfproducer={Conversion PDF}, + pdfsubject={Schémas de contrôle de congestion intelligents pour les réseaux IoT par apprentissage profond}, + pdfproducer={LuaLaTex}, pdfkeywords={Quelques mots-clés} % } @@ -167,7 +167,7 @@ \newcommand{\cubic}{TCP-Cubic} \newcommand{\newreno}{TCP-NewReno} \newcommand{\cpp}{C++} - +\newcommand{\lss}{\emph{L2S}} \newglossaryentry{rtt} { name=RTT, @@ -201,7 +201,7 @@ % Titre \rule{\linewidth}{0.5mm} \\[0.4cm] - { \huge \bfseries Titre du rapport éventuellement en plusieurs lignes. \\[0.4cm] } + { \huge \bfseries Schémas de contrôle de congestion intelligents pour les réseaux IoT par apprentissage profond \\[0.4cm] } \rule{\linewidth}{0.5mm} \\[1.5cm] % Auteur(es) et encadrant(es) @@ -215,8 +215,8 @@ \begin{minipage}{0.4\textwidth} \begin{flushright} \large \emph{Encadrants :} \\ - M\up{me} Lynda \textsc{Zitoune}\\ - M\up{me} Véronique \textsc{Vèque} + M\up{me} Lynda \textsc{Zitoune}, professeur des universités\\ + M\up{me} Véronique \textsc{Vèque}, maitresse de conferences \end{flushright} \end{minipage} @@ -232,6 +232,17 @@ % Table des matières % -------------------------------------------------------------- +\thispagestyle{empty} +\hspace{0pt} +\vfill +\begin{center} + \section*{Remerciement} + Je remercie Lynda +\end{center} +\vfill +\hspace{0pt} +\pagebreak + \thispagestyle{empty} \tableofcontents \pagebreak @@ -241,9 +252,31 @@ % -------------------------------------------------------------- \printglossary[title=Glossaire, toctitle=Glossaire] +\pagebreak + \section{Introduction} -\subsection{Présentation de l'environnement de travail} +\begin{wrapfigure}{r}{0.30\textwidth} %this figure will be at the right + \centering + \includegraphics[width=0.30\textwidth]{png_img/cropped-L2S.png} +\end{wrapfigure} + +Le laboratoire des signaux et système (\lss{}) est une unité mixe de recherche entre le \emph{CNRS}, l'université PAris-Saclay et l'école CentralSupélec. +Les thématique du laboratoire sont l'automatique, les traitements du signal et les télécomunication. +En particulier, le pôle télécom et réseau se penche sur des problèmatique de tout niveaux autour des réseaux informatique, que ce soit de l'allcoation de ressource, du routage, de a compressionde donnée\dots +Ces recherches s'appuis sur un vaste socle de méthode, que ce soit la théorie des jeux, du control, des graphes, de l'optimisation ou de l'apprentissage machine. +L'équite Réseaux, Optimisation Conjointe et codage de Source (ROCS) travail sur deux thématique, l'\iot{} et les services vidéo, c'est à dire l'exploitation optimal d'une conexion limité. +C'est dans cette équipe que j'ai réalisé mon stage. + +La problématique étudier est de déterminer comment intégré un processus d'apprentissage dans la gestion de la congestion des réseaux \iot{}. +En particulier, nous nous concentrons sur le protocole \coap{}. +Nos objectifs sont \begin{itemize} + \item nous familiariser avec les notions étudier et le protocole \coap{}, + \item déterminer quelle métrique utilisé pour suivre l'état du réseau, + \item détermination des sénarios pertients + \item simulation ou test de ces sénarios +\end {itemize} +Le stage se déroule entrièrement en distancielle, avec des réunions hébdomadaire avec mes encadrantes soit en présentielle dans les locaux de CentralSupélec, soit sur Teams. \subsection{Qu'est-ce qu'un réseau \iot{} ?} @@ -376,7 +409,7 @@ Le but de l'acteur est de maximiser la récompense totale qu'il va recevoir au c Pour cela, l'acteur doit créer une fonction $\pi : \mathbb{S} \rightarrow \mathbb{A}$ permettant de donner l'action optimale à réaliser pour chaque état. La solution optimal est définie comme l'action permetant de maximiser le retour global : \begin{equation} - R = sum_{i = 1} ^\infty r _ i \gamma ^ i + R = \sum_{i = 1} ^\infty r _ i \gamma ^ i \label{eq:rl:R} \end{equation} @@ -708,7 +741,7 @@ Ainsi on peut entrainer le simulateur avec la topologie du réseau que l'on veux Malheureusment, c'est un simulateur complexe à utilisé : tout les scripts de simulation sont écrit en \cpp{}. Par manque de temps et de compétence, les simulations sur \ns{} n'ont pas pu etre réalisé, mais cela reste une piste à étudier pour le pré-entrainement. -\subsubsection{Par création artificiel de transition} +\subsubsection{Par création artificiel de transition\label{part:yaml}} Une autre méthode possible est de créer des transitions artificiellement. Pour cela, l'algorithme commence par fixer une charge sur le réseau $f$, c'est à dire la fréquence à laquelle chaque client intéroge le capteur associé. @@ -861,19 +894,117 @@ La maquette physique que nous utilisont est constitué de deux machines : \begin Les deux machines sont connectée par un réseau WiFi $2.5 GHz$ géré par le PC. La connexion est bien trop bonne pour pouvoir etre saturée par un système CoAP classique seul, d'où l'utilisation de plusieurs maquette numérique en même temps sur le modèle physique. +\subsection{Sénario d'interet} +Les sénarios d'interet sont : \begin{itemize} + \item un réseau peu congestioner, + \item un réseau congestioner, + \item la transition de l'un à l'autre. +\end{itemize} +Mais il faut prendre en compte que on peu mettre des charges diffeente sur chaque capteur. +Ainsi on peu avoir peu de requettes sur tout les capteurs sauf un qui en a beaucoup plus. +La charge sur le réseau est définie par la fréquence à laquelle chaque client émet des requettes. \section{Expérience et résultats} +Pour commencer, on fait quelque test en local, c'est à dire que le serveur \coap{} se trouve sur la même machine que le client. +On obtient les resultats de la figure \ref{fig:res:rtt_local}. +On constate que même en local, certain messages sont acquitté avec du retard. +Certain on un \rtt{} deux fois plus grand que la moyenne. +On peut aussi observer que $RTT_S$ a bien plus de varriation brusque que $RTT_L$. -\subsection{Montage simple} +\begin{figure}[htp] + \centering + \includegraphics[width=0.7 \textwidth]{png_img/distri_rtt_local.png} + \caption[Distribution du \rtt{} et évolution de $RTT_L$ et $RTT_S$ avec un seul client en local.]{Distribution du \rtt{} et évolution de $RTT_L$ et $RTT_S$ pendant un envoie de message sans délai entre la réception d'un messagee et l'envoie du suivant, avec un seul client en local.} + \label{fig:res:rtt_local} +\end{figure} -\subsection{Multiplication des clients} +\subsection{Etude de la maquette} +On commence par essayer de mesurer les limites du système. +Sur la figure \ref{fig:res:evo_grandeur}, on regarde les grandeurs que l'on va donner à l'agent en fonction du nombre de requette simultané que doit traiter le serveur. +On utilise le \CCA{} de \coap{} de base. +Pour généré $n$ requette, on prend $n$ client qui envoient une nouvelle requettes à la reception de l'ancienne requette. +On constate que les grandeurs semblent toutes bruité de manière non-négligéable. +On constate aussi que le taux de retransmission semble suivre un palier. +Le rapport $\eta$ semble plus sensible, et suit une courbe continu, presque une exponentielle décroissante. +Cela indique que tres rapidement le temps passé dans les queues est bien plus important que le temps de propagation. +$VARRTT$ par contre n'est pas pertinante à regarder ici, car elle mesure l'évolution du système. +Pourtant, le niveau de congestion semble avoir un impacte sur la grandeur que nous se savons pas expliquer. +En regardant la charge de calcul sur le \rasp{}, on constate que la limite créant la congestion n'est pas la saturation de la connexion WiFi entre les deux machines, mais la puissance de calcule du \rasp{} qui n'arrive pas à traiter les requettes. -\subsection{Multiplication des \rasp{}} +On peut aussi reproduire \ref{fig:res:rtt_local} mais en utilisant un seveur sur la \rasp{}. +Sur la figure \ref{fig:res:rtt_distant}, on vois que la distribution des \rtt{} est similaire, mais que certaine mesure sont tres éloigné de la moyenne. +Si on tentais de réduire le \rto{}, ces messages serais retransmie, alors que ils ne sont pas réelement perdus. + +\begin{figure}[htp] + \centering + \includegraphics[width=0.7\textwidth]{png_img/n_client_saturation.png} + \caption[Evolutions des grandeurs mesurer en fonction du nombre de requette simultané]{Evolution des grandeurs mesurer en fonction du nombre de requette simultané traiter par le serveur \coap{} tournant sur une \rasp{}. Le \CCA{} de \coap{} de base est utilisé.} + \label{fig:res:evo_grandeur} +\end{figure} + +\begin{figure}[htp] + \centering + \includegraphics[width=0.7 \textwidth]{png_img/distri_rtt_distant.png} + \caption[Distribution du \rtt{} et évolution de $RTT_L$ et $RTT_S$ avec un seul client.]{Distribution du \rtt{} et évolution de $RTT_L$ et $RTT_S$ pendant un envoie de message sans délai entre la réception d'un messagee et l'envoie du suivant, avec un seul client et un serveur sur le \rasp{}. Même si on ne les distingue pas sur l'histogramme, il y a quelque valeur de \rtt{} très élevées.} + \label{fig:res:rtt_distant} +\end{figure} + +\begin{figure}[htp] +\centering +\includegraphics[width=0.7 \textwidth]{png_img/varrtt_demo.png} +\caption[Evolution de $VARRTT$ lors d'un changement de charge du réseau.]{Evolution de $VARRTT$ lors d'un changement de charge du réseau au moment du $500$-ième message.} +\label{fig:res:varrtt} +\end{figure} + +On peut aussi faire un essaie pour voir le profil de $VARRTT$ en cas de changement de charge sur le réseaux. +On place dabbort un unique client sur le réseau, et on regarde l'évolution de $VARRTT$. +Au $500$-ieme message, on active $20$ autre client qui vont eux aussi envoyer des requettes au serveur. +Dans la figure \ref{fig:res:varrtt}, on constate que il y a bien un pic au moment de l'augmentation de la charge du système, mais il y a aussi des pics dû au bruit dans la mesure du \rtt{}. + +\subsection{Test d'apprentissage} + +Les testes de pré-apprentissage ont était réalisé avec : \begin{itemize} + \item des réseaux de $25$ capteur, ce qui est un ordre de grandeur du nombre de capteur dans le type de réseaux cible, + \item avec $8$ maquette en parrallèle pour acceleré la récupération d'expérience, + \item des interval de control de $30$ secondes, + \item un facteur d'apprentissage de $\alpha = 0.01$. +\end{itemize} +On obtient donc un pas d'entrainement toutes les heures. +Appres $72$ heures d'entrainement, soit $70$ pas d'entrainement, on n'a toujours pas de résultats stable. +En effet, les \rto{} ont des comportement hératique, ils convergent vers $0$ ou divergent vers $+\infty$. +On se retrove donc avec un taux d'echec important, le réseau n'est pas exploitable. + +Les décisions prise par l'agent non-entrainer sont trop aléatoire pour que il puisse maintenir en etat correct du réseau. +Il faudrait attendre longtemps avant que un épisode stable se forme par hasard et que l'agent puisse exploiter la stratégie correct. +Cela montre bien que l'entrainement sur simulateur est indispensable car le pré-entrinement sur modèle réel n'est pas assez performant. + +\begin{figure} + \centering + \includegraphics[width=\textwidth]{png_img/charge-rtts.png} + \caption[Répartition de la \rtt{} et du taux de retransmition en fonction de la charge du réseau.]{Répartition de la \rtt{} et du taux de retransmition en fonction de la charge du réseau. On ne vois pas clairement, mais en bas à gauche de chaque figure, il y a une zone tres dense.} + \label{fig:res:yaml} +\end{figure} +Pour palier à cela, une méthode pour crée de l'experience plus rapidement à était tenter, mais n'a pas pu etre finaliser. +Néanmoins, grace au donné récupérer, on peut tracer la figure \ref{fig:res:yaml} qui nous montre bien qu'il y a une charge critique à partir de laquelle le \rtt{} varrie beaucoup. -\clearpage \section{Conclusion} -\lipsum[3] +La modélisation que nous proposon est une transposition de méthode existante dans un nouveau domaine. +L'apprentissage machine a déjà montrer qu'il était capable de résoudre des problèmes liée au réseaux et au \CC{}. +Nous avons proposer ici une nouvelle modélisation pour intégrer ces nouveau outils à des problématique de l'\iot{}. +On ne s'interresse plus à une connexion seule, mais à l'ensemble des connexions vers tout un réseau de capteurs. +On ne mesure que les \rtt{} de chaque message, ainsi que le nombre de retransmission. +On construit ensuite une matrices qui représente l'état du réseau durant un interval de control. +Cette matrice est utilisé par un agent IA pour determiner l'action à prendre. +Cette action est une liste de facteurs multiplicatifs à appliquer aux \rto{} de chaque capteurs. +La difficulté est que on ne peut pas récupérer assez d'expérience pour réalisé un pré-entrainement. +Pour cela, il faudrait un simulateur. +La solution de la partie \ref{part:yaml} n'a pas pu etre tester. + +Par manque de temps et de capacité, ledit simulateur n'a pas pu etre réalisé. +Parmis les autres élements à perféctioner, il y a les valeurs de pondération utilisé dans la fonction de récompence, qui sont pour l'instant arbitraire. +De même, l'agent est pour l'instant assez basique, on pourrait utiliser une structure du réseau de neurrone plus complexe pour prendre en compte les particularités de la matrice d'état. +Le travail réalisé sera repris dans une thèse de \lss{}. \clearpage @@ -886,7 +1017,7 @@ La connexion est bien trop bonne pour pouvoir etre saturée par un système CoAP % --- Biblio par .bib \bibliography{rapport.bib} %\bibliographystyle{plain-fr.bst} -%\selectlanguage{french} +\selectlanguage{french} % --- Biblio écrite à la main %\begin{thebibliography}{7} @@ -903,9 +1034,22 @@ La connexion est bien trop bonne pour pouvoir etre saturée par un système CoAP \appendix \begin{appendices} - \section{Structure du code} + \section{Correspondance modélisation/code} + + \begin{table}[htp] + \centering + \caption{Correspondance modélisation/code} + \begin{tabular}{lcc} + \toprule + Nom & notation mathématique & Représentation numérique\\ + \midrule + \rtt& Utilisation finale & http, ssh...\\ + \bottomrule + \end{tabular} + \end{table} \begin{landscape} + \section{Structure du code} \begin{figure}[htp] \centering \includegraphics[height=\vsize, width=\hsize, keepaspectratio]{puml/call_stack_envoie.png}