作者avans (阿緯)
看板AI_Art
標題[StaD] Flux.1的架構圖 By.TheLatentExplorer
時間Sat Nov 16 17:45:28 2024
今天查詢Flux.1在reddit找到一篇覺得很棒的文章
[A detailled Flux.1 architecture diagram]
作者:TheLatentExplorer
看完後對Flux.1的Blocks結構(double & single)與作用有了一些概略的理解了
__________________
底下內文使用chatgpt翻譯
__________________
一個月前,u/nrehiew_ 在 X 上發佈了一張 Flux 架構的圖,
後來這張圖被 u/pppodong 轉發到 Reddit 上。
這張圖很棒,但對我來說有點亂,而且缺少了一些細節,讓我無法更好地理解 Flux.1。
所以我決定自己做一張,並想分享在這裡,也許有些人會感興趣。
以這種方式展示完整的架構幫助我很大,尤其是因為這個模型沒有真正的論文
(真可惜...)。
我必須做出幾個表示上的選擇,我很希望聽聽你們的批評,這樣我可以改進,
並在未來做出更好的版本。
我計劃使用 TikZ 製作一個更乾淨的版本,並標註完整的張量形狀,
但由於模型相當龐大,我需要先做個草稿,所以我在 draw.io 製作了這個版本。
我擔心 Reddit 會把圖片壓縮得太厲害,所以我把它上傳到 Github,請點擊這裡查看。
https://github.com/brayevalerien/Flux.1-Architecture-Diagram/
__________________
Flux.1 global architecture
https://i.imgur.com/u9tNMu9.png
SingleStream block
https://i.imgur.com/RyIXL5u.png
DoubleStream block
https://i.imgur.com/DZ14PUR.png
MLP Emb./LastLayer/Modulation/QKNorm
https://i.imgur.com/DIEiATa.png
__________________
[wh @nrehiew_] Flux's Architecture diagram :)
https://x.com/nrehiew_/status/1820404554795802684
[TheLatentExplorer] A detailled Flux.1 architecture diagram
https://reurl.cc/DKn2ed
https://www.reddit.com/r/StableDiffusion/comments/1fds59s/
a_detailled_flux1_architecture_diagram/
__________________
底下是zefy_zef將架構圖餵給claude後的解釋
https://reurl.cc/qnzR6D
__________________
感謝您提供這張圖片。這個圖示展示了 Flux.1 的global架構,
這似乎是一個影像生成模型。讓我為您拆解關鍵組件和結構:
主要架構(上半部分):
該模型的左側有一系列輸入,包括「img」、「cond_emb」、「guidances」等。
這些輸入經過各種處理步驟後,進入主流程。
架構的核心由 N=19 個 DoubleStream 區塊組成,接著是 M=38 個 SingleStream 區塊。
從 SingleStream 區塊的輸出到 DoubleStream 區塊的輸入之間有一個反饋循環。
SingleStream 區塊(左下角):
這顯示了 SingleStream 區塊的內部結構。
它包括幾個處理步驟,並包含跳躍連接和乘法操作。
DoubleStream 區塊(右下角):
這顯示了 DoubleStream 區塊的較複雜結構。
它有兩個主要的平行流程,並且有交叉連接和多個處理步驟。
附加組件(底部):
- MLP Emb.: 用於嵌入的多層感知機。
- LastLayer: 模型的最終處理層。
- Modulation: 用於調製模型輸出的組件。
- QKNorm: 可能是注意力機制中查詢和鍵操作的正規化技術。
參考資料:
該圖示引用了幾個來源,包括 GitHub 倉庫和研究論文,
表明這一架構是基於或受現有領域工作啟發的。
這個架構似乎是一個複雜的影像生成模型,融合了來自各種先進技術的元素。
DoubleStream 和 SingleStream 區塊可能允許在不同的尺度或
抽象層次上進行複雜的特徵處理和精煉。
__________________
zefy_zef繼續將相關python程式給claude後的解釋:
__________________
感謝您提供 model.py 的內容。這個檔案確實給我們提供了對 Flux.1 架構的寶貴洞見。
讓我為您詳細解析:
FluxParams 資料類別:
這定義了模型的超參數,包括輸入維度、隱藏層大小、頭數、
不同區塊的深度以及其他配置選項。
Flux 類別:
這是主要的模型類別,實現了我們在圖示中看到的架構。
Flux 類別的主要組件:
a. 輸入處理:
- pe_embedder: 用於輸入序列的位置信嵌入。
- img_in: 用於處理影像輸入的線性層。
- time_in: 用於處理時間步驟信息的 MLP。
- vector_in: 用於處理向量輸入的 MLP(可能是圖示中的 'y')。
- guidance_in: 用於處理引導信息的可選 MLP。
- txt_in: 用於處理文本輸入的線性層。
b. 主要架構:
- double_blocks: 一組 DoubleStreamBlock 模組(圖示中的 N=19)。
- single_blocks: 一組 SingleStreamBlock 模組(圖示中的 M=38)。
- final_layer: 用於產生最終輸出的 LastLayer 模組。
c. Forward 方法:
- 處理輸入(影像、文本、時間步驟、y、引導)。
- 應用位置編碼。
- 將數據傳遞通過 DoubleStreamBlocks。
- 串接文本和影像特徵。
- 將結合的特徵傳遞通過 SingleStreamBlocks。
- 應用最終層來產生輸出。
此實現與圖示高度一致:
它展示了各種輸入如何被處理和結合。
DoubleStreamBlocks 分別處理影像和文本,但有交互作用。
SingleStreamBlocks 處理結合後的特徵。該模型使用時間步驟嵌入,
這是擴散模型中常見的做法。
該架構表明這是一個多模態模型,能夠處理影像和文本輸入,
可能用於文本到影像生成或基於文本提示的影像編輯等任務。
__________________
架構圖TheLatentExplorer作者對claude見解的回覆:
這基本上是對的,雖然有點模糊!
不過要小心,單流區塊(SingleStream block)
並沒有回饋迴路到雙流區塊(DoubleStream block)。
我對 Claude 的視覺能力印象深刻,也很佩服你做出的精彩總結!
__________________
底下是ChodaGreg詢問single與double stream的區別
https://reurl.cc/36rn9V
__________________
ChodaGreg:
單流(single stream)和雙流(double stream)區塊有什麼區別?
它們使用不同的 CLIP 嗎?
TheLatentExplorer:
雙流區塊會將影像和文本信息分開處理,並使用像是時間步驟、
CLIP 輸出和位置嵌入(PE)等信息來調製它們。
而單流區塊則將影像和文本流視為一體,允許兩者之間有更靈活的信息交換
(例如文本可以關注影像,反之亦然)。
towelpluswater:
你的圖示讓我對這些資料集有很多想法。
與其用標題描述影像是什麼,或根本不標註,
或者使用觸發詞——那麼如果我們直接從 VAE 獲得潛在表示,
並使用描述詞作為每一層的轉換,會怎樣呢?
例如:“讓它更紅”搭配著影像逐步變紅的進程,
但資料集本身(或許是其中的一部分)是影像,而每一階段產生的嵌入表示。
這樣每一個進程就與雙流和單流區塊中的潛在表示相對應,並且與 T5 轉換文本搭配。
有人嘗試過這個方法嗎?這是普遍的知識嗎?是一個壞主意還是好主意?
在昨晚讀到這些之後我一直無法停止思考。
我在 flux-fp8-api 上寫了一個簡單的原型(嗯,是 Claude 按照我的規格寫的),
由於這些都是程式碼,對我來說比使用 Comfy 更簡單——
如果這是大家普遍知道的事情或是有人嘗試過這個方法的話,我很希望能聽聽你的回饋。
TheLatentExplorer:
我不太確定理解你的意思——如果你有程式碼可以分享,我很樂意閱讀。
有一個用來訓練 Flux.1 滑動 LoRA 的腳本,我沒有嘗試過,
但或許你可以達到類似的效果。
至於這個想法,我不太確定文本是與影像編輯模型互動的最佳方式。
談到這個,我很少單純使用 txt2img,通常都會搭配 ControlNet。
不過它可能會是一個有趣的工具,讓影像編輯對更多人來說變得更容易。
__________________
Koke_Cacao進行比較後發現的一些內容
https://reurl.cc/d1z3ok
__________________
Koke_Cacao:
查看架構程式碼並將其與 SD3、PixArt 和原始的 DiT 進行比較,
Flux 中有幾個有趣或令人震驚的地方。
(1) 單流區塊(single stream block)
是並行運行線性層和注意力機制(attention),而不是順序運行。
(2) 雙流區塊(double stream block)
本質上是 T5 和影像 token 之間的標籤串接,但每個 token 都是單獨正規化的。
對於 (1),我無法找到一個好的解釋,
除了在犧牲線性結構的情況下增加更多的並行性。
至於 (2),我個人認為,與交叉注意力(cross-attention)相比,
token 串接有些浪費。
這兩個設計選擇似乎都是針對擁有更大顯示記憶體的 GPU 進行優化的。
從程式碼來看,雙流區塊與 SD3 論文中的 MMDiT 完全相同。
而單流區塊則與原始 DiT 完全相同。
對於需要源程式碼的人:
https://github.com/black-forest-labs/flux/blob/main/src/flux/model.py
另外,感謝你指出單流區塊來自
https://arxiv.org/pdf/2302.05442
__________________
最後的這個是我覺得講的不錯的flux.1原始碼解讀文章:
Stable Diffusion 3「精神續作」FLUX.1 原始碼深度前瞻解讀
https://zhouyifan.net/2024/09/03/20240809-flux1/
__________________
--
※ 發信站: 批踢踢實業坊(ptt.cc), 來自: 220.129.21.173 (臺灣)
※ 文章網址: https://webptt.com/m.aspx?n=bbs/AI_Art/M.1731750338.A.C2D.html