Diffusers documentation

무조건적 이미지 생성

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

and get access to the augmented documentation experience

to get started

무조건적 이미지 생성

무조건적 이미지 생성 모델은 학습 중에 텍스트나 이미지에 조건을 받지 않습니다. 학습 데이터 분포와 유사한 이미지만 생성합니다.

이 가이드에서는 train_unconditional.py 학습 스크립트를 살펴보고, 이를 이해한 후 사용자의 용도에 맞게 수정하는 방법을 안내합니다.

…

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

이후 학습 스크립트가 포함된 예제 폴더로 이동하고 필요한 의존성을 설치합니다:

cd examples/unconditional_image_generation
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() 함수에서 찾을 수 있습니다. 학습 배치 크기나 학습률과 같이 각 매개변수에 대한 기본값을 제공하지만, 원하시는 경우 학습 명령에서 직접 값을 설정할 수도 있습니다.

예를 들어, bf16 형식을 사용하여 혼합 정밀도로 학습 속도를 높이려면 학습 명령에 --mixed_precision 매개변수를 추가합니다:

accelerate launch train_unconditional.py \
  --mixed_precision="bf16"

지정해야 할 몇 가지 기본적이고 중요한 매개변수는 다음과 같습니다:

  • --dataset_name: Hub에 있는 데이터셋의 이름 또는 학습에 사용할 데이터셋의 로컬 경로
  • --output_dir: 학습된 모델을 저장할 위치
  • --push_to_hub: 학습된 모델을 Hub에 푸시할지 여부
  • --checkpointing_steps: 모델 학습 중 체크포인트를 저장하는 주기입니다. 학습이 중단된 경우, 학습 명령에 --resume_from_checkpoint를 추가하여 해당 체크포인트에서 학습을 계속할 수 있습니다.

데이터셋만 가져오세요. 나머지 모든 것은 학습 스크립트가 처리합니다!

학습 스크립트

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

train_unconditional 스크립트는 모델 구성을 제공하지 않은 경우 UNet2DModel을 초기화합니다. 원하시는 경우 여기서 UNet을 구성할 수 있습니다:

model = UNet2DModel(
    sample_size=args.resolution,
    in_channels=3,
    out_channels=3,
    layers_per_block=2,
    block_out_channels=(128, 128, 256, 256, 512, 512),
    down_block_types=(
        "DownBlock2D",
        "DownBlock2D",
        "DownBlock2D",
        "DownBlock2D",
        "AttnDownBlock2D",
        "DownBlock2D",
    ),
    up_block_types=(
        "UpBlock2D",
        "AttnUpBlock2D",
        "UpBlock2D",
        "UpBlock2D",
        "UpBlock2D",
        "UpBlock2D",
    ),
)

다음으로, 스크립트는 scheduler와 optimizer를 초기화합니다:

# Initialize the scheduler
accepts_prediction_type = "prediction_type" in set(inspect.signature(DDPMScheduler.__init__).parameters.keys())
if accepts_prediction_type:
    noise_scheduler = DDPMScheduler(
        num_train_timesteps=args.ddpm_num_steps,
        beta_schedule=args.ddpm_beta_schedule,
        prediction_type=args.prediction_type,
    )
else:
    noise_scheduler = DDPMScheduler(num_train_timesteps=args.ddpm_num_steps, beta_schedule=args.ddpm_beta_schedule)

# Initialize the optimizer
optimizer = torch.optim.AdamW(
    model.parameters(),
    lr=args.learning_rate,
    betas=(args.adam_beta1, args.adam_beta2),
    weight_decay=args.adam_weight_decay,
    eps=args.adam_epsilon,
)

그 후 데이터셋을 로드하며, 전처리 방법을 지정할 수 있습니다:

dataset = load_dataset("imagefolder", data_dir=args.train_data_dir, cache_dir=args.cache_dir, split="train")

augmentations = transforms.Compose(
    [
        transforms.Resize(args.resolution, interpolation=transforms.InterpolationMode.BILINEAR),
        transforms.CenterCrop(args.resolution) if args.center_crop else transforms.RandomCrop(args.resolution),
        transforms.RandomHorizontalFlip() if args.random_flip else transforms.Lambda(lambda x: x),
        transforms.ToTensor(),
        transforms.Normalize([0.5], [0.5]),
    ]
)

마지막으로, training loop은 이미지에 노이즈를 추가하고, 노이즈 잔차를 예측하며, 손실을 계산하고, 지정된 단계에서 체크포인트를 저장하고, 모델을 Hub에 저장하고 푸시하는 등 나머지 모든 작업을 처리합니다. training loop의 작동 방식에 대해 더 자세히 알고 싶다면, 디노이징 과정의 기본 패턴을 분석하는 Understanding pipelines, models and schedulers 튜토리얼을 확인해 보세요.

스크립트 실행

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

전체 학습 실행은 4xV100 GPU에서 2시간이 소요됩니다.

단일 GPU
멀티-GPU
accelerate launch train_unconditional.py \
  --dataset_name="huggan/flowers-102-categories" \
  --output_dir="ddpm-ema-flowers-64" \
  --mixed_precision="fp16" \
  --push_to_hub

트레이닝 스크립트는 저장소에 체크포인트 파일을 생성하고 저장합니다. 이제 학습된 모델을 로드하여 추론에 사용할 수 있습니다:

from diffusers import DiffusionPipeline
import torch

pipeline = DiffusionPipeline.from_pretrained("anton-l/ddpm-butterflies-128").to("cuda")  # or "mps", "xpu", "cpu"
image = pipeline().images[0]
Update on GitHub