DreamBooth fine-tuning with DEFT
DEFT
(Decompositional Efficient Fine-Tuning) adapts a frozen weight by removing a learned low-rank sub-space and
injecting a new one in its place (W' = (I - P_proj) @ W + Q_P @ R). On its native text-to-image domain it is well
suited to personalizing a diffusion model from a few images while preserving the base model's editability. This example
is adapted from oft_dreambooth.
Setup
cd peft/examples/deft_dreambooth
pip install "git+https://github.com/huggingface/peft" diffusers accelerate transformers
Train
Point --instance_data_dir at a few images of your subject:
python train_dreambooth.py \
--pretrained_model_name_or_path "stabilityai/stable-diffusion-2-1-base" \
--instance_data_dir "path/to/subject/images" \
--output_dir "deft-dreambooth-model" \
--instance_prompt "a photo of sks dog" \
--resolution 512 \
--train_batch_size 1 \
--max_train_steps 800 \
--learning_rate 1e-4 \
--use_deft \
--deft_r 8 \
--deft_alpha 16 \
--deft_decomposition_method "qr"
qr is the default decomposition and works best for image generation (use relu for text tasks). Add
--train_text_encoder (with the --deft_text_encoder_* options) to also adapt the text encoder.
Inference
See deft_dreambooth_inference.ipynb: load the base pipeline and attach the
trained adapters with PeftModel.from_pretrained(pipe.unet, output_dir + "/unet") (and likewise for the text encoder
if it was trained).