Repositori ini menyediakan kode tutorial paling sederhana bagi para peneliti AIGC untuk menggunakan LORA hanya dalam beberapa baris. Dengan menggunakan buku pegangan ini, Anda dapat dengan mudah bermain dengan model LORA apa pun dari komunitas aktif seperti Huggingface dan Cititai.
Sekarang, kami juga mendukung controlNet-for-difusers, T2I-Adapter-for-Diffusers.
Adaptasi rendah dari model bahasa besar (LORA) dikembangkan oleh Microsoft untuk mengurangi jumlah parameter yang dapat dilatih dengan mempelajari pasangan matriks peringkat-dekomposisi sambil membekukan bobot asli. Lora mencoba menyempurnakan "residual" dari model alih-alih seluruh model: yaitu, latih
Di mana
Trik pelatihan ini cukup berguna untuk model khusus yang disesuaikan dengan model dasar umum yang besar. Berbagai model teks ke gambar telah dikembangkan dibangun di atas difusi stabil resmi. Sekarang, dengan Lora, Anda dapat secara efisien melatih model Anda sendiri dengan sumber daya yang jauh lebih sedikit.
Safetensors adalah format sederhana baru untuk menyimpan tensor dengan aman (bukan acar) yang dirilis dengan memeluk wajah dan itu masih cepat (nol-salinan). Untuk efisiensinya, banyak model difusi yang stabil, terutama model LORA dilepaskan dalam format Safetensors. Anda dapat menemukan lebih banyak keunggulannya dari HuggingFace/Safetensors dan menginstalnya melalui PIP Install.
pip install safetensorsDalam tutorial ini, kami menunjukkan untuk memuat atau memasukkan LORA yang terlatih ke dalam kerangka kerja diffusers. Banyak proyek menarik dapat ditemukan di Huggingface dan Cititai, tetapi sebagian besar dalam kerangka kerja stabil-difusi-Webui, yang tidak nyaman bagi pengembang tingkat lanjut. Kami sangat termotivasi oleh Cloneofsimo/Lora tentang memuat, menggabungkan, dan menginterpolasi Loras terlatih. Kami terutama membahas model dalam format Safetensors yang tidak kompatibel dengan diffuser.
Model lengkap mencakup semua modul yang diperlukan (model dasar dengan atau tanpa lapisan Lora), mereka biasanya disimpan dalam format .ckpt atau .safetensors. Kami memberikan dua contoh di bawah ini untuk menunjukkan kepada Anda cara menggunakannya.
stabilityai/stabil-difusi-2-1 dari huggingface.
Dreamshaper dari Civitai.
Anda dapat mengunduh file .ckpt atau .safetensors saja. Meskipun diffusers tidak mendukung memuatnya secara langsung, mereka memberikan skrip yang mengkonversi. Unduh pertama diffusers ke 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_dirKemudian, Anda dapat memuat model
from diffusers import StableDiffusionPipeline
pipeline = StableDiffusionPipeline.from_pretrained(save_dir,torch_dtype=torch.float32)Untuk saat ini, diffuser tidak dapat mendukung bobot beban di Lora (biasanya dalam format .safetensor). Di sini kami menunjukkan upaya kami dalam gaya yang tidak masuk akal. Kami juga memberikan satu contoh.
Perhatikan bahwa ukuran file jauh lebih kecil dari model penuh, karena hanya mengandung bobot Lora tambahan. Dalam kasus ini, kita harus memuat model dasar. Juga baik-baik saja untuk hanya memuat difusi stabil 1.5 sebagai basis, tetapi untuk mendapatkan hasil yang puas, direkomendasikan untuk mengunduh model dasar yang disarankan.
Metode kami sangat mudah: mengambil berat dari .safetensor, dan menggabungkan berat Lora menjadi bobot yang didukung difuser. Kami tidak mengonversi .Safetensor menjadi format lain, kami memperbarui berat model dasar.
Skrip kami harus bekerja dengan baik dengan sebagian besar model dari Huggingface dan Cititai, jika tidak, Anda juga dapat memodifikasi kode sendiri. Percayalah, ini sangat sederhana dan Anda bisa membuatnya.
# the default mergering ratio is 0.75, you can manually set it
python convert_lora_safetensor_to_diffusers.pyKami telah membuat PR untuk diffuser tentang masalah ini, di mana kami selanjutnya melengkungkan fungsi konvergen sehingga lebih fleksibel. Anda dapat langsung memeriksanya jika Anda tidak bisa menunggu. Itu akan segera digabungkan menjadi diffusers!
Diffusers telah menyediakan train_text_to_image_lora.py sederhana untuk melatih model Lora Anda. Harap ikuti instruksinya untuk menginstal persyaratan.
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 "Setelah Anda melatih model menggunakan perintah di atas, inferensi dapat dilakukan hanya dengan menggunakan stablediffusionPipeline setelah memuat bobot Lora yang terlatih. Anda perlu melewati output_dir untuk memuat bobot Lora yang, dalam hal ini, adalah 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 " )Untuk saat ini, Diffusers hanya mendukung kereta Lora untuk UNET. Kami telah mendukung dan membuat PR, jika Anda membutuhkannya, silakan periksa dengan PR kami atau buka masalah.
Colossalai sudah mendukung Lora. Kami hanya perlu memodifikasi beberapa baris di bagian atas train_drambooth_colossalai.py. Contoh ini untuk DreamBooth, tetapi Anda dapat dengan mudah mengadopsi teks reguler untuk pelatihan gambar. Bobot Lora yang dihasilkan hanya untuk lapisan perhatian di UNET. Jika Anda ingin mendukung Encoder Teks, silakan gunakan kerangka kerja akselet dalam diffuser, karena Colossalai belum mendukung banyak model.
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)Di sini kita pergi, satu -satunya hal adalah cara inisialisasi yang tidak dikeluarkan. Untuk menghemat beban lora saja,
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)Kemudian, lakukan inferensi
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 " )Anda mungkin menemukan bahwa berat Lora yang dihasilkan hanya ukuran sekitar 3MB, ini karena pengaturan default. Untuk meningkatkan ukurannya, Anda dapat mengatur peringkat secara manual (dimensi untuk dekomposisi peringkat rendah) untuk lapisan Lora.
lora_attn_procs[name] = LoRACrossAttnProcessor(hidden_size=hidden_size, cross_attention_dim=cross_attention_dim, rank=128)Kemudian, bobot Lora akan berukuran sekitar 100-200MB. Perlu diketahui bahwa lapisan Lora mudah diatasi, secara umum, seharusnya cukup untuk melatih hanya 100 - 2000 langkah pada dataset kecil (kurang dari 1k gambar) dengan ukuran batch = 64.
(1) Dapatkah saya secara manual menyesuaikan berat Lora saat bergabung?
Ya, alfa di sini adalah bobot untuk Lora. Kami telah mengirimkan PR ke Diffusers di mana kami menyediakan fungsi Warpped yang fleksibel.
(2) Dapatkah saya hanya mengubah lora (.safetensors) menjadi format lain yang didukung oleh difuser?
Anda bisa tetapi kami tidak menyarankan, melihat masalah ini. Ada banyak keterbatasan. Misalnya, skrip kami tidak dapat menggeneralisasi untuk semua. Safetensor karena beberapa dari mereka memiliki penamaan yang berbeda. Selain itu, kerangka kerja diffuser saat ini hanya mendukung menambahkan Lora ke dalam lapisan perhatian yang tidak ada, sementara banyak. Safetensor dari Civitai mengandung bobot Lora untuk modul lain seperti encoder teks. Tapi Lora untuk Encoder Teks harus segera didukung.
(3) Dapatkah saya mencampur lebih dari satu model Lora?
Ya, satu -satunya hal adalah menggabungkan dua kali. Tapi tolong atur dengan hati -hati alfa (berat Lora), model menurun jika alpha terlalu besar.
(4) Apa motivasi proyek ini?
Kami menemukan ada banyak model luar biasa di platform Civitai, tetapi sebagian besar bobot Lora berada dalam format Safetensors, yang tidak nyaman bagi pengguna diffuser. Dengan demikian, kami menulis skrip konversi sehingga Anda dapat menggunakan loras ini di Diffusers. Perlu diketahui bahwa kita tidak target untuk stabil-difusi-webui, yang sudah sangat matang tetapi memiliki API yang sama sekali berbeda sebagai diffuser.