├── .gitignore ├── LICENSE ├── README.md ├── diagram ├── global_structure.pdf └── global_structure.tex ├── flux_architecture_diagram.drawio └── flux_architecture_diagram.png /.gitignore: -------------------------------------------------------------------------------- 1 | # latexmk auxiliary files 2 | *.aux 3 | *.fls 4 | *.fdb_latexmk 5 | *.log 6 | *.synctex.gz -------------------------------------------------------------------------------- /LICENSE: -------------------------------------------------------------------------------- 1 | MIT License 2 | 3 | Copyright (c) 2024 Valérien 4 | 5 | Permission is hereby granted, free of charge, to any person obtaining a copy 6 | of this software and associated documentation files (the "Software"), to deal 7 | in the Software without restriction, including without limitation the rights 8 | to use, copy, modify, merge, publish, distribute, sublicense, and/or sell 9 | copies of the Software, and to permit persons to whom the Software is 10 | furnished to do so, subject to the following conditions: 11 | 12 | The above copyright notice and this permission notice shall be included in all 13 | copies or substantial portions of the Software. 14 | 15 | THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 16 | IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 17 | FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL THE 18 | AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 19 | LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, 20 | OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE 21 | SOFTWARE. 22 | -------------------------------------------------------------------------------- /README.md: -------------------------------------------------------------------------------- 1 | # Flux.1-Architecture-Diagram 2 | A detailed diagram laying out the full Flux.1 architecture as shared by Black Forest Labs. 3 | ![diagram](./flux_architecture_diagram.png) 4 | 5 | (open the file to view it zoomed in) 6 | 7 | # Road map 8 | - [x] first draft using draw.io 9 | - [ ] convert to TikZ, either on a single page or split into sections 10 | - [ ] add tensor shapes annotations to all connections 11 | - [ ] write small document to explain the key points of the architecture 12 | 13 | # References 14 | - [Flux.1 source code](https://github.com/black-forest-labs/flux) 15 | - [@nrehiew original diagram](https://x.com/nrehiew_/status/1820404554795802684) (latter [reposted on Reddit](https://www.reddit.com/r/LocalLLaMA/comments/1ekr7ji/fluxs_architecture_diagram_dont_think_theres_a/) by u/pppodong) 16 | - Tensor shapes calculations: [Pytorch documentation](https://pytorch.org/docs/stable/index.html) 17 | - Original paper that inspired the SingleStream blocks: [Dehghani et al., *Scaling Vision Transformers to 22 Billion Parameters*, 2023](https://arxiv.org/abs/2302.05442) -------------------------------------------------------------------------------- /diagram/global_structure.pdf: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brayevalerien/Flux.1-Architecture-Diagram/5d6718e283d64105beaf73c978a5de6bb95a4b3c/diagram/global_structure.pdf -------------------------------------------------------------------------------- /diagram/global_structure.tex: -------------------------------------------------------------------------------- 1 | \documentclass[tikz, border=5pt]{standalone} 2 | 3 | \usetikzlibrary{decorations.pathreplacing} % Brackets 4 | 5 | \begin{document} 6 | \begin{tikzpicture}[ 7 | >=stealth, 8 | thick, 9 | scale=0.75, 10 | every node/.style={scale=0.75}, 11 | block/.style={draw, rotate=90, minimum width=1.75cm, minimum height=.75cm}, 12 | op/.style={draw, shape=circle, minimum width=.75cm}, % Operator (+, *, CAT...) 13 | stream/.style={draw, font=\Large, inner sep=7.5pt}, 14 | align=center 15 | ] 16 | % INPUTS 17 | \node (in_img) at (0, 0) {\verb|img|}; 18 | \node (in_timesteps) at (0, -2) {\verb|timesteps|}; 19 | \node (in_guidance) at (0, -4) {\verb|guidance|}; 20 | \node (in_y) at (0, -6) {\verb|y|}; % CLIP output 21 | \node (in_txt) at (0, -8) {\verb|txt|}; % T5XXL output 22 | \node (in_img_ids) at (0, -10) {\verb|img_ids|}; 23 | \node (in_txt_ids) at (0, -12) {\verb|txt_ids|}; 24 | 25 | % CLIP and T5 text encoders 26 | \node (CLIP) at (-2, -6) [block, rounded corners=.1cm] {CLIP}; % CLIP output 27 | \node (T5XXL) at (-2, -8) [block, rounded corners=.1cm] {T5 XXL}; % T5XXL output 28 | % Connect those to their output 29 | \draw[->] (CLIP) -- (in_y); 30 | \draw[->] (T5XXL) -- (in_txt); 31 | 32 | % INPUTS EMBEDDINGS 33 | \node (linear_01) at (3, 0) [block] {Linear}; 34 | \node (sin_emb) at (3, -3) [block, minimum width=1.75*2cm] {Sinusoïdal Embedding}; 35 | \node (mlp_emb_01) at (6, -2) [block] {MLP Emb}; 36 | \node (mlp_emb_02) at (6, -4) [block] {MLP Emb}; 37 | \node (mlp_emb_03) at (3, -6) [block] {MLP Emb}; 38 | \node (vec_plus) at (9, -4) [op] {+}; 39 | \node (linear_02) at (3, -8) [block] {Linear}; 40 | \node (PE_cat) at (3, -11) [op] {\verb|cat|}; 41 | \node (EmbedND) at (6, -11) [block] {EmbedND}; 42 | 43 | % Connect inputs to embedding layers 44 | \draw[->] (in_img) -- (linear_01); 45 | \draw[->] (in_timesteps) -- ([xshift=-0.375cm]sin_emb |- in_timesteps); 46 | \draw[->] (in_guidance) -- ([xshift=-0.375cm]sin_emb |- in_guidance); 47 | \draw[->] ([xshift=0.375cm]mlp_emb_01 -| sin_emb) -- (mlp_emb_01); 48 | \draw[->] ([xshift=0.375cm]mlp_emb_02 -| sin_emb) -- (mlp_emb_02); 49 | \draw[->] (in_y) -- (mlp_emb_03); 50 | \draw[->] (mlp_emb_01) -| (vec_plus); 51 | \draw[->] (mlp_emb_02) -- (vec_plus); 52 | \draw[->] (mlp_emb_03) -| (vec_plus); 53 | \draw[->] (in_txt) -- (linear_02); 54 | \draw[->] (in_img_ids) -| (PE_cat); 55 | \draw[->] (in_txt_ids) -| (PE_cat); 56 | \draw[->] (PE_cat) -- (EmbedND); 57 | 58 | % DOUBLE STREAM BLOCKS 59 | \node (DoubleStream_01) at (13, -6) [stream] {DoubleStream\\Block}; 60 | \node (DoubleStream_02) at (19, -6) [stream] {DoubleStream\\Block}; 61 | \node (DoubleStream_dots) at (23.5, -6) [minimum height=1.5cm] {\textbf{\dots}}; 62 | \node (DoubleStream_03) at (28, -6) [stream] {DoubleStream\\Block}; 63 | 64 | % Connect embeddings to DS blocks 65 | \draw[->] (linear_01) -- ++(7, 0) |- (DoubleStream_01.170); 66 | \draw[->] (linear_02) -- ++(7, 0) |- (DoubleStream_01.190); 67 | 68 | % Connect DS blocks together 69 | \draw[->] (DoubleStream_01.10) -- node[above]{img} (DoubleStream_02.170); 70 | \draw[->] (DoubleStream_01.350) -- node[below]{txt} (DoubleStream_02.190); 71 | \draw[->] (DoubleStream_02.10) -- node[above]{img} (DoubleStream_dots.140); 72 | \draw[->] (DoubleStream_02.350) -- node[below]{txt} (DoubleStream_dots.220); 73 | \draw[->] (DoubleStream_dots.40) -- node[above]{img} (DoubleStream_03.170); 74 | \draw[->] (DoubleStream_dots.320) -- node[below]{txt} (DoubleStream_03.190); 75 | 76 | % Concat streams node between DS and SS nodes 77 | \node (streams_cat) at (32, -6) [op] {\verb|CAT|}; 78 | \draw[->] (DoubleStream_03.10) -- node[above]{img} (streams_cat); 79 | \draw[->] (DoubleStream_03.350) -- node[below]{txt} (streams_cat); 80 | 81 | % SINGLE STREAM BLOCKS 82 | \node (SingleStream_01) at (36, -6) [stream] {SingleStream\\Block}; 83 | \node (SingleStream_02) at (42, -6) [stream] {SingleStream\\Block}; 84 | \node (SingleStream_dots) at (46.5, -6) [minimum height=1.5cm] {\textbf{\dots}}; 85 | \node (SingleStream_03) at (51, -6) [stream] {SingleStream\\Block}; 86 | 87 | % Connect SS blocks together 88 | \draw[->] (streams_cat) -- (SingleStream_01); 89 | \draw[->] (SingleStream_01) -- (SingleStream_02); 90 | \draw[->] (SingleStream_02) -- (SingleStream_dots); 91 | \draw[->] (SingleStream_dots) -- (SingleStream_03); 92 | 93 | % END OF THE STREAM CHAIN 94 | \node (last) at (56, -6) [block] {LastLayer}; 95 | \node (cross) at (54.25, -8) {\Huge $\times$}; 96 | \draw[->] (SingleStream_03) -- node[above right]{img} (last); 97 | \draw[->] (SingleStream_03) -| node[below left]{txt} (cross); 98 | \node (final) at (58, -6) {}; 99 | \draw[->] (last) -- (final); 100 | 101 | % vec and PE connections to the stream blocks (double and single) 102 | \draw[->] (vec_plus) -| node[above left]{vec} (DoubleStream_01); 103 | \draw[->] (vec_plus) -| (DoubleStream_02); 104 | \draw[->] (vec_plus) -| (DoubleStream_03); 105 | \draw[->] (vec_plus) -| (SingleStream_01); 106 | \draw[->] (vec_plus) -| (SingleStream_02); 107 | \draw[->] (vec_plus) -| (SingleStream_03); 108 | \draw[->] (EmbedND) -| ++(5, 3) -| node[below left]{P.E.} (DoubleStream_01); 109 | \draw[->] (EmbedND) -| ++(5, 3) -| (DoubleStream_02); 110 | \draw[->] (EmbedND) -| ++(5, 3) -| (DoubleStream_03); 111 | \draw[->] (EmbedND) -| ++(5, 3) -| (SingleStream_01); 112 | \draw[->] (EmbedND) -| ++(5, 3) -| (SingleStream_02); 113 | \draw[->] (EmbedND) -| ++(5, 3) -| (SingleStream_03); 114 | 115 | % CURLY BRACES FOR NUMBER OF DS AND SS BLOCKS 116 | \draw[decoration={brace}, decorate] (11.1, -3) -- node[above, yshift=.75cm]{\huge $N = 19$\\DoubleStream blocks} (30, -3); 117 | \draw[decoration={brace}, decorate] (34.25, -3) -- node[above, yshift=.75cm]{\huge $M = 38$\\SingleStream blocks} (52.75, -3); 118 | \end{tikzpicture} 119 | \end{document} -------------------------------------------------------------------------------- /flux_architecture_diagram.drawio: -------------------------------------------------------------------------------- 1 | 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 -------------------------------------------------------------------------------- /flux_architecture_diagram.png: -------------------------------------------------------------------------------- https://raw.githubusercontent.com/brayevalerien/Flux.1-Architecture-Diagram/5d6718e283d64105beaf73c978a5de6bb95a4b3c/flux_architecture_diagram.png --------------------------------------------------------------------------------