ComfyUI簡介
ComfyUI是一個基於節點工作流穩定擴散演算法的圖形介面,它透過將穩定擴散的流程巧妙分解成各個節點,成功實現了工作流的精準定製和可靠復現。
基本概念
節點工作流:
ComfyUI的核心是基於節點式的工作流程,這種設計允許使用者將複雜的穩定擴散過程分解為多個可獨立操作的節點,透過連線這些節點來構建和執行工作流。
每個節點代表一個特定的處理步驟,如載入模型、文字編碼、影像取樣、解碼等,節點之間透過資料流相互連線,形成一個完整的處理鏈。
穩定擴散(Stable Diffusion):
穩定擴散是一種文字到影像的人工神經網路模型,能夠理解使用者輸入的文字描述並生成相應的影像。ComfyUI作為這一模型的圖形介面,使得非專業人士也能方便地使用這一技術。
圖形介面(GUI):
ComfyUI提供了一個直觀易用的圖形介面,使用者無需編寫複雜的程式碼,只需透過拖拽節點、設定引數等操作即可完成影像生成任務。
組成結構
主要節點型別:
載入節點(Load Checkpoint):用於載入穩定擴散模型和其他必要的元件,如CLIP模型和VAE模型。
文字編碼節點(CLIP Text Encode):將使用者輸入的文字提示詞編碼成模型可理解的格式,作為影像生成的指導。
取樣節點(KSampler):在潛在空間中生成影像,透過逐步降噪的過程將隨機噪聲轉化為與文字提示匹配的影像。
解碼節點(VAE Decode):將潛在空間中的影像解碼回畫素空間,生成最終的RGB影像。
輔助節點:
除了上述主要節點外,ComfyUI還提供了多種輔助節點,如用於調整影像大小的放大節點、用於載入LoRA的節點等,以滿足使用者的不同需求。
工作流定製:
使用者可以根據自己的需求,透過連線不同的節點來定製工作流。例如,可以先透過載入節點載入模型,然後透過文字編碼節點輸入提示詞,再透過取樣節點生成影像,最後透過解碼節點得到最終影像。
ComfyUI還支援使用者儲存和分享自己的工作流,方便其他使用者複用和修改。
高度定製性和靈活性:
ComfyUI提供了高度的定製性和靈活性,使用者可以透過調整節點的引數和連線方式來實現不同的影像生成效果。
同時,由於其基於節點的工作流設計,ComfyUI還具有較高的可擴充套件性,可以方便地整合新的節點和功能。
下面是教程裡面給出的ComfyUI的基本構成:
透過選擇模型、構建工作流、執行生成與調整引數最佳化等步驟以後就可以生成想要的影像了,下面是根據Task3的教程生成不帶LoRA的指令碼的結果:
LoRA引數最佳化與引數解析
LoRA(Low-Rank Adaptation)是一種高效且輕量級的模型微調技術,尤其適用於大型預訓練模型。它的主要目的是透過在模型中引入少量額外的可訓練引數來適應新的任務,而不需要對整個模型進行微調。這樣既能保持原始模型的強大表示能力,又能有效減少儲存和計算資源的需求。
LoRA的工作原理
-
基礎架構:
- 假設有一個預訓練好的模型,比如一個大型的Transformer模型。
- 該模型由一系列的層組成,每一層通常包括線性變換(如全連線層)和其他元件(如注意力機制)。
-
低秩分解:
- LoRA利用低秩分解的思想,將模型中的每個線性變換層的權重矩陣( W )近似為兩個較小矩陣( A )和( B )的乘積形式,即( W \approx AB ),其中( A )和( B )的形狀設計使得它們的乘積具有較低的秩。
- 這種分解允許我們用較少的引數來逼近原有的權重矩陣的變化。
-
引數化更新:
- 在LoRA中,並不直接修改原始模型的權重,而是引入一組額外的可訓練矩陣( A )和( B )來模擬權重更新。
- 實際上,對於每一個線性層,LoRA會新增一個( A )矩陣和一個( B )矩陣,並將原始的線性變換更新為( W + BA ),其中( W )是預訓練的權重矩陣。
-
微調過程:
- 在微調階段,只有新增加的( A )和( B )矩陣會被最佳化以適應特定任務,而原始模型的權重保持不變。
- 由於( A )和( B )矩陣的大小遠小於原始權重矩陣,這種方法大大減少了需要訓練的引數數量,從而降低了記憶體和計算成本。
-
優勢:
- 輕量化:LoRA只需要很少的額外引數就能實現有效的微調。
- 靈活性:可以在不同的任務之間快速切換,而無需重新訓練整個模型。
- 可組合性:多個LoRA模組可以疊加使用,以便於處理更復雜或多元化的任務需求。
-
應用場景:
- LoRA非常適合用於遷移學習場景,特別是在資源有限的情況下,需要對大規模語言模型進行個性化調整。
總結
LoRA透過引入低秩分解的概念,在不改變原模型結構的前提下實現了高效的模型適應,特別適合於大模型的快速微調。這種方法不僅能夠保持模型原有的泛化能力,還能夠在新任務上獲得良好的效能表現。
這裡記錄一下Task2的微調程式碼以及它們各自對應的含義:
import os
cmd = """
python DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py \ # 選擇使用可圖的Lora訓練指令碼DiffSynth-Studio/examples/train/kolors/train_kolors_lora.py
--pretrained_unet_path models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors \ # 選擇unet模型
--pretrained_text_encoder_path models/kolors/Kolors/text_encoder \ # 選擇text_encoder
--pretrained_fp16_vae_path models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors \ # 選擇vae模型
--lora_rank 16 \ # lora_rank 16 表示在權衡模型表達能力和訓練效率時,選擇了使用 16 作為秩,適合在不顯著降低模型效能的前提下,透過 LoRA 減少計算和記憶體的需求
--lora_alpha 4.0 \ # 設定 LoRA 的 alpha 值,影響調整的強度
--dataset_path data/lora_dataset_processed \ # 指定資料集路徑,用於訓練模型
--output_path ./models \ # 指定輸出路徑,用於儲存模型
--max_epochs 1 \ # 設定最大訓練輪數為 1
--center_crop \ # 啟用中心裁剪,這通常用於影像預處理
--use_gradient_checkpointing \ # 啟用梯度檢查點技術,以節省記憶體
--precision "16-mixed" # 指定訓練時的精度為混合 16 位精度(half precision),這可以加速訓練並減少視訊記憶體使用
""".strip()
os.system(cmd) # 執行可圖Lora訓練
引數名稱 | 引數值 | 說明 |
pretrained_unet_path |
models/kolors/Kolors/unet/diffusion_pytorch_model.safetensors | 指定預訓練UNet模型的路徑 |
pretrained_text_encoder_path |
models/kolors/Kolors/text_encoder | 指定預訓練文字編碼器的路徑 |
pretrained_fp16_vae_path |
models/sdxl-vae-fp16-fix/diffusion_pytorch_model.safetensors | 指定預訓練VAE模型的路徑 |
lora_rank |
16 | 設定LoRA的秩(rank),影響模型的複雜度和效能 |
lora_alpha |
4 | 設定LoRA的alpha值,控制微調的強度 |
dataset_path |
data/lora_dataset_processed | 指定用於訓練的資料集路徑 |
output_path |
./models | 指定訓練完成後儲存模型的路徑 |
max_epochs |
1 | 設定最大訓練輪數為1 |
center_crop |
啟用中心裁剪,用於影像預處理 | |
use_gradient_checkpointing |
啟用梯度檢查點,節省視訊記憶體 | |
precision |
"16-mixed" | 設定訓練時的精度為混合16位精度(half precision) |
解釋一下其中的幾個概念:
VAE
VAE(Variational Autoencoder,變分自編碼器)是一種生成式模型,它結合了自編碼器(Autoencoder)和機率圖模型的優點,主要用於無監督學習和生成資料。VAE 能夠學習資料的潛在表示,並從中取樣以生成新的資料例項。下面詳細介紹 VAE 的工作原理和組成部分。
自編碼器(Autoencoder)
自編碼器是一種無監督學習方法,通常用於降維、特徵學習和生成模型。一個基本的自編碼器包含兩部分:
- 編碼器(Encoder):將輸入資料對映到一個低維的潛在空間(latent space)。
- 解碼器(Decoder):從潛在空間重構出原始資料。
自編碼器的目標是最小化重構誤差,即原始輸入與重構輸出之間的差異。
變分自編碼器(VAE)
變分自編碼器是一種特殊的自編碼器,它在編碼過程中加入了一些額外的約束條件,以確保潛在空間遵循某種先驗分佈(通常是高斯分佈)。這有助於生成新的樣本,並使潛在空間更加平滑和有意義。
VAE 的組成部分
-
編碼器:
- 輸入是原始資料 (x)。
- 輸出是一個機率分佈的引數,通常是均值 (μ) 和標準差 (σ),這些引數定義了一個關於潛在變數 (z) 的高斯分佈 (q(z|x))。
-
解碼器:
- 輸入是從編碼器得到的機率分佈中取樣的潛在變數 (z)。
- 輸出是重建的資料 (x'),目標是使 (x') 儘可能接近原始輸入 (x)。
- 解碼器同樣輸出一個機率分佈,通常也是高斯分佈,用於描述重建資料的機率。
訓練過程
-
取樣:
- 給定輸入 (x),編碼器輸出一個關於 (z) 的高斯分佈 (q(z|x))。
- 從這個分佈中取樣得到 (z)。
-
重構:
- 使用 (z) 作為輸入,透過解碼器得到重建資料的機率分佈 (p(x|z))。
-
損失函式:
- 重構損失(Reconstruction Loss): 衡量原始輸入 (x) 與重建輸出 (x') 之間的差異。
- 正則化項(Regularization Term): 保證潛在變數 (z) 的分佈儘可能接近預設的先驗分佈(通常是標準正態分佈 (N(0, I)))。
損失函式通常表示為:
其中 (D_{KL}) 是 Kullback-Leibler 散度,用來衡量兩個機率分佈之間的差異。
應用
- 生成樣本:透過從先驗分佈中取樣 (z) 並透過解碼器生成新的資料例項。
- 異常檢測:根據重構誤差識別異常資料點。
- 資料增強:生成與訓練集相似的新樣本以增強模型的泛化能力。
- 半監督學習:利用未標記資料進行特徵學習。
總結
VAE 透過在自編碼器的基礎上增加變分推斷的元素,不僅能夠有效地學習資料的潛在表示,還能用於生成新的資料樣本。這種模型在許多領域都有廣泛的應用,包括影像生成、文字生成和推薦系統等。
UNet
UNet 是一種卷積神經網路架構,特別設計用於生物醫學影像分割任務,但它的應用已經擴充套件到了更廣泛的領域,如自然影像分割和其他計算機視覺任務。UNet 最初由 Olaf Ronneberger、Philipp Fischer 和 Thomas Brox 在 2015 年提出,並在 MICCAI(Medical Image Computing and Computer Assisted Intervention)會議上發表。
UNet 架構概述
UNet 採用了編碼器-解碼器結構,其中包含一個收縮路徑(編碼器)和一個擴充套件路徑(解碼器),這兩部分共同構成了一個 U 形結構,這也是其名字“UNet”的由來。
縮減路徑(編碼器)
- 功能:該路徑負責捕獲上下文資訊。
- 組成:通常由多個卷積層和最大池化層組成。
- 操作:每個階段通常包含兩個連續的 3×3 卷積層,後面跟著一個 2×2 的最大池化操作,用於下采樣資料並減少空間維度。
擴充套件路徑(解碼器)
- 功能:該路徑負責利用學習到的上下文資訊來進行精確定位。
- 組成:通常由上取樣操作(雙線性插值或轉置卷積)和卷積層組成。
- 操作:每個階段開始於上取樣操作,然後是兩個 3×3 的卷積層。每個階段還包含了來自縮減路徑的相應層的特徵對映的連線(concatenation),以便恢復丟失的空間細節。
特徵對映連線
- 目的:保留邊緣和其他重要的位置資訊。
- 操作:在每個解碼階段開始之前,從相應的編碼階段複製特徵對映,並與上取樣後的特徵對映進行連線。
UNet 的特點
-
跳躍連線(Skip Connections):這是 UNet 的關鍵特性之一,它允許解碼器直接訪問編碼器中的特徵圖,從而有助於恢復丟失的空間資訊,提高分割精度。
-
對稱結構:U 形結構意味著解碼器部分與編碼器部分具有相同的層次深度,每一對編碼器-解碼器層之間都透過跳躍連線相連線。
-
端到端訓練:整個網路可以使用標準的監督學習方法進行端到端訓練,使用交叉熵損失函式或其他適合分割任務的損失函式。
-
輸入大小靈活:儘管最初的 UNet 架構使用固定大小的輸入影像,但後來的變體允許任意大小的輸入影像。
應用場景
- 生物醫學影像分割:如細胞、組織和器官的分割。
- 自然影像分割:如道路、建築、行人等物件的分割。
- 其他領域:如遙感影像分析、自動駕駛車輛中的障礙物檢測等。
總結
UNet 是一種非常有效的影像分割網路,它透過結合編碼器和解碼器的結構以及跳躍連線,能夠在保持計算效率的同時實現高質量的分割效果。由於其強大的效能和靈活性,UNet 成為了影像分割任務的一個重要基準,並啟發了許多後續的研究和發展。
文字編碼器
Stable Diffusion 是一個用於文字到影像生成的深度學習模型,它基於擴散模型(diffusion models)的框架。Stable Diffusion 的核心在於將文字描述轉換成對應的影像,這一過程涉及到多個元件,其中包括一個文字編碼器。下面詳細解釋 Stable Diffusion 中的文字編碼器的作用及其工作原理。
文字編碼器的作用
文字編碼器的主要任務是將輸入的文字描述轉換成一個向量表示,這個向量表示捕捉了文字的語義資訊,並將被用來指導影像生成過程。在這個過程中,文字編碼器起到了橋樑的作用,它將非結構化的文字資料轉化為結構化的向量表示,從而使模型能夠理解和生成相應的影像。
文字編碼器的工作原理
-
輸入: 文字編碼器接受一段文字描述作為輸入。這段文字可以是對要生成的影像的簡短描述,例如:“一隻穿著宇航服的小貓站在月球表面”。
-
嵌入層:
- 文字首先透過一個嵌入層,將每個詞彙對映到一個高維向量空間。這一步驟將文字中的詞彙轉換為數值形式,便於進一步處理。
-
編碼器網路:
- 文字嵌入之後,它們透過一個編碼器網路。在 Stable Diffusion 中,常用的編碼器是 Transformer 編碼器,它能夠捕獲文字中的長期依賴關係。
- Transformer 編碼器透過多頭自注意力機制(Multi-Head Self-Attention)和前饋神經網路(Feed Forward Network)來處理序列資料,從而提取出文字的深層特徵表示。
-
輸出: 文字編碼器的輸出是一個固定長度的向量,這個向量包含了輸入文字的語義資訊。這個向量隨後會被傳遞給擴散模型的其餘部分,用於指導影像生成的過程。
Stable Diffusion 中的文字編碼器
在 Stable Diffusion 模型中,文字編碼器通常是一個預訓練的 Transformer 編碼器,如 CLIP(Contrastive Language-Image Pre-training)的文字編碼器部分。CLIP 是一個預先訓練的模型,它能夠同時理解影像和文字,並且已經在大量影像-文字對上進行了預訓練,因此它能夠有效地將文字轉換為與影像相關的向量表示。
總結
在 Stable Diffusion 模型中,文字編碼器扮演著至關重要的角色,它將文字描述轉換為能夠指導影像生成的向量表示。這個過程涉及將文字嵌入到向量空間中,並透過 Transformer 編碼器提取高階特徵。最終,這些特徵將被用來引導擴散過程,逐步生成與文字描述相對應的影像。