Dieses Repository bietet AIGC -Forschern den einfachsten Tutorial -Code, um LORA in nur wenigen Zeilen zu verwenden. Mit diesem Handbuch können Sie problemlos mit jedem LORA -Modell von aktiven Gemeinschaften wie Huggingface und Cititai spielen.
Jetzt unterstützen wir auch ControlNet-for-Diffusers, T2i-Adapter-for-Diffusers.
Eine niedrige Anpassung von großer Sprachmodellen (LORA) wurde von Microsoft entwickelt, um die Anzahl der trainierbaren Parameter zu verringern, indem sie Paare von Rank-Decompressungsmatrizen lernt und gleichzeitig die ursprünglichen Gewichte einfriert. Lora versucht, das "Rest" des Modells anstelle des gesamten Modells zu optimieren: dh das Training der
Wo
Dieser Trainingstrick ist sehr nützlich, um maßgeschneiderte Modelle auf einem großen allgemeinen Basismodell zu fungieren. Verschiedene Text -zu -Bild -Modelle wurden auf der offiziellen stabilen Diffusion entwickelt. Jetzt können Sie mit Lora Ihr eigenes Modell mit viel weniger Ressourcen effizient trainieren.
Safetensors ist ein neues einfaches Format zum sicheren Aufbewahren von Tensoren (im Gegensatz zu Gurke), das durch Umarmung freigesetzt wird, und das ist immer noch schnell (null kopisch). Für seine Effizienz werden viele stabile Diffusionsmodelle, insbesondere LORA -Modelle, im Safetensor -Format freigesetzt. Sie finden mehr seine Vorteile von Huggingface/SafeTensoren und installieren sie über PIP -Installation.
pip install safetensorsIn diesem Tutorial zeigen wir, dass Lora vorgebreitet in Diffusoren-Framework geladen oder eingefügt wird. Viele interessante Projekte finden Sie in Huggingface und Cititai, aber hauptsächlich im Rahmen der Stabil-Diffusion-Webui, was für fortschrittliche Entwickler nicht bequem ist. Wir motiviert durch kloneofsimo/lora über das Laden, Verschmelzen und Interpolieren geschulter Loras. Wir diskutieren hauptsächlich Modelle im Safetensor -Format, das nicht gut mit Diffusoren kompatibel ist.
Ein vollständiges Modell enthält alle benötigten Module (Basismodell mit oder ohne Lora -Schichten), sie werden normalerweise im Format. Wir geben unten zwei Beispiele an, um Ihnen zu zeigen, wie Sie zur Hand verwendet werden.
Stabilityai/Stable-Diffusion-2-1 von Huggingface.
Dreamshaper aus Civitai.
Sie können nur die Datei. Obwohl Diffusoren das Laden nicht direkt unterstützen, bieten sie das Konvertierskript an. Download Diffusoren zuerst nach lokal.
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_dirDann können Sie das Modell laden
from diffusers import StableDiffusionPipeline
pipeline = StableDiffusionPipeline.from_pretrained(save_dir,torch_dtype=torch.float32)Im Moment können Diffusoren in Lora (normalerweise im Safetensor -Format) keine Lastgewichte unterstützen. Hier zeigen wir unsere Versuche in einem uneleganten Stil. Wir bieten auch ein Beispiel.
Beachten Sie, dass die Dateigröße viel kleiner als das vollständige Modell ist, da sie nur zusätzliche Lora -Gewichte enthält. Im Fall müssen wir das Basismodell laden. Es ist auch in Ordnung, stabile Diffusion 1.5 als Basis zu laden, aber es wird empfohlen, zufriedenstellende Ergebnisse zu erzielen, um das vorgeschlagene Basismodell herunterzuladen.
Unsere Methode ist sehr unkompliziert: Nehmen Sie das Gewicht von .Safetensor ab und verschmelzen das Gewicht von Lora in ein Gewicht von Diffusoren. Wir konvertieren nicht. Safetensor in ein anderes Format, sondern aktualisieren stattdessen das Gewicht des Basismodells.
Unser Skript sollte gut mit den meisten Modellen von Huggingface und Cititai funktionieren. Wenn nicht, können Sie den Code auch selbst ändern. Glauben Sie mir, es ist wirklich einfach und Sie können es schaffen.
# the default mergering ratio is 0.75, you can manually set it
python convert_lora_safetensor_to_diffusers.pyWir haben in diesem Thema einen PR für Diffusoren gemacht, bei dem wir die konvergierende Funktion so verziehen, dass sie flexibler ist. Sie können es direkt überprüfen, wenn Sie nicht warten können. Es soll bald zu Diffusoren zusammengefasst werden!
Diffusers hat eine einfache train_text_to_image_lora.py bereitgestellt, um Ihr On Lora -Modell zu trainieren. Bitte befolgen Sie die Anweisung, um die Anforderungen zu installieren.
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 "Sobald Sie ein Modell mit dem obigen Befehl geschult haben, kann die Inferenz nach dem Laden der trainierten Lora -Gewichte einfach mit der stabilen Stabilitätspipeline erfolgen. Sie müssen das Output_dir übergeben, um die Lora-Gewichte zu laden, was in diesem Fall SD-Pokemon-Model-Lora ist.
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 " )Derzeit unterstützt Diffusoren nur den Zug Lora für Unet. Wir haben eine PR unterstützt und gemacht. Wenn Sie ihn benötigen, erkundigen Sie sich bitte bei unserem PR oder öffnen Sie ein Problem.
Colossalai unterstützt bereits Lora. Wir müssen nur ein paar Zeilen oben von Train_dreambooth_Colossalai.py modifizieren. Dieses Beispiel ist für Dreambooth, aber Sie können es problemlos regelmäßig Text zum Bildtraining übernehmen. Die erzeugten Lora -Gewichte dienen nur für Aufmerksamkeitsschichten in Unet. Wenn Sie auch Texcodierer unterstützen möchten, verwenden Sie bitte das Rahmen für das Bild in Diffusoren, da Colossalai mehrere Modelle noch nicht unterstützt.
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)Hier gehen wir, das einzige, was die Initialisierungsmethode der Unet ist. Nur Lora -Gewichte zu sparen,
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)Dann inferenzieren Sie
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 " )Sie können feststellen, dass das generierte Lora -Gewicht nur etwa 3 MB Größe beträgt. Dies liegt an der Standardeinstellung. Um die Größe zu erhöhen, können Sie den Rang (Dimension für die Zersetzung mit niedrigem Rang) für Lora -Schichten manuell einstellen.
lora_attn_procs[name] = LoRACrossAttnProcessor(hidden_size=hidden_size, cross_attention_dim=cross_attention_dim, rank=128)Anschließend haben die Lora-Gewichte etwa 100 bis 200 MB. Beachten Sie, dass Lora -Schichten im Allgemeinen leicht zu übertreiben sind. Im Allgemeinen sollte es ausreichen, nur 100 bis 2000 Schritte auf kleinen Datensätzen (weniger als 1K -Bilder) mit Stapelgröße = 64 zu trainieren.
(1) Kann ich das Gewicht von Lora beim Zusammenführen manuell anpassen?
Ja, das Alpha hier ist das Gewicht für Lora. Wir haben Diffusoren einen PR eingereicht, bei dem wir die flexible Warppenfunktion bereitstellen.
(2) Kann ich nur Lora (.safetensoren) in andere Formate umwandeln, die Diffusoren unterstützt haben?
Sie können, aber wir schlagen nicht vor, sehen Sie diese Probleme. Es gibt viele Einschränkungen. Zum Beispiel kann unser Skript nicht auf alle .Safetensoren verallgemeinern, da einige von ihnen unterschiedliche Benennungen haben. Außerdem unterstützt der aktuelle Diffusors -Framework nur das Hinzufügen von Lora in UNETs Aufmerksamkeitsschichten, während viele .Safetensoren von Civitai Lora -Gewichte für andere Module wie Text -Encoder enthalten. Aber Lora für Text Encoder sollte bald unterstützt werden.
(3) Kann ich mehr als ein Lora -Modell mischen?
Ja, das einzige ist, zweimal zusammenzuführen. Bitte setzen Sie das Alpha (Gewicht von Lora) sorgfältig ein, das Modell verschlechtert sich, wenn Alpha zu groß ist.
(4) Was ist die Motivation dieses Projekts?
Wir stellen fest, dass es in der Civitai -Plattform viele unglaubliche Modelle gibt, aber die meisten Lora -Gewichte befinden sich im Safetensor -Format, was für Benutzer von Diffusoren nicht bequem ist. Daher schreiben wir ein Konvertierskript, damit Sie diese Loras in Diffusoren verwenden können. Beachten Sie, dass wir kein Ziel für stabile Diffusions-Webui sind, was bereits sehr ausgereift ist, aber als Diffusoren völlig unterschiedliche APIs aufweist.