يوفر هذا المستودع أبسط رمز تعليمي للباحثين AIGC لاستخدام LORA في بضعة أسطر فقط. باستخدام هذا الكتيب ، يمكنك اللعب بسهولة مع أي طراز Lora من مجتمعات نشطة مثل Huggingface و Cititai.
الآن ، ندعم أيضًا ControlNet-For-Diffusers ، T2i-Adapter-For-Diffusers.
تم تطوير التكيف المنخفض للرسائل لنماذج اللغة الكبيرة (LORA) بواسطة Microsoft لتقليل عدد المعلمات القابلة للتدريب من خلال تعلم أزواج من مصفوفات التصنيف مع تجميد الأوزان الأصلية. تحاول لورا ضبط "المتبقية" للنموذج بدلاً من النموذج بأكمله: أي ، قم بتدريب
أين
هذه الخدعة التدريبية مفيدة للغاية لنماذج مخصصة لضبط Fune على نموذج قاعدة عامة كبيرة. تم تطوير نص مختلف إلى نماذج الصور المبنية على الجزء العلوي من الانتشار المستقر الرسمي. الآن ، مع لورا ، يمكنك تدريب النموذج الخاص بك بكفاءة مع موارد أقل بكثير.
Safetensors هو تنسيق بسيط جديد لتخزين الموتر بأمان (على عكس المخلل) الذي تم إصداره من خلال Hugging Face ولا يزال سريعًا (صفر). من أجل كفاءتها ، يتم إصدار العديد من نماذج الانتشار المستقرة ، وخاصة نماذج Lora بتنسيق Safetensors. يمكنك العثور على المزيد من مزاياها من HuggingFace/Safetensors وتثبيتها عبر تثبيت PIP.
pip install safetensorsفي هذا البرنامج التعليمي ، نعرض تحميل أو إدراج LORA المدربة مسبقًا في إطار الناشرون. يمكن العثور على العديد من المشاريع المثيرة للاهتمام في Huggingface و Cititai ، ولكن في الغالب في إطار عمل مستقر Webui ، وهو أمر غير مناسب للمطورين المتقدمين. نحن بدافع بشدة من Cloneofsimo/Lora حول التحميل ، والدمج ، والتحريف لوراس المدربة. نناقش بشكل أساسي النماذج بتنسيق Safetensors الذي لا يتوافق بشكل جيد مع الناشرين.
يتضمن النموذج الكامل جميع الوحدات النمطية المطلوبة (نموذج الأساس مع أو بدون طبقات Lora) ، وعادة ما يتم تخزينها بتنسيق .ckpt أو .safetensors. نحن نقدم مثالين أدناه لنوضح لك كيفية الاستخدام في متناول اليد.
الاستقرار/الانتشار المستقر 2-1 من Huggingface.
Dreamshaper من Civitai.
يمكنك تنزيل ملف .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). هنا نعرض محاولاتنا بأسلوب غير محدود. نحن نقدم أيضا مثال واحد.
لاحظ أن حجم الملف أصغر بكثير من النموذج الكامل ، لأنه يحتوي فقط على أوزان Lora إضافية. في الحالة ، يتعين علينا تحميل النموذج الأساسي. من الجيد أيضًا تحميل Diffifius 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لقد صنعنا العلاقات العامة للناشر في هذه القضية ، حيث نقوم بزيادة تشويه وظيفة التحويل بحيث تكون أكثر مرونة. يمكنك التحقق من ذلك مباشرة إذا لم تتمكن من الانتظار. يجب دمجها في الناشرون قريبًا!
يوفر Diffusers 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 "بمجرد قيامك بتدريب نموذج باستخدام الأمر أعلاه ، يمكن القيام بالاستدلال ببساطة باستخدام StableDiffusionPipeline بعد تحميل أوزان Lora المدربة. تحتاج إلى تمرير 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 " )في الوقت الحالي ، يدعم الناشرون فقط Train Lora لـ UNET. لقد دعمنا وصنعنا العلاقات العامة ، إذا كنت في حاجة إليها ، يرجى التحقق من العلاقات العامة أو فتح مشكلة.
Colossalai يدعم لورا بالفعل. نحتاج فقط إلى تعديل بضعة أسطر في الجزء العلوي من Train_dreambooth_colossalai.py. هذا المثال مخصص لـ Dreambooth ، ولكن يمكنك تبنيه بسهولة نصًا منتظمًا لتدريب الصور. الأوزان Lora الناتجة هي فقط لطبقات الانتباه في UNET. إذا كنت ترغب في دعم تشفير النص أيضًا ، فيرجى استخدام إطار عمل AcceTate في الناشرون ، لأن 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 الذي تم إنشاؤه هو حوالي 3 ميجابايت فقط ، وهذا بسبب الإعداد الافتراضي. لزيادة الحجم ، يمكنك ضبط الرتبة يدويًا (البعد لتحليل الترتيب المنخفض) لطبقات Lora.
lora_attn_procs[name] = LoRACrossAttnProcessor(hidden_size=hidden_size, cross_attention_dim=cross_attention_dim, rank=128)بعد ذلك ، ستكون أوزان لورا حوالي 100-200 ميجابايت. انتبه إلى أن طبقات Lora سهلة التغلب على ذلك ، بشكل عام ، يجب أن يكون ذلك كافيًا لتدريب 100 - 2000 فقط على مجموعات البيانات الصغيرة (أقل من 1 كيلو فولت) بحجم الدُفعة = 64.
(1) هل يمكنني ضبط وزن Lora يدويًا عند الاندماج؟
نعم ، ألفا هنا هو وزن لورا. لقد قدمنا العلاقات العامة إلى الناشرين حيث نقدم وظيفة warpped المرنة.
(2) هل يمكنني فقط تحويل Lora (.safetensors) إلى تنسيقات أخرى مدعومة؟
يمكنك ولكن لا نقترح ، نرى هذه القضايا. هناك العديد من القيود. على سبيل المثال ، لا يمكن أن يعتمد البرنامج النصي على جميع .safetensors لأن بعضها لديه تسمية مختلفة. علاوة على ذلك ، يدعم إطار النشرات الحاليين فقط إضافة Lora إلى طبقات انتباه Unet ، في حين أن العديد من الأجزاء. تحتوي على أوزان Lora للوحدات النمطية الأخرى مثل تشفير النص. لكن يجب دعم لورا لشرف النص قريبًا.
(3) هل يمكنني مزج أكثر من نموذج لورا؟
نعم ، الشيء الوحيد هو الاندماج مرتين. ولكن يرجى تعيين ألفا (وزن Lora) بعناية ، والتحلل من النماذج إذا كان ألفا كبيرًا جدًا.
(4) ما هو دافع هذا المشروع؟
نجد أن هناك العديد من النماذج المذهلة في منصة Civitai ، ولكن معظم أوزان Lora موجودة بتنسيق Safetensors ، وهو أمر غير مناسب لمستخدمي الناشرات. وبالتالي ، فإننا نكتب برنامجًا محولًا حتى تتمكن من استخدام هذه loras في الناشرات. كن على دراية بأننا لسنا نهدف إلى الانتشار المستقر-Webui ، والذي هو بالفعل ناضج للغاية ولكن لديه واجهة برمجة تطبيقات مختلفة تمامًا كمنازعين.