mi024

College project master 1 "Projet IAD"
git clone https://esimon.eu/repos/mi024.git
Log | Files | Refs | README

commit e3290403782873a96560a1fbc17810328eeec6c8
parent 7d437a7c39ec0c7feeafc5182d88a8851f7e6b4e
Author: Étienne Simon <etienne.jl.simon@gmail.com>
Date:   Wed, 30 Jan 2013 23:39:41 +0100

Première version du cahier des charges et du plan de développement.

Diffstat:
AREADME | 4++++
Mdoc/CMakeLists.txt | 4++--
Mdoc/operational plan.tex | 117+++++++++++++++++++++++++++++++++++++++++++++++++++++++++----------------------
Mdoc/specifications.tex | 85++++++++++++++++++++++++++++++++++++++++++++++++++-----------------------------
4 files changed, 145 insertions(+), 65 deletions(-)

diff --git a/README b/README @@ -0,0 +1,4 @@ +Module MI024 (PIAD) +Année 2013 +Sujet Vers une Machine d'apprentissage persistante +Étudiant Étienne Simon diff --git a/doc/CMakeLists.txt b/doc/CMakeLists.txt @@ -5,11 +5,11 @@ set(LATEX_DOCUMENTS "operational plan.tex" ) -add_custom_target(doc) +add_custom_target(doc ALL) foreach(LATEX_DOCUMENT ${LATEX_DOCUMENTS}) add_latex_document(${LATEX_DOCUMENT} IMAGE_DIRS images DEFAULT_PDF MANGLE_TARGET_NAMES) get_filename_component(DOCUMENT ${LATEX_DOCUMENT} NAME_WE) add_dependencies(doc ${DOCUMENT}_pdf) - add_custom_command(TARGET doc POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${DOCUMENT}.pdf ${CMAKE_BINARY_DIR}/${DOCUMENT}.pdf) + add_custom_command(TARGET ${DOCUMENT}_pdf POST_BUILD COMMAND ${CMAKE_COMMAND} -E copy ${CMAKE_CURRENT_BINARY_DIR}/${DOCUMENT}.pdf ${CMAKE_BINARY_DIR}/${DOCUMENT}.pdf) endforeach(LATEX_DOCUMENT) diff --git a/doc/operational plan.tex b/doc/operational plan.tex @@ -5,8 +5,8 @@ \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage[french]{babel} -%\usepackage[style=ieee]{biblatex} +\newcommand{\nmlp}{\textsc{nmlp}} \renewcommand{\thesection}{\arabic{section}} \begin{document} @@ -30,7 +30,7 @@ {\LARGE Plan de développement}\\ \vspace{0.1\textheight} {\Large Auteur~: \hfill Encadrant~: \\ - Étienne Simon \hfill Ludovic Dénoyer} + Étienne Simon \hfill Ludovic Denoyer} \vfill \today \end{center} @@ -40,46 +40,99 @@ \pagebreak \section{Aperçu du PIAD} - \subsection{Objectifs} -\begin{itemize} - \item Rappeler les objectifs principaux du PIAD -\end{itemize} - -\subsection{Références} -\begin{itemize} - \item Donner la liste complète des documents et autres sources d'information mentionnés dans le plan (e.g. cahier des charges) -\end{itemize} +Ce PIAD est intitulé «~Vers une Machine d'apprentissage persistante.~» +L'objectif sera d'étendre les fonctionnalités de la bibliothèque \nmlp{} pour permettre la persistance des objets utilisés par celle-ci. -\subsection{Définitions et acronymes} -\begin{itemize} - \item Indiquer les documents ou les annexes où sont définis les termes et les acronymes permettant de bien comprendre le plan, ou les références. -\end{itemize} +\nmlp{} est une bibliothèque permettant l'apprentissage de perceptrons multicouches (MLP). +Les MLP sont traités comme des ensembles de modules, qui sont appris sous la gouvernance d'un critère. +Le but sera d'écrire un ensemble d'outil pour manipuler ces modules et, plus généralement, faciliter l'apprentissage des MLP. +\subsection{Références} +L'ensemble du livrable est disponible sur un dépôt Mercurial, il est possible de le cloner avec la commande~:\\ +\indent\indent\verb|hg clone https://bitbucket.org/ejls/mi024|\\ +L'ensemble de la documentation y est présente, y compris ce document. \section{Organisation du PIAD} - \subsection{Participants} -\begin{itemize} - \item Lister les participants au PIAD~: encadrant + étudiants - \item Indiquer éventuellement les participants extérieurs (liens avec d’autres PIAD, autres enseignants / chercheurs, autres labos, entreprises, etc) -\end{itemize} +Ce PIAD est réalisé par un seul étudiant~: Étienne Simon (numéro étudiant 3060576.) +Il est encadré par Ludovic Denoyer (professeur au LIP6.) \subsection{Activités} -\begin{itemize} - \item Faire la liste des activités principales du PIAD, en décrivant chaque activité en quelques lignes (description sommaire, pouvant référer à des documents plus conséquents) - \item Donner le durée estimée pour chaque activité -\end{itemize} +\subsubsection{Phase 1~: Serveur} +\paragraph{Interfaçage avec \nmlp{}} +Présentation de l'interface de \nmlp{} à travers la nouvelle bibliothèque. +Bien que rapide, cette tâche permettra aussi de se familiarisé avec \nmlp{}, une semaine entière y est donc alloué. +Il faudra en particulier prendre soin à discerner le code des objets CPU du code des objets GPU ainsi que les contraintes qui y sont liées (e.g. espace mémoire plus limité en GPU.) + +\paragraph{Serialisation} +Ajout d'opérateurs de serialisation aux classes de \nmlp{}, utilisation possible de Boost.Serialization. +Il faudra ajouter les opérateurs sans modifier le code de \nmlp{}. +Il peut être intéressant d'avoir un format d'archive portable en prévision des tâches de la phase 3. + +\paragraph{Persistance} +Gestion d'une base de donnée des objets de \nmlp{} en utilisant les opérateurs de serialisation écrits lors de la tâche précédente. +Il faudra également stocker des métadonnées, par exemple des descriptions pour les modules et les tests ou encore les paramètres d'apprentissage utilisés pour l'entraînement d'un module. +De plus une interface pour manipuler ces objets devra être implémenté (e.g. faire cent coups de gradients sur le module X avec le jeu de données Y.) +Il sera intéressant d'avoir des identificateurs universels pour les modules et les jeux de données (par exemple en les hachant), le cas des critères est plus simple car ceux-ci sont peu nombreux. -\subsection{Rôles et responsabilités} -\begin{itemize} - \item Indiquer pour chaque activité un responsable et son rôle -\end{itemize} +\subsubsection{Phase 2~: Clients} +\paragraph{Test} +Un premier client se limitera à l'apprentissage d'un MLP sur des couples de vecteurs d'entrée et de sortie. +Cela permettra principalement de s'assurer que le serveur fonctionne correctement. + +\paragraph{Application} +Une des applications de \nmlp{} est l'apprentissage d'encodeurs et de décodeurs pour la classification de données hétérogènes. +Il serait intéressant d'écrire un client pour faire de la classification sur un tel jeu de données. + +\subsubsection{Phase 3~: Finalisations} +\paragraph{Réseau} +Rendre le serveur accessible par un protocole réseau. +Cela se réduira à l'interprétation de requêtes récupérées par Boost.Asio. +Dans un premier temps, le serveur devra accepter une seule connexion. +Une file de requête pourra être crée pour la gestion de connexions simultanées. +Il faudra ensuite repérer les opérations qui sont exécutables de manière concurrentielles pour pouvoir exécuter plusieurs requêtes simultanément. +Par ailleurs, alors que le serveur sous forme de bibliothèque pouvait tout charger en mémoire lors d'un appel client puis tout écrire en fin d'opération, un serveur réseau doit distinguer ce qu'il garde en mémoire dynamique de ce qui doit être lu ou écrit sur le disque. + +\paragraph{Parallélisation} (optionnel) +Enfin, une optimisation intéressante consisterait à utiliser Boost.MPI pour paralléliser les opérations sur plusieurs machines. + +\subsubsection{Documentations et tests} +\paragraph{Documentation développeur} +L'outil \emph{de facto} standard d'écriture de documentation développeur pour C++ est Doxygen. +Ce n'est pas une dépendance de \nmlp{}, mais il est possible de générer la documentation séparément, cela ne devrait donc pas poser de problème. + +\paragraph{Documentation utilisateur} +L'objet principal de ce PIAD étant un serveur, l'utilisateur sera principalement renseigné par la documentation développeur. +Toute fois, un guide d'installation et une documentation des clients devra être écrite séparément. + +\paragraph{Tests} +Les dépendances de \nmlp{} offrent déjà un \emph{framework} de test avec CTest et Boost.Test. +Des tests unitaires seront écrit avec ces outils tout au long du développement. \subsection{Calendrier} -\begin{itemize} - \item Proposer un calendrier pour le PIAD, afin d’indiquer comment les activités se déroulent dans le temps - \item Indiquer notamment les dépendances entre activités parallèles (on pourra utiliser un diagramme, e.g. diagramme de Gantt) -\end{itemize} +\noindent +\begin{tabular}{ | c | c | p{0.58\textwidth} | } \hline +\multicolumn{1}{|c|}{\textbf{Date}} & \textbf{Semaine} & \multicolumn{1}{|c|}{\textbf{Description}}\\\hline +\textit{01/02} & \textit{0} & \textit{Remise du cahier des charges et du plan de développement.}\\\hline +\textbf{04/02-10/03} & \textbf{1..5} & \multicolumn{1}{|c|}{\textbf{Phase 1~: Serveur}}\\\hline +04/02-10/02 & 1 & Familiarisation et interfaçage avec \nmlp{}.\\ +11/02-17/02 & 2 & Écriture des opérateurs de serialisation.\\ +18/02-03/03 & 3..4 & Utilisation d'une base de données pour activer la persistance des objets.\\ +04/03-10/03 & 5 & Debug, test et documentation.\\\hline +\textbf{11/03-31/03} & \textbf{6..8} & \multicolumn{1}{|c|}{\textbf{Phase 2~: Clients}}\\\hline +11/03-24/03 & 6..7 & Écriture de clients exploitant les fonctionnalités offertes par le serveur.\\ +25/03-31/03 & 8 & Debug, test et documentation.\\\hline +\textbf{01/04-05/05} & \textbf{9..13} & \multicolumn{1}{|c|}{\textbf{Phase 3~: Finalisations}}\\\hline +01/04-14/03 & 9..10 & Mise en réseau du serveur.\\ +15/04-28/03 & 11..12 & Parallélisation du serveur.\\ +29/04-05/05 & 13 & Debug, test et documentation.\\\hline +\textit{09/05} & \textit{14} & \textit{Remise du rapport final.}\\\hline +\textit{13/05-20/05} & \textit{15} & \textit{Soutenance.}\\\hline +\end{tabular} + +\paragraph{} +Bien qu'une semaine soit allouée au debug, test et documentation pour chaque phase, ces tâches seront à effectuer pendent la période de développement. +Il peut toute fois être intéressant de faire le point en fin de chaque phase, de plus ces semaines peuvent servir de tampons contre un retard. \end{document} diff --git a/doc/specifications.tex b/doc/specifications.tex @@ -1,11 +1,13 @@ \documentclass[11pt,a4paper]{report} \usepackage{setspace} \usepackage{graphicx} +\usepackage{url} \usepackage{epstopdf} \usepackage[T1]{fontenc} \usepackage[utf8]{inputenc} \usepackage[french]{babel} +\newcommand{\nmlp}{\textsc{nmlp}} \renewcommand{\thesection}{\arabic{section}} \begin{document} @@ -29,7 +31,7 @@ {\LARGE Cahier des charges}\\ \vspace{0.1\textheight} {\Large Auteur~: \hfill Encadrant~: \\ - Étienne Simon \hfill Ludovic Dénoyer} + Étienne Simon \hfill Ludovic Denoyer} \vfill \today \end{center} @@ -40,44 +42,65 @@ \section{Objectif du PIAD} \subsection{Présentation} -Présente la nature de ce document, en rappelant le titre du PIAD. +Ce PIAD est intitulé «~Vers une Machine d'apprentissage persistante.~» +L'objectif sera d'étendre les fonctionnalités de la bibliothèque \nmlp{} pour permettre la persistance des objets utilisés par celle-ci. + +\nmlp{} est une bibliothèque permettant l'apprentissage de perceptrons multicouches (MLP). +Les MLP sont traités comme des ensembles de modules, qui sont appris sous la gouvernance d'un critère. +Le but sera d'écrire un ensemble d'outil pour manipuler ces modules et, plus généralement, faciliter l'apprentissage des MLP. + \subsection{Objectifs principaux} -Objectifs principaux du PIAD. +La première tâche à effectuée sera la construction d'une bibliothèque autour de \nmlp{}. +Celle-ci agira comme un serveur et devra permettre la persistance des objets manipulés par \nmlp{}, c'est-à-dire des modules, des critères et des données. + +Par la suite, de simples clients devront être écrits, permettant de tester la bibliothèques en lançant, par exemple, des apprentissages sur des MLP classiques ou des apprentissages d'auto-encoders. +En particulier, il est prévu d'utiliser le serveur pour l'apprentissage d'encodeur de données hétérogènes vers un espace latent. + +Enfin, il sera question de créer une interface réseau pour le serveur et pour les clients. +Avec éventuellement une parallélisation des opérations effectuées par le serveur. + \subsection{Contraintes techniques} -Environnement de développement~: Plate-forme (PC, Mac…), OS (Windows, Linux…), langages, outils… -Contraintes matérielles et logicielles +Le développement se fera en C++, la bibliothèques \nmlp{} utilisant uniquement des fonctionnalités C++03 (ISO/IEC 14882:2003), elle sera étendu également en C++03. +De plus, le livrable ne devra avoir aucune dépendance autre que celles déjà présentes dans \nmlp{}, c'est à dire les bibliothèques Boost et CUDA. +Par ailleurs, le code devra fonctionner sous Windows et sous les divers *nix, n'ayant à disposition que des environnements FreeBSD et OpenBSD avec GCC et Clang, l'encadrant devra se charger de vérifier le fonctionnement du code sous Windows. +Le livrable devra être compilable avec le moteur de production CMake utilisé par \nmlp{}. + +Pour s'assurer d'un suivi en temps réel du travail effectué, l'ensemble du livrable sera maintenue par un logiciel de gestion de versions (VCS), en l'occurrence un dépôt Mercurial sur Bitbucket~:\\ +\indent\indent\url{https://bitbucket.org/ejls/mi024} \section{Description de la solution demandée} -Décrire les fonctionnalités de la solution demandée -\subsection{Fonctionnalité 1} -\subsection{Fonctionnalité 2} -… -\subsection{Contraintes de réalisation} -\begin{itemize} - \item Indiquer des contraintes sur la réalisation (performances, fiabilité, etc.) - \item Indiquer éventuellement un ordre de priorité dans la réalisation des différentes fonctionnalités, du genre un noyau central à réaliser absolument + fonctionnalités supplémentaires si le temps le permet -\end{itemize} +L'outil principal créé lors de ce PIAD sera le serveur. +Le but est d'avoir une interface simple aux fonctionnalités offertes par \nmlp{}. +Par exemple, le serveur devra être capable d'exécuter une suite de commande du type~:\\ +\indent\indent\verb|split dataset("100 first dUSP", "digits USP", 1, 100)|\\ +\indent\indent\verb|concat mlp "digits encoder" "encoded digit rec"|\\ +\indent\indent\indent\verb|in "digit rec"|\\ +\indent\indent\verb|gradient iteration 1000 mlp "digit rec"|\\ +\indent\indent\indent\verb|on "100 first dUSP" constraint "least square"| + +La fonctionnalité principale de ce serveur est la persistance des objets qu'il manipule. +L'intérêt est de construire une base de données de modules qui pourront être réutilisés par la suite. -\section{Composition du délivrable} -On pourra s'inspirer de ce qui suit~: +On peut distinguer trois classes d'actions effectuées par le serveur~: la manipulation des données, la manipulation des modules et l'application de l'algorithme d'apprentissage. -Dans le cadre de la réalisation du projet, les maîtres d'œuvre s'engagent à livrer les produits suivants~: +Une description plus détaillé des activités est présente dans le plan de développement. + +\section{Composition du livrable} \begin{itemize} - \item L'exécutable implantant toutes les fonctionnalités prévues. - \item Le code source entièrement commenté - \item La documentation complète du projet telle que définie par le PIAD de maîtrise à savoir~: + \item Un script de compilation CMake + \item Une bibliothèque serveur + \item Un \emph{daemon} serveur + \item Des exécutables clients testant les fonctionnalités du serveur (sous ses deux formes) + \item La documentation du projet \begin{itemize} - \item Cahier des charges - \item Plan de développement - \item Analyse (spécifications, organigramme, flux de données) - \item Conception - \item Rapport de tests décrivant les protocoles de test, leurs résultats complets et commentés - \item Rapport final + \item Le cahier des charges + \item Le plan de développement + \item Le dossier d'analyse et de conception + \item La documentation développeur + \item Le rapport des tests + \item Les manpages relatives aux différents binaires + \item Les README et INSTALL usuels + \item Le rapport final \end{itemize} - \item Manuel d'installation - \item Manuel de l'utilisateur - \item Manuel du programmeur \end{itemize} - -\section{Références} \end{document}