前提條件
- 大模型學習機預裝了Llama 2-7b-chat模型與stable-diffuison-base-v2.1模型, 以及配套的開源服務框架text-generation-webui與stable-diffuison-webui,使您不需單獨進行下載模型與配置環境。
- 云主機開通與如何登錄網頁頁面參見部署文檔。
1. 模型微調簡介
由于基礎大模型參數量極多,訓練需要的資源量極大,因此基于基礎大模型進行微調的技術應運而生。針對StableDiffusion進行微調的技術主流的有4種,分別是:
(1)Textual Inversion:不改變原模型結構與參數,只增加新的關鍵詞并訓練新的輸入embedding。生成的新模型很小,大約幾十KB。由于沒有影響原模型的結構與參數,因此調整能力有限。
(2)Hypernetwork:在原模型的cross-attention網絡結構中插入一層新網絡,與原模型結構串行執行。由于新網絡會平均作用在整個模型上,因此更適宜訓練繪畫風格。模型大小約幾十MB。
(3)LoRA:在原模型的cross-attention網絡結構中插入多個小網絡結構,與原模型結構并行執行。實踐證明這種結構的效果要優于Hypernetwork,因此LoRA是當前最主流的微調方案。模型大小約幾十MB。
(4)Dreambooth:對整個原模型的參數進行微調,訓練成本高,生成的模型相當于一個新的基礎大模型。模型大小約幾GB。
已有LoRA模型如何加載可參考圖像生成模型使用最佳實踐。
本文以Textual Inversion方式為例,介紹通過私有數據微調模型并進行圖像生成的流程。如果您有微調新的LoRA模型的需求,本文也給出了相關插件的安裝說明。
2. 準備訓練數據
2.1 圖片文件準備
準備一批用于訓練的圖片,可以是同一人物/物體的不同視角,也可以是同一種繪畫風格。
本示例中采用了同一只狗狗的不同視角圖片。
2.2 圖片文件上傳與裁切
在Extras頁面的Batch Process下點擊文字,選擇圖片文件。
選擇Scale to將圖片裁切到512x512的大小。
點擊generate按鈕,等待圖片上傳完畢。
注意目前某些鏡像中尚未預裝deepbooru功能所需的模型。當您首次上傳圖片時,系統會訪問github進行模型下載,該模型大小為614MB。依據您的網絡帶寬,這可能需要幾分鐘的時間。
上傳完成的圖片在云主機的 /root/stable-diffusion-webui/output/extras-images目錄下。
建議您將文件通過mv命令移動到其他文件夾,方便區分不同的訓練文件。例如:
cd /root/stable-diffusion-webui
mkdir -p train/picdata1
mv output/extras-images/* train/picdata1
您還可查看每張圖片生成的txt文件,檢查反推出來的提示詞是否符合預期,并刪除識別錯誤的提示詞。
例如本示例中模式識別的提示詞中有一個多余的”shiba inu”,需要將其刪除。
3 啟動訓練
stable-diffusion-webui框架在啟動時默認已經加載好了基礎大模型,無需做額外操作。
3.1 生成初始模型文件
首先需要在Train頁面的Create embedding標簽下,創建一個空的初始模型文件。
- Name: 小模型的名稱,也是未來使用小模型時需要用到的專有提示詞名稱。例如我們為訓練圖片中的狗狗取名字叫”八四”,因此模型的Name可以叫”dogbasi”,未來使用模型時也需要用”dogbasi”觸發。注意這里的名稱必須是特有的,避免和模型已有的關鍵詞重復。
- Number of vectors per token: 小模型參數的維度,數值越大模型擬合能力越強,但也可能導致擬合過強。推薦設置在3-7左右。如果是學習繪畫風格,一般設置盡量小一些; 如果是學習具體物體,可以設置大一些。
3.2 調整訓練配置
在Train頁面的Train標簽頁,修改如下設置:
- Embedding: 選擇3.1步驟中創建過的初始embedding模型。
- Dataset directory: 填寫2.2步驟中上傳與調整過的訓練圖片目錄。
- Prompt templete: 如果期望訓練繪畫風格,選擇style_filewords.txt;如果期望訓練具體物體,選擇subject_filewords.txt。
- Max Steps: 訓練的總輪次,一般在圖片數量不大的情況下(10張圖左右),推薦設置為1000及以上,以保證訓練質量。
3.3 啟動訓練
點擊頁面底部Train Embedding按鈕開始訓練,等待進度條結束。
注意在batch size默認設置為1的情況下,訓練需要消耗6G顯存。
3.4 加載微調過的模型
在txt2img頁面的Textual inversion標簽下,點擊右側的刷新按鈕,如果看到新訓的小模型即代表成功。
3.5 使用模型示例
在提示詞prompt中附加上微調過的小模型名稱,即可生成類似訓練數據的新圖片。如果發現圖片質量不佳,可以嘗試加大訓練時的Max Steps,或者加大Create embedding時的Number of vectors per token,或者準備更多高質量的訓練圖片(數據最關鍵)。
4. 微調新LoRA模型插件安裝
stable-diffusion-webui本體沒有微調LoRA模型的功能,需要安裝Dreambooth插件。下面將以此為例介紹如何在本框架中安裝插件。
stable-diffusion-webui本身提供了自動下載和安裝插件的功能(見extensions頁),但由于github和pip庫訪問受限,自動下載無法成功。因此本文采用了手動安裝的方式。
手動安裝需要您通過ssh或遠程登錄等方式登錄到云主機系統內,您可以參考[修改大模型學習機登錄密碼]的相關內容。
同時,由于涉及到服務運行環境的修改,因此所有操作都將在docker 容器內執行 。進入容器的方式參考:
# 檢查容器狀態
docker ps -a
# 進入容器
docker exec -it stable_diffusion bash
注意執行完進入容器的命令后,命令行界面并不會有明顯變化,您可以通過執行命令docker ps是否能成功,來判斷當前在容器內還是云主機內。
4.1 配置github地址(可選)
如果您在執行git clone時始終因為網絡問題無法成功,則可參考本節內容。
(1) 獲取可用的ip地址
注意1. IP地址并不會一直固定,未來如無法訪問github,您需要重新確認最新的IP地址。
2. 可以使用代理服務器徹底解決問題,但注意如果設置了http_proxy系統變量,需要在使用完畢后取消設置,或者在/root/stable-diffusion-webui/run.sh啟動腳本中增加一項`--share \`,否則webui服務會報錯無法訪問localhost。
(2) 修改hosts文件
請確保當前在docker容器內。
通過vim編輯器修改/etc/hosts文件,添加如下內容:
# 從ipaddress查到的真實ip地址
140.82.114.3 github.com
完成配置后,訪問github相關鏈接成功概率提升(但不保證一定成功)。
4.2 下載插件文件
請確保當前在docker容器內。
進入到/root/stable-diffusion-webui/extensions目錄下,并下載dreambooth插件。
cd /root/stable-diffusion-webui/extensions
git clone //github.com/d8ahazard/sd_dreambooth_extension.git
遇到連接失敗可以多重試幾次,如果始終失敗,則參考4.1節的內容手動配置github地址。
4.3 安裝插件需要的依賴庫
請確保當前在docker容器內。
stable-diffusion-webui采用了python venv的方式進行環境隔離,首先需要進入到虛擬環境。
cd /root/stable-diffusion-webui
source venv/bin/activate
執行成功后,命令行界面開頭將出現(venv)標識。
然后在插件文件夾內安裝依賴庫。由于pip庫訪問受限問題,這里采用了清華的鏡像源。
cd /root/stable-diffusion-webui/extensions/sd_dreambooth_extension
pip install -r requirements.txt -i //pypi.tuna.tsinghua.edu.cn/simple
安裝成功后將出現如下提示:
4.4 重啟服務以應用插件
如果您當前在docker容器環境中,可直接執行exit命令退出到云主機內。
參考[大模型學習機服務啟停最佳實踐]文檔,重啟stable-diffusion-webui服務:
sh /root/restart_sd_webui.sh
4.5 確認插件安裝完畢
重新登錄頁面后,應多出Dreambooth頁面:
Dreambooth插件的使用方式和上文訓練Textual Inversion是一致的。
(1)在Create頁面創建一個空模型。內容參考下圖。
(2)首次創建時,插件會從github額外下載一些輔助模型,大小約幾百MB。建議您提前自行下載并放到/root/stable-diffusion-webui/models/GFPGAN目錄下,避免等待太長時間。
cd /root/stable-diffusion-webui/models/GFPGAN
wget
//github.com/xinntao/facexlib/releases/download/v0.1.0/detection_Resnet50_Final.pth
wget //github.com/xinntao/facexlib/releases/download/v0.2.2/parsing_parsenet.pth
(3)插件還需要從huggingface網站下載StableDiffusion模型的部分內容,因此需要刪除/root/stable-diffusion-webui/run.sh腳本中的內容:
# 刪除這一行可恢復對huggingface的連接
export HF_HUB_OFFLINE=1 #can not access to
huggingface.io
參考4.1節對github真實ip的配置,也需要對huggingface.co進行相關配置,否則無法訪問。
下載模型數據需要占據大量磁盤空間,建議額外購買50G-100G大小的數據盤,并掛載到/root/stable-diffusion-webui/models/dreambooth目錄下(也可先將當前model文件夾改名,然后直接將數據盤掛載為新的model文件夾,最后將老數據mv進去)。
說明即使配置了真實ip,在訪問huggingface.co時也依然會失敗,建議您使用代理服務器進行連接。配置代理服務器和http_proxy環境變量后,需要在/root/stable-diffusion-webui/run.sh腳本中增加 `--share \`,否則webui服務會報錯無法訪問localhost。
(4)在Concepts頁面設置樣本路徑。
(5)在Parameters頁開啟LoRA訓練。
其他訓練相關的參數您可自行查看和調整(例如訓練輪次,學習率等),本文不再一一贅述。