LoRA嗡午,英文全稱Low-Rank Adaptation of Large Language Models囤躁,直譯為大語言模型的低階適應(yīng),這是微軟的研究人員為了解決大語言模型微調(diào)而開發(fā)的一項(xiàng)技術(shù)荔睹。
比如狸演,GPT-3有1750億參數(shù),為了讓它能干特定領(lǐng)域的活兒僻他,需要做微調(diào)宵距,但是如果直接對(duì)GPT-3做微調(diào),成本太高太麻煩了中姜。
LoRA的做法是消玄,凍結(jié)預(yù)訓(xùn)練好的模型權(quán)重參數(shù)跟伏,然后在每個(gè)Transformer(Transforme就是GPT的那個(gè)T)塊里注入可訓(xùn)練的層,由于不需要對(duì)模型的權(quán)重參數(shù)重新計(jì)算梯度翩瓜,所以受扳,大大減少了需要訓(xùn)練的計(jì)算量。
研究發(fā)現(xiàn)兔跌,LoRA的微調(diào)質(zhì)量與全模型微調(diào)相當(dāng)勘高,要做個(gè)比喻的話,就好比是大模型的一個(gè)小模型坟桅,或者說是一個(gè)插件华望。
根據(jù)顯卡性能不同,訓(xùn)練一般需要一個(gè)到幾個(gè)小時(shí)的時(shí)間仅乓,這個(gè)過程俗稱煉丹赖舟!
主要步驟有以下這些,話不多說夸楣,開整!
1. 顯卡
首先是要有顯卡了宾抓,推薦8G顯存以上的N卡。然后就是裝GPU驅(qū)動(dòng)豫喧,可以參考我以前文章centos中docker使用GPU
2. 訓(xùn)練環(huán)境
自從有了docker石洗,我就不喜歡在宿主機(jī)上裝一堆開發(fā)環(huán)境了,所以這次就直接使用stable-diffusion-webui
帶webui打包好的鏡像紧显,也方便訓(xùn)練完成以后測(cè)試讲衫。推薦一下 kestr3l/stable-diffusion-webui 這個(gè)鏡像,是基于 nvidia/cuda:11.7.1-devel-ubuntu22.04 鏡像孵班,本人親自測(cè)試過涉兽,可用的。
附一個(gè)我用的 docker-compose.yml
文件
version: "3"
services:
sd-webui:
image: kestr3l/stable-diffusion-webui:1.1.0
container_name: sd-webui
restart: always
ports:
- "7860:7860"
- "7861:7861"
ulimits:
memlock: -1
stack: 67108864
shm_size: 4G
deploy:
resources:
limits:
cpus: "8.00"
memory: 16G
reservations:
devices:
- capabilities: [gpu]
volumes:
# 這里主要是方便映射下載的模型文件
- ./models:/home/user/stable-diffusion-webui/models:cached
# 修改容器的默認(rèn)啟動(dòng)腳本重父,方便我們手動(dòng)控制
- ./entrypoint-debug.sh:/usr/local/bin/entrypoint.sh:cached
entrypoint-debug.sh
文件內(nèi)容:
#! /bin/sh
python3
可以去 civitai 下載 stable diffusion 的模型花椭,放到宿主機(jī)的 ./models/Stable-diffusion
目錄下面,也可以去下載一些LoRA模型丟在./models/Lora
目錄下房午。
模型準(zhǔn)備完畢了就可以跑個(gè) stable diffusion 圖形化界面試試看, 執(zhí)行./webui.sh -f --listen
命令矿辽,啟動(dòng)之前會(huì)下載安裝很多依賴包,國(guó)內(nèi)環(huán)境不太順郭厌,可以上代理安裝袋倔。
如果輸出以下內(nèi)容,則表示安裝成功:
root@cebe51b82933:/home/user/stable-diffusion-webui# ./webui.sh -f --listen
################################################################
Install script for stable-diffusion + Web UI
Tested on Debian 11 (Bullseye)
################################################################
################################################################
Running on root user
################################################################
################################################################
Repo already cloned, using it as install directory
################################################################
################################################################
Create and activate python venv
################################################################
################################################################
Launching launch.py...
################################################################
./webui.sh: line 168: lspci: command not found
Python 3.10.6 (main, Nov 14 2022, 16:10:14) [GCC 11.3.0]
Commit hash: <none>
Installing requirements for Web UI
Launching Web UI with arguments: --listen
No module 'xformers'. Proceeding without it.
LatentDiffusion: Running in eps-prediction mode
DiffusionWrapper has 859.52 M params.
Loading weights [fc2511737a] from /home/user/stable-diffusion-webui/models/Stable-diffusion/chilloutmix_NiPrunedFp32Fix.safetensors
Applying cross attention optimization (Doggettx).
Textual inversion embeddings loaded(0):
Model loaded in 16.0s (0.8s create model, 14.9s load weights).
Running on local URL: http://0.0.0.0:7860
To create a public link, set `share=True` in `launch()`.
打開瀏覽器訪問:http://127.0.0.1:7860 或者 http://內(nèi)網(wǎng)ip:7860 就可以AI繪畫了
不得不說 chilloutmix_NiPrunedFp32Fix 模型生成的圖片是針不戳??折柠!
3. 安裝訓(xùn)練圖形化界面
為了降低訓(xùn)練門檻宾娜,這里選用的是基于Gradio做的一個(gè)WebGui圖形化界面,該項(xiàng)目在GitHub上叫Kohya's GUI扇售。
# 下載項(xiàng)目
git clone https://github.com/bmaltais/kohya_ss.git
# 執(zhí)行安裝腳本
cd kohya_ss
bash ubuntu_setup.sh
由于是在docker內(nèi)部執(zhí)行前塔,ubuntu_setup.sh 腳本可能有問題嚣艇,所以我一般是直接進(jìn)入容器,手動(dòng)單條執(zhí)行
apt install python3-tk
python3 -m venv venv
source venv/bin/activate
pip install torch==1.12.1+cu116 torchvision==0.13.1+cu116 --extra-index-url https://download.pytorch.org/whl/cu116
pip install --use-pep517 --upgrade -r requirements.txt
pip install -U -I --no-deps https://github.com/C43H66N12O12S2/stable-diffusion-webui/releases/download/linux/xformers-0.0.14.dev0-cp310-cp310-linux_x86_64.whl
執(zhí)行accelerate config
命令华弓,生成對(duì)應(yīng)配置文件食零,選項(xiàng)如下:
(venv) root@cebe51b82933:/home/user/kohya_ss# accelerate config
2023-03-13 06:45:22.678222: I tensorflow/core/platform/cpu_feature_guard.cc:193] This TensorFlow binary is optimized with oneAPI Deep Neural Network Library (oneDNN) to use the following CPU instructions in performance-critical operations: AVX2 FMA
To enable them in other operations, rebuild TensorFlow with the appropriate compiler flags.
2023-03-13 06:45:22.922383: E tensorflow/stream_executor/cuda/cuda_blas.cc:2981] Unable to register cuBLAS factory: Attempting to register factory for plugin cuBLAS when one has already been registered
2023-03-13 06:45:23.593040: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer.so.7'; dlerror: libnvinfer.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-11.7/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
2023-03-13 06:45:23.593158: W tensorflow/stream_executor/platform/default/dso_loader.cc:64] Could not load dynamic library 'libnvinfer_plugin.so.7'; dlerror: libnvinfer_plugin.so.7: cannot open shared object file: No such file or directory; LD_LIBRARY_PATH: /usr/local/cuda-11.7/lib64:/usr/local/nvidia/lib:/usr/local/nvidia/lib64
2023-03-13 06:45:23.593177: W tensorflow/compiler/tf2tensorrt/utils/py_utils.cc:38] TF-TRT Warning: Cannot dlopen some TensorRT libraries. If you would like to use Nvidia GPU with TensorRT, please make sure the missing libraries mentioned above are installed properly.
--------------------------------------------------------------------------------------------------In which compute environment are you running?
This machine
--------------------------------------------------------------------------------------------------Which type of machine are you using?
No distributed training
Do you want to run your training on CPU only (even if a GPU is available)? [yes/NO]:NO
Do you wish to optimize your script with torch dynamo?[yes/NO]:NO
Do you want to use DeepSpeed? [yes/NO]: NO
What GPU(s) (by id) should be used for training on this machine as a comma-seperated list? [all]:all
--------------------------------------------------------------------------------------------------Do you wish to use FP16 or BF16 (mixed precision)?
fp16
accelerate configuration saved at /root/.cache/huggingface/accelerate/default_config.yaml
4. 啟動(dòng)訓(xùn)練圖形化界面
執(zhí)行命令python kohya_gui.py --listen 0.0.0.0 --server_port 7861 --inbrowser --share
(venv) root@cebe51b82933:/home/user/kohya_ss# python kohya_gui.py --listen 0.0.0.0 --server_port 7861 --inbrowser --share
Load CSS...
Running on local URL: http://0.0.0.0:7861
Running on public URL: https://49257631b1b39d3db5.gradio.live
This share link expires in 72 hours. For free permanent hosting and GPU upgrades (NEW!), check out Spaces: https://huggingface.co/spaces
這時(shí)候?yàn)g覽器就可以打開http://127.0.0.1:7861 端口了,界面如下:
5. 準(zhǔn)備要訓(xùn)練的圖片
找到你要用來訓(xùn)練的一些圖片放到統(tǒng)一文件夾下寂屏,建議15張以上贰谣,我這里就用湯唯的照片:
然后打開stable diffusion webui來預(yù)處理這些圖片:
點(diǎn)擊Preprocess
按鈕,等待處理完成迁霎。順利的的話會(huì)在dest文件夾下生成512*512的圖片吱抚,和描述詞文件
6. 開始訓(xùn)練
我們?nèi)ビ?xùn)練的界面,需要設(shè)置一堆參數(shù)考廉,直接看圖吧
建議新建立文件夾秘豹,比如我這里叫train_lora,在文件夾里創(chuàng)建image芝此、log和model三個(gè)文件夾憋肖,其中因痛,image里存放的圖片就是預(yù)處理生成的圖片婚苹。
image里的預(yù)處理圖片不能直接放在里面,需要在里面創(chuàng)建一個(gè)文件夾鸵膏,文件夾的命名非常有講究膊升。
已知,LoRa的訓(xùn)練需要至少1500步谭企,而每張圖片至少需要訓(xùn)練100步廓译。
如果我們有15張或者15張以上張圖片,文件夾就需要寫上100_Hunzi债查。
如果訓(xùn)練的圖片不夠15張非区,比如10張,就需要改為150_Hunzi盹廷,以此類推征绸。
這部分很重要,一定要算清楚俄占。
當(dāng)然管怠,這也正是LoRa強(qiáng)大的地方,用這么少的圖片即可完成訓(xùn)練缸榄。
點(diǎn)擊訓(xùn)練按鈕渤弛,開始煉丹:
生成的丹就在train_lora/model文件夾下面:
最終使用這個(gè)丹的生成的圖片效果展示: