該存儲庫為AIGC研究人員提供了最簡單的教程代碼,只需幾行使用Lora。使用本手冊,您可以輕鬆地使用來自Huggingface和Cititai的活躍社區的任何Lora模型。
現在,我們還支持控製網絡 - 散佈器,T2-apapter-for-fiffusers。
Microsoft開發了大型語言模型(LORA)的低級改編,以減少可訓練參數的數量,通過學習成對的排名零件矩陣,同時凍結原始權重。洛拉(Lora)試圖微調模型的“殘差”,而不是整個模型:即,訓練
在哪裡
這種訓練技巧對於大型通用基礎模型上的定制模型非常有用。已經建立在官方穩定擴散的頂部的各種文本到圖像模型。現在,有了洛拉,您可以有效地使用更少的資源來培訓自己的模型。
SafetEnsors是一種新的簡單格式,用於通過擁抱的臉安全地存儲張量(與泡菜相對),這仍然很快(零拷貝)。為了效率,許多穩定的擴散模型,尤其是LORA模型都以安全性格式發布。您可以從HuggingFace/SafetEnsors找到更多的優勢,並通過PIP安裝安裝。
pip install safetensors在本教程中,我們顯示將預訓練的洛拉(Lora)加載或插入擴散器框架中。在Huggingface和Cititai中可以找到許多有趣的項目,但主要是在穩定的擴散 - Webui框架中,這對於高級開發人員而言並不方便。我們是由cloneofsimo/lora激勵著加載,合併和插值訓練的洛拉斯的動機。我們主要討論與擴散器不太兼容的安全性格式的模型。
一個完整的模型包括所有需要的模塊(帶有或不帶有LORA層的基本模型),它們通常以.ckpt或.safetensor格式存儲。我們在下面提供了兩個示例,向您展示瞭如何使用。
穩定性/穩定擴散2-1來自HuggingFace。
來自Civitai的Dreamshaper。
您只能下載.ckpt或.safetensors文件。儘管擴散器不支持直接加載它們,但它們確實提供了轉換腳本。首先將擴散器下載到本地。
git clone https://github.com/huggingface/diffusers cd ./diffusers
# assume you have downloaded xxx.safetensors, it will out save_dir in diffusers format.
python ./scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path xxx.safetensors --dump_path save_dir --from_safetensors
# assume you have downloaded xxx.ckpt, it will out save_dir in diffusers format.
python ./scripts/convert_original_stable_diffusion_to_diffusers.py --checkpoint_path xxx.ckpt --dump_path save_dir然後,您可以加載模型
from diffusers import StableDiffusionPipeline
pipeline = StableDiffusionPipeline.from_pretrained(save_dir,torch_dtype=torch.float32)目前,擴散器無法支持LORA中的負載權重(通常為.safetEnsor格式)。在這裡,我們以一種不高的風格展示了我們的嘗試。我們還提供一個例子。
請注意,文件的大小比完整型號小得多,因為它僅包含額外的洛拉權重。在這種情況下,我們必須加載基本模型。僅加載穩定擴散1.5作為基礎也很好,但是要獲得滿足結果,建議下載建議的基本模型。
我們的方法非常簡單:從.safetEnsor中取出重量,然後將Lora的重量合併為受支持的重量。我們不會將.safetensor轉換為其他格式,而是更新基本模型的重量。
我們的腳本應與Huggingface和Cititai的大多數模型一起使用,如果不是,您也可以自己修改代碼。相信我,這真的很簡單,您可以做到。
# the default mergering ratio is 0.75, you can manually set it
python convert_lora_safetensor_to_diffusers.py我們已經在這個問題上為擴散器建立了PR,在此過程中,我們進一步扭曲了轉換功能,以使其更加靈活。如果您不能等待,可以直接檢查它。它應盡快合併為擴散器!
擴散器提供了一個簡單的train_text_to_image_lora.py來訓練您的lora模型。請遵循其說明以安裝要求。
export MODEL_NAME= " CompVis/stable-diffusion-v1-4 "
export DATASET_NAME= " lambdalabs/pokemon-blip-captions "
accelerate launch --mixed_precision= " fp16 " train_text_to_image_lora.py
--pretrained_model_name_or_path= $MODEL_NAME
--dataset_name= $DATASET_NAME --caption_column= " text "
--resolution=512 --random_flip
--train_batch_size=1
--num_train_epochs=100 --checkpointing_steps=5000
--learning_rate=1e-04 --lr_scheduler= " constant " --lr_warmup_steps=0
--seed=42
--output_dir= " sd-pokemon-model-lora "
--validation_prompt= " cute dragon creature " --report_to= " wandb "一旦您使用上述命令訓練了模型,就可以在加載訓練有素的Lora權重後使用StablediffusionPipeline進行推理。您需要傳遞output_dir來加載Lora權重,在這種情況下,這是SD-Pokemon-Model-Lora。
import torch
from diffusers import StableDiffusionPipeline
model_path = " your_path/sd-model-finetuned-lora-t4 "
pipe = StableDiffusionPipeline.from_pretrained( " CompVis/stable-diffusion-v1-4 " , torch_dtype=torch.float16)
pipe.unet.load_attn_procs(model_path)
pipe.to( " cuda " )
prompt = " A pokemon with green eyes and red legs. "
image = pipe(prompt, num_inference_steps=30, guidance_scale=7.5).images[0]
image.save( " pokemon.png " )目前,擴散器僅支持洛拉(Lora)的UNET。我們已經支持並製作了PR,如果您需要的話,請檢查我們的PR或打開問題。
Colossalai已經支持Lora。我們只需要在train_dreambooth_colossalai.py的頂部修改幾行。此示例是為Dreambooth提供的,但是您可以輕鬆地採用常規文本進行圖像培訓。生成的洛拉重量僅用於UNET的注意力層。如果您也想支持文本編碼器,請在擴散器中使用加速框架,因為Colossalai尚不支持多個模型。
from diffusers.loaders import AttnProcsLayers
from diffusers.models.cross_attention import LoRACrossAttnProcessor
# attention here! It is necessaray to init unet under ColoInitContext, not just lora layers
with ColoInitContext(device=get_current_device()):
unet = UNet2DConditionModel.from_pretrained(
args.pretrained_model_name_or_path,
subfolder= " unet " ,
revision=args.revision,
low_cpu_mem_usage=False
)
unet.requires_grad_(False)
# Set correct lora layers
lora_attn_procs = {}
for name in unet.attn_processors.keys ():
cross_attention_dim = None if name.endswith( " attn1.processor " ) else unet.config.cross_attention_dim
if name.startswith( " mid_block " ):
hidden_size = unet.config.block_out_channels[-1]
elif name.startswith( " up_blocks " ):
block_id = int(name[len( " up_blocks. " )])
hidden_size = list(reversed(unet.config.block_out_channels))[block_id]
elif name.startswith( " down_blocks " ):
block_id = int(name[len( " down_blocks. " )])
hidden_size = unet.config.block_out_channels[block_id]
lora_attn_procs[name] = LoRACrossAttnProcessor(
hidden_size=hidden_size, cross_attention_dim=cross_attention_dim
)
unet.set_attn_processor(lora_attn_procs)
lora_layers = AttnProcsLayers(unet.attn_processors)
# DDP
unet = gemini_zero_dpp(unet, args.placement)
# config optimizer for colossalai zero, set initial_scale to large value to avoid underflow
optimizer = GeminiAdamOptimizer(unet,
lr=args.learning_rate,
betas=(args.adam_beta1, args.adam_beta2),
weight_decay=args.adam_weight_decay,
eps=args.adam_epsilon,
initial_scale=2 ** 16,
clipping_norm=args.max_grad_norm)我們走了,唯一的是UNET的初始化方式。僅節省洛拉重量,
torch_unet = get_static_torch_model(unet)
if gpc.get_local_rank(ParallelMode.DATA) == 0:
torch_unet = torch_unet.to(torch.float32)
torch_unet.save_attn_procs(save_path)然後,進行推斷
from diffusers import StableDiffusionPipeline
import torch
model_path = " sd-model-finetuned-lora "
pipe = StableDiffusionPipeline.from_pretrained( " CompVis/stable-diffusion-v1-4 " , torch_dtype=torch.float16)
pipe.unet.load_attn_procs(model_path)
pipe.to( " cuda " )
prompt = " A pokemon with green eyes and red legs. "
image = pipe(prompt, num_inference_steps=30, guidance_scale=7.5).images[0]
image.save( " pokemon.png " )您可能會發現生成的LORA重量僅約3MB大小,這是由於默認設置。為了增加尺寸,您可以手動設置Lora層的等級(低等級分解的尺寸)。
lora_attn_procs[name] = LoRACrossAttnProcessor(hidden_size=hidden_size, cross_attention_dim=cross_attention_dim, rank=128)然後,Lora的重量約為100-200MB。一般而言,洛拉層易於過度貼合,一般而言,在小型數據集(小於1k圖像)上僅訓練100-2000步,批處理大小= 64。
(1)我可以在合併時手動調整洛拉的重量嗎?
是的,這裡的alpha是洛拉的重量。我們已向擴散器提交了PR,在那裡我們提供了靈活的搏動功能。
(2)我只能將lora(.safetensor)轉換為擴散器支持的其他格式嗎?
您可以,但我們不建議,請看到此問題。有很多局限性。例如,我們的腳本無法推廣到所有.safetensors,因為其中一些具有不同的命名。此外,當前的擴散器框架僅支持將Lora添加到UNET的注意層中,而來自Civitai的許多safetEnsor都包含用於其他模塊(例如文本編碼器)的lora權重。但是,應盡快支持文本編碼器的Lora。
(3)我可以混合多個洛拉模型嗎?
是的,唯一的是合併兩次。但是,請小心地設置α(Lora的重量),如果Alpha太大,模型會降低。
(4)這個項目的動機是什麼?
我們發現Civitai平台上有許多令人難以置信的模型,但是大多數Lora權重都採用安全性格式,這對於擴散器用戶而言並不方便。因此,我們編寫一個轉換腳本,以便您可以在擴散器中使用這些Loras。請注意,我們不是穩定擴散 - webui的目標,它已經非常成熟,但作為擴散器的API完全不同。