\documentclass{beamer}
\mode<presentation>

\usepackage{algorithm}
\usepackage{algorithmic}
\usepackage{beamerthemesplit}
\usepackage{graphicx}
\usepackage[french]{babel}
\usepackage[T1]{fontenc}

\mode<presentation>
{
  \usetheme{frankfurt}
  % or ...
\beamertemplatenavigationsymbolsempty

  \setbeamercovered{transparent}
  % or whatever (possibly just delete it)
}

\title{Primitives de calcul réparti sur Azure}
\author{Matthieu Durut}
\date{\today}

\AtBeginSection[]
{
   \begin{frame}
       \frametitle{Outline}
       \tableofcontents[currentsection]
   \end{frame}
}

\AtBeginSubsection[]
{
   \begin{frame}
       \frametitle{Outline}
       \tableofcontents[currentsection,currentsubsection]
   \end{frame}
}

\begin{document}

\begin{frame}
\titlepage
\end{frame}

\section{Introduction.}

\begin{frame}
\frametitle{Qu'est-ce que le calcul réparti?}
\begin{itemize}
\item Une action + un hardware + un framework
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Des exemples d'actions aisément parallélisables}
\begin{itemize}
\item Appliquer une fonction f à un ensemble de points $(x_{i})_{i=1..n}$
\item Calculer une somme, une moyenne
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Des actions plus malaisées à paralléliser}
\begin{itemize}
\item Le calcul d'une suite définie par récurrence (parfois on peut casser la dépendance :$u_{n+1}=a*u_{n}+b$)
\item Plus généralement, un processus à état
\item Un calcul de quantile empirique, plus généralement un tri
\end{itemize}
\end{frame}


\begin{frame}
\frametitle{Quid de l'écriture et de la lecture d'un objet?}
\begin{itemize}
\item Lecture
\item Update
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Updates(1).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue1.pdf}
\end{center}
\end{figure}
\end{frame}
\begin{frame}

\frametitle{Updates(2).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue2.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(3).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue3.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(4).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue4.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(5).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue5.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(6).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue6.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(7).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue7.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(8).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue8.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(9).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue9.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(10).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue10.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(11).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue11.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(12).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue12.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(13).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue13.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(14).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue14.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(15).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue15.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(16).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue16.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(17).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue17.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(18).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue18.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(19).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue19.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(20).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue20.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(21).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue21.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(22).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue22.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(23).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue23.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(24).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue24.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(25).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue25.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(26).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue26.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(27).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue27.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(28).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue28.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(29).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue29.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(30).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue30.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Updates(31).}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{RaceIssue31.pdf}
\end{center}
\end{figure}
\end{frame}

\section{Présentation du cloud.}


\subsection{Hardware}
\begin{frame}
\frametitle{Phénomènes économiques}
\begin{itemize}
\item Impact de la loi des économies d'échelle
\item Même choix technologique chez tous les leaders du secteur : Google, Amazon, Yahoo, ...
\item "Comoditisation" de l'IT
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Quelques images (1)}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{googe-datacenter.jpg}
\caption{Un datacenter de Google}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Quelques images (2)}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.6]{hpdatacenter.jpg}
\caption{A l'intérieur d'un datacenter de HP}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Quelques images (3)}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.5]{Cloudcontainer.jpg}
\caption{Un container de Sun}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Quelques différences Cluster/Cloud}
\begin{itemize}
\item XaaS
\item Scaling
\end{itemize}
\end{frame}

\subsection{Software}
\begin{frame}
\frametitle{Quelques frameworks}
\begin{itemize}
\item MPI (Message Passing Interface)
\item MapReduce
\item Dryad
\item GraphLab
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{MapReduce}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{mapreduce2.jpg}
\caption{Schéma original du Mapreduce}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Microsoft Windows Azure}
\begin{itemize}
\item Système de stockage : BlobStorage, QueueStorage, TableStorage
\item Système de traitement : web roles et worker roles
\item Un worker role est composé de plusieurs services (=entités sémantiques), exécutés par de multiples workers
\end{itemize}
\end{frame}

\section{Azure}
\subsection{Storage}
\begin{frame}
\frametitle{BlobStorage}
\begin{itemize}
\item Système de stockage par paire (clef/valeur)
\item Dispose d'un système de timestamp (etag)
\item Indexation par la valeur de la clef, par exemple : nomducontainer/valeur\_d\_un\_champ/valeur\_d\_un\_autre\_champ
\item Les valeurs dont la clef partage le même container sont stockées sur la même machine physique, ou tout au moins sont physiquement proches
\item Possibilité de lister les éléments dont la clef partage un même préfixe
\item Les opérations multi-blobs ne sont pas atomiques
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{BlobStorage : schéma}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.5]{blob-diagram.png}
\caption{Schéma du blobstorage}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Queues distribuées}
\begin{itemize}
\item Méchanisme de dispatchement des messages
\item Découple les dépendances entre composants
\item Les messages peuvent être exposés et donc processés plus qu'une fois
\item Les messages traités mais dont l'exécution échoue redeviennent disponibles et sont ré-éxécutés
\item Queues FIPFO : pas d'algorithme de type Gauss-Seidel par ces queues
\end{itemize}
\end{frame}

