%%%------------------------------------------------------------------------------------------------------------ \begin{tikzpicture} %%%%%%%%%%%%%%%% % parameter server + processor \begin{scope}[] {\footnotesize \tikzstyle{parametershard} = [draw,thick,minimum width=4em,align=left,rounded corners=2pt] { \node[parametershard,anchor=west,fill=yellow!20] (param1) at (0,0) {${\bm \theta}_o$}; \node (param2) at ([xshift=1em]param1.east) {}; \node[parametershard,anchor=west,fill=red!20] (param3) at ([xshift=1em]param2.east) {${\bm \theta}_h$}; \node[anchor=south,inner sep=1pt] (serverlabel) at ([yshift=0.8em]param2.north) {\small{\textbf{参数服务器}: ${\bm \theta}_{\textrm {new}} = {\bm \theta} - \alpha\cdot \frac{\partial J}{\partial {\bm \theta}}$}}; } \begin{pgfonlayer}{background} { \node[rectangle,draw,thick,inner sep=4pt,fill=gray!20] [fit = (param1) (param2) (param3) (serverlabel) ] (serverbox) {}; } \end{pgfonlayer} \tikzstyle{processor} = [draw,thick,fill=orange!25,minimum width=4em,align=left,rounded corners=2pt] { \node [processor,anchor=north,align=center] (processor2) at ([yshift=-1.2in]serverlabel.south) {\footnotesize{处理器 2}\\\footnotesize{(G2)}}; \node [anchor=north] (labela) at ([xshift=9.5em,yshift=-2em]processor2.south) {\small {(a)同步更新}}; \node [processor,anchor=east,align=center] (processor1) at ([xshift=-1em]processor2.west) {\footnotesize{处理器 1}\\\footnotesize{(G1)}}; \node [processor,anchor=west,align=center] (processor3) at ([xshift=1em]processor2.east) {\footnotesize{处理器 3}\\\footnotesize{(G3)}}; } { \draw[->,very thick,red!70] ([xshift=-0.5em,yshift=2pt]processor2.north) -- ([xshift=-0.5em,yshift=-2pt]serverbox.south) node [pos=0.5,align=right,xshift=-2em] (pushlabel) {\footnotesize{$\frac{\partial J}{\partial{\bm \theta}}$}};; \draw[<-,very thick,ublue!90] ([xshift=0.5em,yshift=2pt]processor2.north) -- ([xshift=0.5em,yshift=-2pt]serverbox.south) node [pos=0.5,align=left,xshift=2.2em] (fetchlabel) {\footnotesize{${\bm \theta}_{\textrm{new}}$}};;; \draw[->,very thick,red!70] ([xshift=-0.5em,yshift=2pt]processor3.north) -- ([xshift=3em,yshift=-2pt]serverbox.south); \draw[<-,very thick,ublue!90] ([xshift=0.5em,yshift=2pt]processor3.north) -- ([xshift=4em,yshift=-2pt]serverbox.south) node [pos=0.49,align=left,xshift=2.2em] (fetchlabel) {\footnotesize{Fetch($\cdot$)}}; \draw[->,very thick,red!70] ([xshift=-0.5em,yshift=2pt]processor1.north) -- ([xshift=-4em,yshift=-2pt]serverbox.south) node [pos=0.5,align=right,xshift=-2em] (pushlabel) {\footnotesize{Push($\cdot$)}}; \draw[<-,very thick,ublue!90] ([xshift=0.5em,yshift=2pt]processor1.north) -- ([xshift=-3em,yshift=-2pt]serverbox.south); } %%%%%%%%%%% % synchronous mode \tikzstyle{job} = [draw,rotate=90,minimum height=0.25in] \footnotesize{ { \node[job,anchor=south west,fill=blue!25] (fetch11) at ([xshift=10em,yshift=-0.2em]processor3.east) {\textbf{F}}; \node[job,anchor=west,fill=orange!35] (minibatch11) at ([yshift=1pt]fetch11.east) {\scriptsize{minibatch3}}; \node[job,anchor=west,fill=red!35] (push11) at ([yshift=1pt]minibatch11.east) {\textbf{P}}; \node[job,anchor=north west,fill=blue!35] (fetch12) at ([xshift=0.8em]fetch11.south west) {\textbf{F}}; \node[job,anchor=west,fill=orange!35] (minibatch12) at ([yshift=1pt]fetch12.east) {\scriptsize{minibatch2}}; \node[job,anchor=west,fill=red!35] (push12) at ([yshift=1pt]minibatch12.east) {\textbf{P}}; \node[job,anchor=north west,fill=blue!35] (fetch13) at ([xshift=0.8em]fetch12.south west) {\textbf{F}}; \node[job,anchor=west,fill=orange!35,minimum width=8.2em] (minibatch13) at ([yshift=1pt]fetch13.east) {\footnotesize{minibatch1}}; \node[job,anchor=west,fill=red!35] (push13) at ([yshift=1pt]minibatch13.east) {\textbf{P}}; \node[anchor=south west,draw,fill=gray!20,minimum width=7.7em] (update11) at ([yshift=3.82em]push11.north east) {更新}; \node[anchor=north] (G11) at (fetch11.west) {\small{G3}}; \node[anchor=north] (G12) at (fetch12.west) {\small{G2}}; \node[anchor=north] (G13) at (fetch13.west) {\small{G1}}; \node[anchor=north,align=center] (synlabel) at (G12.south) {\small{\textbf{同步更新}}}; \draw[->,thick] ([xshift=1em]G13.east) -- ([xshift=1em,yshift=1.4in]G13.east) node [pos=0.5,rotate=90,yshift=-1em] {\small{时间轴}}; } } { \draw [<->,thick,dotted] ([xshift=-1pt]minibatch11.north) .. controls +(west:3em) and +(east:3em) .. ([xshift=1pt]processor3.east); \draw [<->,thick,dotted] ([xshift=-1pt]fetch11.north) .. controls +(west:4em) and +(east:4em) .. ([xshift=0em,yshift=0.3in]processor3.north); \draw [<->,thick,dotted] ([xshift=-1pt]push11.north) -- ([xshift=-2.2em,yshift=0.8in]processor3.north); } { \draw [<->,thick,dotted] ([xshift=-1pt]update11.west) -- ([xshift=1pt,yshift=-1.28em]serverbox.north east); } } \end{scope} \begin{scope}[yshift=-2.5in] {\footnotesize \tikzstyle{parametershard} = [draw,thick,minimum width=4em,align=left,rounded corners=2pt] { \node[parametershard,anchor=west,fill=yellow!20] (param1) at (0,0) {${\bm \theta}_o$}; \node (param2) at ([xshift=1em]param1.east) {}; \node[parametershard,anchor=west,fill=red!20] (param3) at ([xshift=1em]param2.east) {${\bm \theta}_h$}; \node[anchor=south,inner sep=1pt] (serverlabel) at ([yshift=0.8em]param2.north) {\small{\textbf{参数服务器}: ${\bm \theta}_{\textrm {new}} = {\bm \theta} - \alpha\cdot \frac{\partial J}{\partial {\bm \theta}}$}}; } \begin{pgfonlayer}{background} { \node[rectangle,draw,thick,inner sep=4pt,fill=gray!20] [fit = (param1) (param2) (param3) (serverlabel)] (serverbox) {}; } \end{pgfonlayer} \tikzstyle{processor} = [draw,thick,fill=orange!25,minimum width=4em,align=left,rounded corners=2pt] { \node [processor,anchor=north,align=center] (processor2) at ([yshift=-1.2in]serverlabel.south) {\footnotesize{处理器 2}\\\footnotesize{(G2)}}; \node [anchor=north] (label) at ([xshift=9.5em,yshift=-2em]processor2.south) {\small {(b)异步更新}}; \node [processor,anchor=east,align=center] (processor1) at ([xshift=-1em]processor2.west) {\footnotesize{处理器 1}\\\footnotesize{(G1)}}; \node [processor,anchor=west,align=center] (processor3) at ([xshift=1em]processor2.east) {\footnotesize{处理器 3}\\\footnotesize{(G3)}}; } { \draw[->,very thick,red!70] ([xshift=-0.5em,yshift=2pt]processor2.north) -- ([xshift=-0.5em,yshift=-2pt]serverbox.south) node [pos=0.5,align=right,xshift=-2em] (pushlabel) {\footnotesize{$\frac{\partial J}{\partial {\bm \theta}}$}};; \draw[<-,very thick,ublue] ([xshift=0.5em,yshift=2pt]processor2.north) -- ([xshift=0.5em,yshift=-2pt]serverbox.south) node [pos=0.5,align=left,xshift=2.2em] (fetchlabel) {\footnotesize{${\bm \theta}_{\textrm{new}}$}};;; \draw[->,very thick,red!70] ([xshift=-0.5em,yshift=2pt]processor3.north) -- ([xshift=3em,yshift=-2pt]serverbox.south); \draw[<-,very thick,ublue] ([xshift=0.5em,yshift=2pt]processor3.north) -- ([xshift=4em,yshift=-2pt]serverbox.south) node [pos=0.49,align=left,xshift=2.2em] (fetchlabel) {\footnotesize{Fetch($\cdot$)}}; \draw[->,very thick,red!70] ([xshift=-0.5em,yshift=2pt]processor1.north) -- ([xshift=-4em,yshift=-2pt]serverbox.south) node [pos=0.5,align=right,xshift=-2em] (pushlabel) {\footnotesize{Push($\cdot$)}}; \draw[<-,very thick,ublue] ([xshift=0.5em,yshift=2pt]processor1.north) -- ([xshift=-3em,yshift=-2pt]serverbox.south); } %%%%%%%%%%% % synchronous mode \tikzstyle{job} = [draw,rotate=90,minimum height=0.25in] \footnotesize{ { \node[job,anchor=south west,fill=blue!35] (fetch21) at ([xshift=10em,yshift=-0.3em]processor3.east) {\textbf{F}}; \node[job,anchor=west,fill=orange!35] (minibatch21) at ([yshift=1pt]fetch21.east) {\scriptsize{minibatch3}}; \node[job,anchor=west,fill=red!35] (push21) at ([yshift=1pt]minibatch21.east) {\textbf{P}}; \node[job,anchor=north west,fill=blue!35] (fetch22) at ([xshift=0.8em]fetch21.south west) {\textbf{F}}; \node[job,anchor=west,fill=orange!35] (minibatch22) at ([yshift=1pt]fetch22.east) {\scriptsize{minibatch2}}; \node[job,anchor=west,fill=red!35] (push22) at ([yshift=1pt]minibatch22.east) {\textbf{P}}; \node[job,anchor=north west,fill=blue!35] (fetch23) at ([xshift=0.8em]fetch22.south west) {\textbf{F}}; \node[job,anchor=west,fill=orange!35,minimum width=8.25em] (minibatch23) at ([yshift=1pt]fetch23.east) {\footnotesize{minibatch1}}; \node[job,anchor=west,fill=red!35] (push23) at ([yshift=1pt]minibatch23.east) {\textbf{P}}; \node[anchor=south west,draw,fill=gray!20,minimum width=0.6in] (update21) at ([yshift=2pt]push21.north east) {更新}; \node[anchor=south west,draw,fill=gray!20,minimum width=0.25in] (update22) at ([yshift=2.8pt]push23.north east) {\tiny{更新}}; \node[anchor=north] (G21) at (fetch21.west) {\small{G3}}; \node[anchor=north] (G22) at (fetch22.west) {\small{G2}}; \node[anchor=north] (G23) at (fetch23.west) {\small{G1}}; \node[anchor=north,align=center] (synlabel) at (G22.south) {\small{\textbf{异步更新}}}; \draw[->,thick] ([xshift=1em]G23.east) -- ([xshift=1em,yshift=1.4in]G23.east) node [pos=0.5,rotate=90,yshift=-1em] {\small{时间轴}}; \draw [<->,thick,dotted] ([xshift=-1pt,yshift=-4pt]update21.west) -- ([xshift=1pt,yshift=-1.55em]serverbox.north east); \draw [<->,thick,dotted] ([xshift=-1pt]update22.west) -- ([xshift=1pt,yshift=-1.5em]serverbox.north east); } } } \end{scope} \end{tikzpicture} %%%------------------------------------------------------------------------------------------------------------