ฝึกอบรม LORA โดยใช้การใช้งานอย่างเป็นทางการของ Microsoft ด้วยแบบจำลองการแพร่กระจายที่เสถียร นี่เป็นวิธีที่มีประสิทธิภาพและง่ายที่สุดในการฝึกอบรม LORAS โดยไม่มีความซับซ้อนเพิ่มในขณะที่ยังสามารถแบ่งปันได้ระหว่างห้องสมุดและการใช้งาน
- repo นี้ยังคงอยู่ในการพัฒนาที่ใช้งานอยู่ คาดว่าจะมีข้อบกพร่องจนกว่าธง WIP จะถูกลบออก -
โคลนที่เก็บนี้ลงในโฟลเดอร์การฝึกอบรมของคุณ:
git clone https://github.com/ExponentialML/Stable-LoRAติดตั้งข้อกำหนดจากที่เก็บนี้:
pip install -r requirements.txtการฝึกอบรมทำได้โดยใช้ไลบรารี diffusers
ดูตัวอย่าง _train_script.sh สำหรับตัวอย่างสคริปต์ของ Dreambooth
การวิ่งเป็นเรื่องง่ายเหมือน:
accelerate launch train_lora . py
- - pretrained_model_name_or_path = "runwayml/stable-diffusion-v1-5"
- - instance_data_dir = "instance_images"
- - lora_rank = 64
- - output_dir = "./output"
- - instance_prompt = "a shld dog"
- - resolution = 512
- - mixed_precision = "fp16"
- - train_text_encoder
- - learning_rate = 1e-4
- - resize = True
- - save_steps = 200
- - preview_steps = 100
- - lr_scheduler = "constant_with_warmup"
- - lr_warmup_steps = 50
- - max_train_steps = 5000
- - save_preview
- - preview_prompt = "a shld dog as a super hero"หลังจากการฝึกอบรมผลลัพธ์จะถูกบันทึกไว้ในโฟลเดอร์ผลลัพธ์ของคุณ
โดยค่าเริ่มต้นตัวแปร WebUI Automatic1111 จะถูกบันทึกไว้ข้างพวกเขา (ส่วนขยาย WebUI อยู่ในระหว่างการพัฒนา)
เพียงเพิ่มลงในโมเดลของคุณก่อนลูปการฝึกอบรม
# Import function to add the LoRA, as well as target modules.
from stable_lora . lora import add_lora_to , UNET_REPLACE , TEXT_ENCODER_REPLACE
from diffusers import StableDiffusionPipeline
# Load a Stable Diffusion Model
pipeline = StableDiffusionPipeline . from_pretrained ( pretrained_model_name_or_path )
# Freeze the models. Remember, only the LoRA weights get trained, not the model itself.
pipeline . unet . requires_grad_ ( False )
pipeline . text_encoder . requires_grad_ ( False )
# Add LoRA to the UNET
add_lora_to (
pipeline . unet ,
target_module = UNET_REPLACE ,
search_class = [ torch . nn . Linear , torch . nn . Conv2d ],
r = 32
)
# Add LoRA to the Text Encoder
add_lora_to ( pipeline . text_encoder , target_module = TEXT_ENCODER_REPLACE , r = 32 )
# Your optimizers and training code...หลังจากเพิ่ม LORA ลงในโมเดลของคุณคุณสามารถเพิ่มพารามิเตอร์ Parameter Optimizer Params ได้อย่างง่ายดายหากจำเป็น
# Example
unet_params = []
text_encoder_params = []
for n , p in unet . named_parameters ():
if 'lora' in n :
unet_params . append ({
"params" : p ,
"lr" : args . learning_rate
})
for n , p in text_encoder . named_parameters ():
if 'lora' in n :
text_encoder_params . append ({
"params" : p ,
"lr" : args . learning_rate_text
})
optimizer_params = unet_params + text_encoder_params การบันทึกสามารถทำได้โดยใช้ Safetensors หรือวิธีดั้งเดิมโดยใช้ไฟล์ .pt :
from stable_lora . lora import save_lora
save_lora ( unet , path = 'save_file_path.safetensors' )
save_lora ( text_encoder = text_encoder , use_safetensors = False , path = 'save_file_path.pt' )นอกจากนี้คุณสามารถตั้งค่าโหมดเป็นโหมดการประเมินผลหรือโหมดรถไฟ
from stable_lora . lora import set_mode
# Train mode
set_mode ( unet , is_train = True )
# Evaluation mode
set_mode ( unet , is_train = False )สิ่งนี้ได้รับการทดสอบในแบบจำลองการแพร่กระจายที่เสถียร 1.5
ขอแนะนำให้ลองใช้อัตราการเรียนรู้ 5e-6 , 3e-5 และ 1e-4
อันดับเริ่มต้นคือ 32 แต่สามารถตั้งค่าได้โดยส่งผ่านพารามิเตอร์ r การใช้อันดับต่ำกว่าจะใช้หน่วยความจำน้อยลงโดยมีอันดับสูงมากขึ้น สิ่งนี้ยังมีส่วนช่วยในการบันทึกขนาด
ปัจจัยเหล่านี้จะขึ้นอยู่กับงานของคุณเพียงอย่างเดียว แต่เป็นจุดเริ่มต้นที่ดี
คุณยังสามารถเปิดใช้งานอคติได้เช่นกัน
ขึ้นอยู่กับข้อมูลและอัตราการเรียนรู้ของคุณคุณอาจสามารถบีบประสิทธิภาพพิเศษออกจากการฝึกอบรม
# Example | Applicable to Unet or Text Encoder
lora_bias = 'lora_only'
add_lora_to ( pipeline . text_encoder , target_module = TEXT_ENCODER_REPLACE , r = 32 , lora_bias = lora_bias )
# Must be set here as well when saving.
save_lora ( text_encoder = text_encoder , use_safetensors = True , path = 'save_file_path.pt' , lora_bias = lora_bias )PT & safetensors ) Cloneofsimo สำหรับรหัสการใช้งาน LORA ของพวกเขา
Microsoft สำหรับรหัสอย่างเป็นทางการ