\subsection{Workers}
\begin{frame}
\frametitle{Queue and Scheduled Services}
\begin{itemize}
\item Queue Service
\item Scheduled Service
\item Pas d'affinité workers/storage. Compromis design/performance.
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Les jobs doivent être idempotents}
\begin{itemize}
\item Accès au storage doivent être idempotents
\item Si les workers sont stateless, c'est suffisant
\item Pas de jobs "récursifs" où les entrées et sorties seraient stockées au même emplacement
\item Les compteurs doivent être implémentés avec beaucoup d'attention
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Les jobs sont faillibles}
\begin{itemize}
\item Assurer la consistence, via le regroupement des données liées entre elles dans un même blob.
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Les workers sont sans état}
\begin{itemize}
\item Simplification du design : chaque worker est anonyme, les jobs sont interchangeables
\item Aide à la reprise sur pannes
\item Oui, mais...
\end{itemize}
\end{frame}

\section{Primitives}
\subsection{Communication et synchronisation.}

\begin{frame}
\frametitle{Architecture de communication dans un mapreduce itéré.}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{DistributedKMeans.pdf}
\end{center}
\label{fig:Communication}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Barrière de synchronisation}
\begin{itemize}
\item Algorithmes synchrones/asynchrones
\item La synchronisation entraine un coût
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Une primitive de synchronisation : les bitcounters}
\begin{itemize}
\item Première solution : compteur (entier) pour connaître le nombre de jobs inachevés
\item Utilisation du timestamp pour garantir l'atomicité des updates
\item Idempotence sur le compteur : identifiant sur les jobs, compteur devient un tableau de bits
\item Repose sur une parallélisation optimiste, et peut pourtant être utilisé dans un cadre très défavorable
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{Une autre primitive de synchronisation : le listing}
\begin{itemize}
\item Chaque mapper pousse dans le storage un témoin indiquant qu'il a terminé
\item Le témoin peut être le résultat lui-même du job
\item Lorsque tous les témoins sont disponibles, la barrière est levée
\item Le reducer peut télécharger les résultats dès qu'ils deviennent disponibles
\item Mitigation des straggler issues par overlap entre calcul et chargement
\end{itemize}
\end{frame}

\subsection{Straggler issues.}

\begin{frame}
\frametitle{Distribution empirique des temps de calculs d'une même tâche exécutée de multiples fois par une même machine.}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.5]{DistributionSingleWorker.png}
\end{center}
\label{fig:Communication}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Distribution empirique des temps de calculs d'une même tâche exécutée de multiples fois par 80 machines.}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.5]{Straggler.png}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Gestion des tâches trop longues (straggler issues) dans le MapReduce original}
\begin{itemize}
\item Monitoring + dédoublement
\item Impossibilité d'obtenir des speedups supérieurs à 50\% d'efficacité
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{D'autres solutions}
\begin{itemize}
\item Abandonner les tâches trop longues
\item Algorithmes asynchrones
\end{itemize}
\end{frame}

\section{K-Means}

\begin{frame}
\frametitle{Implémentation}
\begin{itemize}
\item Objectif : Grouper N points dans $\mathbb{R}^{D}$ en K groupes représentés par leur centre $(c_k)_{k=1..K}$, en minimisant le critère : $\frac{1}{N}\displaystyle\sum_{n=1}^{N} \displaystyle Min_{k=1..K} (||x_{i}-c_{k}||_{2}^{2})$
\item Cas séquentiel : 2 phases itérées (calcul de distance, recalcul de centroïdes)
\item Distribution de l'algorithme
\end{itemize}
\end{frame}

\begin{frame}
\frametitle{K-Means réparti}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{DistributedKMeans2.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Courbes de speedup en fonction de P :D=1000, K=1000}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{Speedup.pdf}
\end{center}
\end{figure}
\end{frame}

\begin{frame}
\frametitle{Courbes de scaleup avec N=50000*P, D=1000, K=1000}
\begin{figure}
\begin{center}
\includegraphics[scale = 0.4]{Speedup2.pdf}
\end{center}
\end{figure}
\end{frame}

\section{Conclusion}

\begin{frame}
\frametitle{Conclusion}
\begin{itemize}
\item Les coûts de communication et de synchronisation via le storage sont importants
\item La gestion des straggler issues est déterminante pour obtenir des garanties de bons speedups
\item Les jobs idempotents ont un effet sur le design du code
\item Pas d'évidence en ce qui concerne le framework le plus adapté pour des applications statistiques/ML
\end{itemize}
\end{frame}

\end{document} 