Diffusers documentation

LoRA

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

LoRA

이것은 실험적이며 API가 향후 변경될 수 있습니다.

LoRA (Low-Rank Adaptation of Large Language Models)는 학습 가능한 매개변수의 수를 크게 줄이는 인기 있고 경량화된 학습 기법입니다. 모델에 더 적은 수의 새로운 가중치를 삽입하고 이 가중치만 학습하는 방식으로 작동합니다. 이를 통해 LoRA를 사용한 학습은 훨씬 빠르고 메모리 효율적이며, 저장 및 공유가 용이한 더 작은 모델 가중치(수백 MB)를 생성합니다. LoRA는 DreamBooth와 같은 다른 학습 기법과 결합하여 학습 속도를 높일 수도 있습니다.

LoRA는 매우 다재다능하며 DreamBooth, Kandinsky 2.2, Stable Diffusion XL, text-to-image에 지원됩니다.

This guide will explore the train_text_to_image_lora.py script to help you become more familiar with it, and how you can adapt it for your own use-case.

…

git clone https://github.com/huggingface/diffusers
cd diffusers
pip install .

학습 스크립트가 포함된 예제 폴더로 이동하고, 사용 중인 스크립트에 필요한 의존성을 설치하세요:

cd examples/text_to_image
pip install -r requirements.txt

🤗 Accelerate는 여러 GPU/TPU 또는 혼합 정밀도로 학습하는 것을 돕는 라이브러리입니다. 하드웨어와 환경에 따라 학습 설정을 자동으로 구성합니다. 자세한 내용은 🤗 Accelerate Quick tour를 참고하세요.

🤗 Accelerate 환경을 초기화합니다:

accelerate config

어떤 구성도 선택하지 않고 기본 🤗 Accelerate 환경을 설정하려면:

accelerate config default

또는 노트북과 같이 인터랙티브 셸을 지원하지 않는 환경에서는 다음을 사용할 수 있습니다:

from accelerate.utils import write_basic_config

write_basic_config()

마지막으로, 자체 데이터셋으로 모델을 학습하려면 학습용 데이터셋 만들기 가이드를 참고하여 학습 스크립트와 호환되는 데이터셋을 만드는 방법을 배워보세요.

다음 섹션에서는 스크립트를 수정하는 방법을 이해하는 데 중요한 학습 스크립트의 일부 부분을 강조합니다. 그러나 스크립트의 모든 측면을 자세히 다루지는 않습니다. 더 자세히 알고 싶으시다면 스크립트를 읽어보시고, 질문이나 우려 사항이 있으시면 알려주시기 바랍니다.

스크립트 매개변수

학습 스크립트에는 학습 실행을 사용자 정의하는 데 도움이 되는 많은 매개변수가 있습니다. 모든 매개변수와 그 설명은 parse_args() 함수에서 확인할 수 있습니다. 대부분의 매개변수에는 잘 작동하는 기본값이 제공되지만, 원하시는 경우 학습 명령에서 직접 값을 설정할 수도 있습니다.

예를 들어, 학습할 에포크 수를 늘리려면:

accelerate launch train_text_to_image_lora.py \
  --num_train_epochs=150 \

기본적이고 중요한 대부분의 매개변수는 텍스트-이미지 학습 가이드에 설명되어 있으므로, 이 가이드에서는 LoRA와 관련된 매개변수에만 초점을 맞춥니다:

  • --rank: 학습할 저순위 행렬의 내부 차원; 랭크가 높을수록 학습 가능한 파라미터가 많아집니다
  • --learning_rate: 기본 학습률은 1e-4이지만, LoRA를 사용하면 더 높은 학습률을 사용할 수 있습니다

학습 스크립트

데이터셋 전처리 코드와 학습 루프는 main() 함수에 있으며, 학습 스크립트를 수정해야 한다면 이 부분을 변경하면 됩니다.

스크립트 매개변수와 마찬가지로, Text-to-image 학습 가이드에서 학습 스크립트의 전체적인 흐름을 안내합니다. 대신 이 가이드에서는 스크립트 중 LoRA와 관련된 부분을 살펴봅니다.

UNet
텍스트 인코더

Diffusers는 PEFT 라이브러리의 LoraConfig를 사용하여 LoRA 어댑터의 매개변수, 즉 랭크, 알파, LoRA 가중치를 삽입할 모듈을 설정합니다. 어댑터는 UNet에 추가되며, lora_layers에서는 최적화를 위해 LoRA 레이어만 필터링됩니다.

unet_lora_config = LoraConfig(
    r=args.rank,
    lora_alpha=args.rank,
    init_lora_weights="gaussian",
    target_modules=["to_k", "to_q", "to_v", "to_out.0"],
)

unet.add_adapter(unet_lora_config)
lora_layers = filter(lambda p: p.requires_grad, unet.parameters())

lora_layers가 최적화될 유일한 가중치이므로 optimizer는 lora_layers로 초기화됩니다:

optimizer = optimizer_cls(
    lora_layers,
    lr=args.learning_rate,
    betas=(args.adam_beta1, args.adam_beta2),
    weight_decay=args.adam_weight_decay,
    eps=args.adam_epsilon,
)

Aside from setting up the LoRA layers, the training script is more or less the same as train_text_to_image.py!

스크립트 실행

모든 변경 사항을 완료했거나 기본 구성으로 진행하는 데 문제가 없다면, 학습 스크립트를 실행할 준비가 된 것입니다! 🚀

Naruto BLIP captions 데이터셋을 학습하여 나루토 캐릭터를 생성해 보겠습니다. MODEL_NAME과 DATASET_NAME 환경 변수를 각각 모델과 데이터셋으로 설정합니다. 또한 OUTPUT_DIR에 모델을 저장할 위치를 지정하고, HUB_MODEL_ID로 Hub에 저장할 모델 이름을 지정해야 합니다. 스크립트는 다음 파일들을 생성하여 저장소에 저장합니다:

  • 저장된 모델 체크포인트
  • pytorch_lora_weights.safetensors (학습된 LoRA 가중치)

여러 개의 GPU에서 학습하는 경우 accelerate launch 명령에 --multi_gpu 매개변수를 추가하세요.

2080 Ti GPU(11GB VRAM)에서 전체 학습 실행에 약 5시간이 소요됩니다.

export MODEL_NAME="stable-diffusion-v1-5/stable-diffusion-v1-5"
export OUTPUT_DIR="/sddata/finetune/lora/naruto"
export HUB_MODEL_ID="naruto-lora"
export DATASET_NAME="lambdalabs/naruto-blip-captions"

accelerate launch --mixed_precision="fp16"  train_text_to_image_lora.py \
  --pretrained_model_name_or_path=$MODEL_NAME \
  --dataset_name=$DATASET_NAME \
  --dataloader_num_workers=8 \
  --resolution=512 \
  --center_crop \
  --random_flip \
  --train_batch_size=1 \
  --gradient_accumulation_steps=4 \
  --max_train_steps=15000 \
  --learning_rate=1e-04 \
  --max_grad_norm=1 \
  --lr_scheduler="cosine" \
  --lr_warmup_steps=0 \
  --output_dir=${OUTPUT_DIR} \
  --push_to_hub \
  --hub_model_id=${HUB_MODEL_ID} \
  --report_to=wandb \
  --checkpointing_steps=500 \
  --validation_prompt="A naruto with blue eyes." \
  --seed=1337

학습이 완료되면 모델을 추론에 사용할 수 있습니다:

from diffusers import AutoPipelineForText2Image
import torch

pipeline = AutoPipelineForText2Image.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16).to("cuda")  # or "mps", "xpu", "cpu"
pipeline.load_lora_weights("path/to/lora/model", weight_name="pytorch_lora_weights.safetensors")
image = pipeline("A naruto with blue eyes").images[0]

다음 단계

LoRA로 새로운 모델을 학습하신 것을 축하드립니다! 새로운 모델을 사용하는 방법에 대해 더 알고 싶으시다면, 다음 가이드가 도움이 될 수 있습니다:

  • Kohya, TheLastBen과 같은 커뮤니티 트레이너로 학습한 다양한 LoRA 형식을 로드하는 방법을 알아보세요.
  • PEFT를 사용하여 추론 시 여러 LoRA를 사용 및 결합하는 방법을 학습하세요.
Update on GitHub