AWS 기술 블로그

Amazon SageMaker JumpStart를 사용하여 텍스트-이미지로 변환하는 Stable Diffusion 모델을 파인 튜닝 하기

이번 게시글은 영문 게시글(Fine-tune text-to-image Stable Diffusion models with Amazon SageMaker JumpStart by Vivek Madan, Heiko Hotz, and Xingchen Ma)의 한글 번역글입니다.

2023 3: 이 블로그는 텍스트이미지 Stable Diffusion 모델을 파인 튜닝하기 위한 AMT HPO 지원을 검토 및 업데이트했습니다.

2022년 11월에 우리는 AWS 고객이 Amazon SageMaker JumpStart에서 Stable Diffusion 모델을 사용하여 텍스트에서 이미지를 생성할 수 있다고 발표했습니다. Stable Diffusion은 사실적인 고품질 이미지와 놀라운 아트를 단 몇 초 만에 생성할 수 있는 딥 러닝 모델입니다. 인상적인 이미지를 만드는 것은 예술에서 NFTs 및 그 이상에 이르는 다양한 산업에서 사용할 수 있지만 오늘날 우리는 AI도 개인화 할 수 있을 것으로 기대합니다. 오늘 우리는 이미지 생성 모델을 Amazon SageMaker JumpStart에서custom 데이터 세트로 파인 튜닝(미세 조정) 하여 사용 사례에 맞게 개인화 할 수 있음을 발표합니다. 이는 아트, 로고, 맞춤형 디자인, NFTs 등을 만들거나 애완 동물 또는 아바타의 맞춤형 AI 이미지 생성과 같은 재미있는 작업을 할 때 유용할 수 있습니다.

이 블로그에서는 SageMaker Python SDK에서 사용할 수 있는 JumpStart API를 통해 프로그래밍 방식으로, 그리고 Amazon SageMaker Studio에서 JumpStart의 사용자 인터페이스(UI)를 사용하여 Stable Diffusion 모델을 미세 조정하는 방법에 대한 내용을 제공합니다. 또한 데이터 세트 품질, 학습 데이터 세트 크기, Amazon SageMaker Automatic Model Tuning (자동 모델 튜닝) 을 적용하여 하이퍼 파라미터 값을 조정하는 방법, 여러 데이터 세트에 대한 적용 가능성 등 설계 선택 방법에 대해서도 설명합니다. 마지막으로, 최근 JumpStart에 추가된 다양한 입력 언어 및 스타일을 사용하여 공개적으로 사용할 수 있는 80개 이상의 파인 튜닝된 모델에 대해 논의합니다.

Stable Diffusion과 전이 학습  (Transfer learning)

Stable Diffusion은 텍스트 프롬프트에서 사실적인 이미지를 생성할 수 있는 텍스트-이미지 모델입니다. Stable Diffusion 모델은 실제 이미지에 추가된 노이즈를 제거하는 방법을 배우면서 학습합니다. 이 노이즈 제거 프로세스는 사실적인 이미지를 생성합니다. 이러한 모델은 텍스트에 대한 생성 프로세스를 조정하여 텍스트만으로 이미지를 생성할 수도 있습니다. 예를 들어 Stable Diffusion모델이 순수한 노이즈 이미지에서 모양을 인식하는 방법을 학습하고 모양이 입력 텍스트의 단어와 일치하는 경우 점차 이러한 모양에 초점을 맞추는 잠재 확산(latent diffusion) 입니다. 텍스트는 먼저 언어 모델을 사용하여 잠재 공간에 포함되어야 합니다. 그런 다음 U-Net 아키텍처를 사용하여 잠재 공간에서 일련의 노이즈 추가 및 노이즈 제거 작업을 수행합니다. 마지막으로 노이즈가 제거된 출력은 픽셀 공간으로 디코딩 됩니다.

Source: https://jalammar.github.io/illustrated-stable-diffusion/

기계 학습(ML)에서는 한 도메인에서 학습한 지식을 다른 도메인으로 이전하는 기능을 전이 학습이라고 합니다. 전이 학습을 사용하여 원래 모델을 학습하는 데 드는 비용보다 훨씬 적은 학습 비용으로 더 작은 데이터 세트에서 정확한 모델을 생성할 수 있습니다. 전이 학습을 사용하면 최소 5개의 이미지로 자체 데이터 세트에서 Stable Diffusion 모델을 미세 조정할 수 있습니다. 예를 들어 왼쪽에는 모델을 미세 조정하는 데 사용되는 Doppler라는 강아지의 훈련 이미지가 있고, 중간과 오른쪽에는 해변에서 Doppler의 이미지와 연필 스케치를 예측하도록 요청했을 때 미세 조정된 모델이 생성한 이미지가 있습니다.

왼쪽에는 모델을 미세 조정하는 데 사용되는 흰색 의자 이미지와 미세 조정된 모델에 의해 생성된 빨간색 의자 이미지가 있습니다. 오른쪽에는 모델을 미세 조정하는 데 사용되는 오토만 테이블의 이미지와 오토만 테이블에 앉아 있는 고양이의 이미지가 있습니다.

Stable Diffusion과 같은 대형 모델을 미세 조정하려면 일반적으로 학습 스크립트를 제공해야 합니다. 메모리 부족 문제, 페이로드 크기 문제 등 많은 문제가 있습니다. 또한 종단 간 테스트를 실행하여 스크립트, 모델 및 원하는 인스턴스가 효율적인 방식으로 함께 작동하는지 확인해야 합니다. JumpStart는 견고하게 테스트된 즉시 사용 가능한 스크립트를 제공하여 이 프로세스를 단순화합니다. Stable Diffusion 모델 용 JumpStart 미세 조정 스크립트는 DreamBooth의 미세 조정 스크립트를 기반으로 합니다. Studio UI를 통해 클릭 한 번으로 또는 JumpStart API를 통해 몇 줄의 코드만으로 이러한 스크립트에 액세스할 수 있습니다.

Stable Diffusion 모델을 사용하면 CreativeML Open RAIL++-M 라이선스에 동의하게 됩니다.

Use JumpStart programmatically with the SageMaker SDK

이 섹션에서는 SageMaker Python SDK를 사용하여 모델을 학습하고 배포하는 방법을 설명합니다. JumpStart에서 사전 학습된 적절한 모델을 선택하고, SageMaker 학습 작업으로 이 모델을 학습하고, 학습된 모델을 SageMaker 엔드포인트에 배포합니다. 또한 SageMaker Python SDK를 모두 사용하여 배포된 엔드포인트에서 추론을 실행합니다. 다음 예제에는 코드 스니펫이 포함되어 있습니다. 이 데모의 모든 단계가 포함된 전체 코드는 Introduction to JumpStart – Text to Image 예제 노트북을 참조하십시오.

SageMaker Studio Lab에서 모델을 미세 조정하고 배포하려면 다음 GitHub 리포지토리를 참조하십시오.

Train and fine-tune the Stable Diffusion model

각 모델은 고유한 model_id로 식별됩니다. 다음 코드는 custom 학습 데이터 세트에서 model_id:  model-txt2img-stabilityai-stable-diffusion-v2-1-base로 식별되는 Stable Diffusion 2.1 기본 모델을 미세 조정하는 방법을 보여줍니다. model_id 값의 전체 목록과 미세 조정 가능한 모델은 사전 학습된 모델 테이블이 있는 내장 알고리즘을 참조하세요. 각 model_id에 대해 SageMaker Python SDK의 Estimator 클래스를 통해 SageMaker 학습 작업을 시작하려면 SageMaker에서 제공하는 유틸리티 기능을 통해 Docker 이미지 URI, 학습 스크립트 URI 및 사전 학습된 모델 URI를 가져와야 합니다. 학습 스크립트 URI에는 데이터 처리, 사전 학습된 모델 로드, 모델 학습 및 추론을 위해 학습된 모델 저장에 필요한 모든 코드가 포함되어 있습니다. 선행 학습된 모델 URI에는 선행 학습된 모델 아키텍처 정의 및 모델 매개변수가 포함됩니다. 선행 학습된 모델 URI는 특정 모델에 따라 다릅니다. 사전 훈련된 모델 tarball은 Hugging Face에서 사전 다운로드 되었으며 학습 작업이 네트워크 격리에서 실행되도록 Amazon Simple Storage Service(Amazon S3) 버킷에 적절한 모델 서명 (signature)과 함께 저장되었습니다. 다음 코드를 참조하십시오.

from sagemaker import image_uris, model_uris, script_uris

# Currently, not all the stable diffusion models in jumpstart support finetuning. Thus, we manually select a model
# which supports finetuning.
train_model_id, train_model_version, train_scope = (
"model-txt2img-stabilityai-stable-diffusion-v2-1-base",
"*",
"training",
)

# Tested with ml.g4dn.2xlarge (16GB GPU memory) and ml.g5.2xlarge (24GB GPU memory) instances. Other instances may work as well.
# If ml.g5.2xlarge instance type is available, please change the following instance type to speed up training.
training_instance_type = "ml.g4dn.2xlarge"

# Retrieve the docker image
train_image_uri = image_uris.retrieve(
region=None,
framework=None,  # automatically inferred from model_id
model_id=train_model_id,
model_version=train_model_version,
image_scope=train_scope,
instance_type=training_instance_type,
)

# Retrieve the training script. This contains all the necessary files including data processing, model training etc.
train_source_uri = script_uris.retrieve(
model_id=train_model_id, model_version=train_model_version, script_scope=train_scope
)

# Retrieve the pre-trained model tarball to further fine-tune
train_model_uri = model_uris.retrieve(
model_id=train_model_id, model_version=train_model_version, model_scope=train_scope
)

이러한 모델별 학습 아티팩트를 사용하여 Estimator 클래스의 개체를 생성할 수 있습니다.

# Create SageMaker Estimator instance
sd_estimator = Estimator(
    role=aws_role,
    image_uri=train_image_uri,
    source_dir=train_source_uri,
    model_uri=train_model_uri,
    entry_point="transfer_learning.py",  # Entry-point file in source_dir and present in train_source_uri.
    instance_count=1,
    instance_type=training_instance_type,
    max_run=360000,
    hyperparameters=hyperparameters,
    output_path=s3_output_location,
    base_job_name=training_job_name,
)

# Launch a SageMaker Training job by passing s3 path of the training data
sd_estimator.fit({"training": training_dataset_s3_path}, logs=True)

Training dataset

다음은 학습 데이터의 형식을 지정하는 방법에 대한 지침입니다.

  • 입력 – 다음 구성과 함께 인스턴스 이미지 dataset.json을 포함하는 디렉터리입니다.
  • 이미지는 .png, .jpg 또는 .jpeg 형식일 수 있습니다.
  • dataset_info.json 파일은 {'instance_prompt':<<instance_prompt>>} 형식이어야 합니다.
  • 출력 – 추론을 위해 배포할 수 있는 학습된 모델

S3 경로는 s3://bucket_name/input_directory/ 와 같아야 합니다. 후행 / 는 필수입니다.

다음은 학습 데이터의 예시 형식입니다.

input_directory
    |---instance_image_1.png
    |---instance_image_2.png
    |---instance_image_3.png
    |---instance_image_4.png
    |---instance_image_5.png
    |---dataset_info.json

사전 보존 (prior preservation) 을 사용하는 동안 데이터를 포맷하는 방법에 대한 지침은 이 블로그의 사전 보존 섹션을 참조하십시오.

여기서는 고양이 이미지의 기본 데이터 세트를 제공합니다. 클래스 이미지가 없는 한 마리 고양이의 8개 이미지(인스턴스 프롬프트에 해당하는 인스턴스 이미지)로 구성됩니다. GitHub에서 다운로드할 수 있습니다. 기본 데이터 세트를 사용하는 경우 데모 노트북에서 추론을 수행하는 동안 “a photo of a riobugger cat” 프롬프트를 시도하십시오.

라이선스: MIT.

Hyperparameters

다음으로 사용자 지정 데이터 세트에 대한 전이 학습을 위해 학습 하이퍼 파라미터의 기본값을 변경해야 할 수 있습니다. hyperparameters.retrieve_default를 호출하여 기본값이 있는 이러한 하이퍼 파라미터의 Python 딕셔너리를 가져오고 필요에 따라 업데이트한 다음 Estimator 클래스에 전달할 수 있습니다. 다음 코드를 참조 하십시오.

from sagemaker import hyperparameters
# Retrieve the default hyper-parameters for fine-tuning the model
hyperparameters = hyperparameters.retrieve_default(
model_id=train_model_id, model_version=train_model_version
)

# [Optional] Override default hyperparameters with custom values
hyperparameters["max_steps"] = "400"

미세 조정 알고리즘에서 지원하는 하이퍼 파라미터는 다음과 같습니다.

  • with_prior_preservation – 사전 보존 손실을 추가하는 플래그입니다. 사전 보존은 과적합을 방지하는 regularizer입니다. (선택: ["True","False"], 기본값: "False" .)
  • num_class_images – 사전 보존 손실에 대한 최소 클래스 이미지입니다. with_prior_preservation = True이고 class_data_dir에 이미 이미지가 충분하지 않은 경우 추가 이미지가 class_prompt로 샘플링됩니다. (값: 양의 정수, 기본값: 100.)
  • Epochs – 미세 조정 알고리즘이 학습 데이터 세트를 모두 사용하는 패스 수 (The number of passes) 입니다. (값: 양의 정수, 기본값: 20.)
  • Max_steps – 수행할 총 학습 단계 수입니다. None이 아니면 Epoch 을 대체(Override) 합니다. (값: "None" 또는 정수 문자열, 기본값: "None".)
  • Batch size – 모델 가중치가 업데이트되기 전에 처리되는 학습 예제 (training examples)의 수입니다. with_prior_preservation = True인 경우 클래스 이미지 생성 동안 Batch size와 동일합니다. (값: 양의 정수, 기본값: 1.)
  • learning_rate – 학습 예제의 각 배치를 작업한 후 모델 가중치가 업데이트되는 속도입니다. (값: 양의 실수, 기본값: 2e-06.)
  • prior_loss_weight – 사전 보존 손실의 가중치. (값: 양의 실수, 기본값: 1.0.)
  • center_crop – 원하는 해상도로 크기를 조정하기 전에 이미지를 자를지 여부. (선택: ["True"/"False"], 기본값: "False" .)
  • lr_scheduler – learning_rate 스케줄러 유형입니다. (선택 사항: ["linear", "cosine", "cosine_with_restarts", "polynomial", "constant", "constant_with_warmup"], 기본값: "constant" .) 자세한 내용은Learning Rate스케줄러를 참조하세요.
  • adam_weight_decayAdamW 옵티마이저의 모든 bias 및 LayerNorm 가중치를 제외한 모든 레이어에 적용할 가중치 감쇠 (0이 아닌 경우). (값: float, 기본값: 1e-2.)
  • adam_beta1AdamW 옵티마이저에 대한 beta 1 하이퍼 파라미터 (첫 모멘트 추정치에 대한 지수적 감쇠율)입니다. (값: float, 기본값: 0.9.)
  • adam_beta2AdamW 옵티마이저에 대한 beta 2 하이퍼 파라미터(첫 모멘트 추정치에 대한 지수적 감쇠율)입니다. (값: float, 기본값: 0.999.)
  • adam_epsilonAdamW 옵티마이저의 epsilon 하이퍼 파라미터. 일반적으로 0으로 나누지 않도록 작은 값으로 설정합니다. (값: float, 기본값: 1e-8.)
  • gradient_accumulation_steps – 역방향/업데이트 패스를 수행하기 전에 누적할 업데이트 단계의 수입니다. (값: 정수, 기본값: 1.)
  • max_grad_norm – 최대 기울기 표준 (기울기 클리핑용). (값: float, 기본값: 1.0.)
  • seed – 학습에서 재현 가능한 결과를 얻기 위해 무작위 상태를 수정합니다. (값: 정수, 기본값: 0.)

파인 튜닝된 모델 배포

모델 학습이 완료되면 지속적인 실시간 엔드포인트에 모델을 직접 배포할 수 있습니다. 필요한 Docker 이미지 URI 및 스크립트 URI를 가져오고 모델을 배포합니다. 다음 코드를 참조하십시오.

inference_instance_type = "ml.g4dn.2xlarge"

# Retrieve the inference docker container uri
deploy_image_uri = image_uris.retrieve(
    region=None,
    framework=None,  # automatically inferred from model_id
    image_scope="inference",
    model_id=train_model_id,
    model_version=train_model_version,
    instance_type=inference_instance_type,
)

# Retrieve the inference script uri. This includes scripts for model loading, inference handling etc.
deploy_source_uri = script_uris.retrieve(
    model_id=train_model_id, model_version=train_model_version, script_scope="inference"
)

# Use the estimator from the previous step to deploy to a SageMaker endpoint
finetuned_predictor = sd_estimator.deploy(
    initial_instance_count=1,
    instance_type=inference_instance_type,
    entry_point="inference.py",  # entry point file in source_dir and present in deploy_source_uri
    image_uri=deploy_image_uri,
    source_dir=deploy_source_uri,
    endpoint_name=endpoint_name,
)	

왼쪽에는 모델을 미세 조정하는 데 사용되는 riobugger라는 고양이의 훈련 이미지가 있습니다(max_steps = 400을 제외한 기본 매개변수). 가운데와 오른쪽은 해변에서 riobugger의 이미지와 연필 스케치를 예측하도록 요청했을 때 미세 조정된 모델에 의해 생성된 이미지입니다.

지원되는 파라미터, 응답 형식 등 추론에 대한 자세한 내용은 Amazon SageMaker JumpStart에서 Stable Diffusion 모델을 사용하여 텍스트에서 이미지 생성을 참조하십시오.

SageMaker 자동 모델 튜닝으로 Stable Diffusion 모델 튜닝

Stable Diffusion 모델을 미세 조정하기 위해 좋은 하이퍼 파라미터 세트를 선택하는 것은 어려운 일입니다. 이 섹션에서는 Amazon SageMaker Automatic Model Tuning을 적용하여 최적의 하이퍼 파라미터를 찾는 방법을 설명합니다. 먼저 automatic model tuning (자동 모델 튜닝)으로 최적화할 하이퍼파라미터 범위를 정의합니다. 최적화할 수 있는 많은 하이퍼 파라미터가 있지만 learning_ratemax_steps가 가장 중요한 두 가지 하이퍼 파라미터인 것으로 보고되었습니다. 다음 코드를 참조하십시오.

hyperparameter_ranges = {
    "learning_rate": ContinuousParameter(1e-7, 3e-6, "Linear"),
    "max_steps": IntegerParameter(50, 400, "Linear")
}

다음으로 SageMaker 하이퍼 파라미터 튜닝 API와 상호 작용할 HyperparameterTuner 객체를 정의합니다. 이 블로그 게시물에서는 학습 이미지와 DreamBooth 논문에 표시된 프롬프트 목록을 기반으로 생성된 생성 이미지 간의 fid_score 메트릭을 최소화합니다. 이러한 프롬프트에 대한 자세한 내용은 DreamBooth: Fine Tuning Text-to-Image Diffusion Models for Subject-Driven Generation 논문을 참조하십시오. FID는 생성 모델에 의해 생성된 이미지의 품질을 측정하는 데 사용되는 메트릭입니다. FID가 작을수록 품질이 좋습니다. 또한 Stable Diffusion 논문에서 생성 품질을 평가하는 데 사용됩니다. FID에 대한 자세한 내용은 High-Resolution Image Synthesis with Latent Diffusion Models 논문을 참조하십시오. fid_score 지표는 JumpStart에서 제공하는 훈련 스크립트에 의해 자동으로 방출되며 자동 모델 튜닝에서 직접 사용할 수 있습니다. 다음 코드를 참조하십시오.

# To compute and emit FID metric, set estimator parameter compute_fid to be True
sd_estimator.set_hyperparameters(compute_fid="True")
metric_definitions = [
       {'Name': 'fid_score', 'Regex': 'fid_score=([-+]?\\d\\.?\\d*)'},
]
tuner_parameters = {
    "estimator": sd_estimator,
    "metric_definitions": metric_definitions,
    "objective_metric_name": "fid_score",
    "objective_type": "Minimize",
    "hyperparameter_ranges": hyperparameter_ranges,
    "max_jobs": 7,
    "max_parallel_jobs": 7,
    "strategy": "Bayesian",
    "base_tuning_job_name": training_job_name,
}

bayesian_tuner = HyperparameterTuner(**tuner_parameters)
bayesian_tuner.fit({"training": training_dataset_s3_path}, wait=False)

위의 모델 배포와 유사하게 조정 작업이 완료된 후 최상의 모델을 지속적인 실시간 엔드포인트에 배포할 수 있습니다. 다음 코드를 참조하십시오.

finetuned_predictor = bayesian_tuner.deploy(
 initial_instance_count=1,
 instance_type=inference_instance_type,
 entry_point="inference.py", # entry point file in source_dir and present in deploy_source_uri
 image_uri=deploy_image_uri,
 source_dir=deploy_source_uri,
 endpoint_name=endpoint_name,
 )

왼쪽에는 모델을 미세 조정하는 데 사용되는 riobugger라는 고양이의 학습 이미지가 있습니다. 가운데와 오른쪽은 해변에서 riobugger의 이미지와 연필 스케치를 예측하도록 요청했을 때 automatic model tuning (자동 모델 튜닝)으로 찾은 최상의 미세 조정 모델에서 생성된 이미지입니다. 자동 모델 튜닝 없이 위에서 생성된 이미지와 비교할 때 새로 생성된 이미지가 학습 이미지에 더 충실함을 알 수 있습니다. 예를 들어, 다음 연필 스케치의 칼라(강아지 목에 거는 목걸이)는 학습 이미지와 유사하지만 위에서 생성된 것에는 칼라가 없습니다.

Access JumpStart through the Studio UI

이 섹션에서는 Studio UI를 통해 JumpStart 모델을 학습하고 배포하는 방법을 설명합니다. 다음 비디오는 JumpStart에서 사전 학습된 Stable Diffusion 모델을 찾아서 학습한 다음 배포하는 방법을 보여줍니다. 모델 페이지에는 모델에 대한 유용한 정보와 사용 방법이 포함되어 있습니다. SageMaker training instance를 구성한 후, Train을 선택합니다. 모델이 학습된 후에는 Deploy를 선택하여 학습된 모델을 배포할 수 있습니다. endpoint가 “In service” 단계에 있으면 추론 요청에 응답할 준비가 된 것입니다.

아래를 클릭하면 비디오를 볼 수 있습니다.

https://d2908q01vomqb2.cloudfront.net/artifacts/DBSBlogs/ML-13389/sd_txt2_img_finetuning.mp4?_=1

추론에 걸리는 시간을 단축하기 위해 JumpStart는 새로 만든 endpoint에서 추론을 실행하는 방법을 보여주는 샘플 노트북을 제공합니다. Studio에서 노트북에 액세스하려면 모델endpoint페이지의 Studio에서 endpoint 사용 (Use Endpoint from Studio) 섹션에서 노트북 열기 (Open Notebook)를 선택합니다.

또한 JumpStart는 stable diffusion 모델을 미세 조정하고, 그 결과의 미세 조정된 모델을 배포하는 데 사용할 수 있는 간단한 노트북을 제공합니다. 이 노트북을 사용하여 반려견의 재미있는 이미지를 생성할 수 있습니다. 노트북에 액세스하려면 JumpStart 검색창에서 “Generate Fun images of your dog”을 검색하면 됩니다. 노트북을 실행하려면 최소 5장의 학습 이미지를 사용하여 로컬 studio 폴더에 업로드할 수 있습니다. 이미지가 5장 이상이면 그 이상도 업로드할 수 있습니다. 노트북은 학습 이미지를 S3에 업로드하고 데이터 세트에서 모델을 학습한 후 결과 모델을 배포합니다. 학습이 완료되는 데 20분 정도 걸릴 수 있습니다. step 수를 변경해 학습 속도를 높일 수 있습니다. 노트북은 배포된 모델을 사용해 볼 수 있는 몇 가지 샘플 프롬프트를 제공하지만 원하는 프롬프트를 사용해 볼 수 있습니다. 노트북을 조정하여 본인 또는 반려동물의 아바타를 만들 수도 있습니다. 예를 들어, 첫 스텝에서 개 대신 고양이 이미지를 업로드한 다음 프롬프트를 개에서 고양이로 변경하면 모델이 고양이 이미지를 생성할 수 있습니다.

아래를 클릭하면 비디오를 보실 수 있습니다.

https://d2908q01vomqb2.cloudfront.net/artifacts/DBSBlogs/ML-13389/fun_dog_images_generator.mp4?_=2

Fine-tuning considerations

Stable Diffusion모델을 학습하면 빠르게 과적합되는 경향이 있습니다. 좋은 품질의 이미지를 얻으려면 학습 스텝 수와 learning rate와 같이 이용할 수 있는 학습 하이퍼 파라미터들 간에 적절한 균형을 찾아야 합니다. 이 섹션에서는 몇 가지 실험 결과를 보여주고 이러한 파라미터들을 설정하는 방법에 대한 지침을 제공합니다.

권장 사항

다음 권장 사항을 고려합니다.

  • 좋은 품질의 훈련 이미지 (4 ~ 20징)로 시작합니다. 사람 얼굴을 대상으로 학습하는 경우 더 많은 이미지가 필요할 수 있습니다.
  • 개나 고양이 및 기타 사람이 아닌 피사체를 대상으로 학습할 때는 200 – 400스텝으로 학습을 합니다. 사람 얼굴에 대해 학습하는 경우 더 많은 스텝들이 필요할 수 있습니다. 만약 오버피팅이 발생하면 스텝 수를 줄여야 하며, 과소 피팅이 발생하면 (미세 조정된 모델이 대상 피사체의 이미지를 생성할 수 없는 경우), 스텝 수를 늘려야 합니다.
  • 사람이 아닌 얼굴에 대해 학습하는 경우 성능에 큰 영향을 미치지 않으므로 with_prior_preservation = False로 설정할 수 있습니다. 사람 얼굴의 경우 with_prior_preservation = True로 설정해야 할 수 있습니다.
  • with_prior_preservation = True로 설정하는 경우g5.2xlarge 인스턴스 유형을 사용합니다.
  • 여러 피사체를 순차적으로 학습할 때 피사체가 매우 유사한 경우(예: 모든 개들), 모델은 마지막 피사체를 유지하고 이전 피사체는 잊어버립니다. 피사체가 다른 경우(예: 먼저 고양이, 그 다음 개) 모델은 두 피사체를 모두 유지합니다.
  • 낮은 learning rate을 설정하고 만족스러운 결과가 나올 때까지 스텝 수를 점진적으로 늘리는 것이 좋습니다.

학습 데이터 세트

미세 조정된 모델의 품질은 학습 이미지의 품질에 직접적인 영향을 받습니다. 따라서 좋은 결과를 얻으려면 고품질 이미지를 수집해야 합니다. 흐릿하거나 해상도가 낮은 이미지는 미세 조정된 모델의 품질에 영향을 미칩니다. 다음과 같은 추가 파라미터들을 염두해야 합니다.:

  • 학습 이미지의 수 – 최소 4장의 학습 이미지로 모델을 미세 조정할 수 있습니다. 최소 4장의 이미지에서 최대 16장의 이미지로 학습 데이터 세트로 실험했습니다. 두 경우 모두 미세 조정을 통해 모델을 피사체에 맞게 조정할 수 있었습니다.
  • 데이터 세트 형식 – .png, .jpg, .jpeg 형식의 이미지에 대해 미세 조정 알고리즘을 테스트했습니다. 다른 형식 또한 동작할 수 있습니다.
  • 이미지 해상도 – 학습 이미지는 어떤 해상도라도 상관없습니다. 미세 조정 알고리즘은 미세 조정을 시작하기 전에 모든 학습 이미지의 크기를 조정합니다. 즉, 학습 이미지의 자르기 (cropping) 및 크기 조정 (resizing)을 보다 세밀하게 제어하려면 이미지의 크기를 모델의 기본 해상도(이 예에서는 512×512픽셀)로 직접 조정하는 것이 좋습니다.

실험 설정

이 블로그의 실험에서는 미세 조정하는 동안 특별히 지정하지 않는 한 하이퍼 파라미터의 기본값을 사용합니다. 또한 네 가지 데이터 세트 중 하나를 사용합니다:

  • Dog1-8 : 8장 이미지가 있는 Dog 1
  • Dog1-16 : 16장 이미지가 있는 Dog 1
  • Dog2-4 : 4장 이미지가 있는 Dog 2
  • Cat-8 : 8장 이미지가 있는 Cat

혼란을 줄이기 위해 각 섹션에는 데이터 세트의 대표 이미지 하나만 데이터 세트 이름과 함께 표시합니다. 전체 학습 세트는 이 블로그의 실험 데이터 세트 섹션에서 확인할 수 있습니다.

Overfitting

Stable Diffusion모델은 몇 개의 이미지에서 미세 조정할 때 과적합하는 경향이 있습니다. 따라서 epochs, max_epochs , learning rate와 같은 파라미터를 신중하게 선택해야 합니다. 이 섹션에서는 Dog1-16 데이터 세트를 사용했습니다.

모델의 성능을 평가하기 위해 4가지 작업에 대해 미세 조정된 모델을 평가합니다:

  • 미세 조정된 모델이 학습된 것과 동일한 환경에서 피사체(Doppler Dog)의 이미지를 생성할 수 있나요?
    • 관찰 – 예, 가능합니다. 모델 성능은 훈련 스텝의 수에 따라 증가한다는 점에 주목할 필요가 있습니다.
  • 미세 조정된 모델이 학습된 환경과 다른 설정에서 피사체의 이미지를 생성할 수 있나요? 예를 들어 해변에서 Doppler의 이미지를 생성할 수 있나요?
    • 관찰 – 네, 가능합니다. 모델 성능은 특정 지점까지 훈련 스텝의 수에 따라 증가한다는 점에 주목할 필요가 있습니다. 그러나 모델을 너무 오랫동안 학습시키면 모델이 과적합하는 경향이 있어 모델 성능이 저하됩니다.
  • 미세 조정된 모델이 학습 대상이 속한 클래스의 이미지를 생성할 수 있나요? 예를 들어, 일반적인 개의 이미지를 생성할 수 있나요?
    • 관찰 – 학습 스텝의 수가 증가함에 따라 모델이 과적합하기 시작합니다. 결과적으로 개라는 일반적인 클래스를 잊어버리고 피사체와 관련된 이미지만 생성합니다.
  • 미세 조정된 모델이 학습 데이터 세트에 없는 클래스나 피사체의 이미지를 생성할 수 있나요? 예를 들어 고양이 이미지를 생성할 수 있나요?
    • 관찰 – 학습 스텝의 수를 늘리면 모델이 과적합하기 시작합니다. 결과적으로 지정된 클래스에 관계없이 피사체와 관련된 이미지만 생성합니다.

(max_steps 하이퍼 파라미터를 설정하여) 스텝 수를 달리하여 모델을 미세 조정하고, 미세 조정된 각 모델에 대해 다음 네 가지 프롬프트 각각에 이미지를 생성합니다 (다음 예시에서는 왼쪽에서 오른쪽으로 표시됨):

  • “A photo of a Doppler dog”
  • “A photo of a Doppler dog on a beach”
  • “A photo of a dog”
  • “A photo of a cat”

다음 이미지들은 50 스텝으로 학습된 모델의 이미지입니다.

다음 이미지들은 100 스텝으로 학습된 모델의 이미지입니다.

다음 모델을 200스텝으로 학습시켰습니다.

다음 이미지는 400스텝으로 학습된 모델에서 가져온 것입니다.

마지막으로 다음 이미지는 800스텝의 결과입니다.

여러 데이터 세트들에 대한 학습

미세 조정하는 동안 여러 피사체에 대해 미세 조정을 하고, 미세 조정된 모델이 모든 피사체의 이미지를 생성할 수 있도록 할 수 있습니다. 안타깝게도 현재 JumpStart는 단일 피사체에 대한 학습으로 제한되어 있습니다. 동시에 여러 피사체에 대해 모델을 미세 조정할 수 없습니다. 또한 여러 피사체에 대해 모델을 순차적으로 미세 조정하면 피사체가 유사한 경우 모델이 첫 번째 피사체를 잊어버리게 됩니다.

이 섹션에서는 다음 실험을 고려합니다:

  1. 대상 A에 대한 모델을 미세 조정합니다.
  2. 피사체 B에 대해 1번의 결과 모델을 미세 조정합니다.
  3. 2번의 결과 모델을 사용하여 피사체 A와 피사체 B의 이미지를 생성합니다.

다음 실험에서는 이를 관찰합니다:

  • A가 dog 1이고 B가 dog 2인 경우, 3 번에서 생성된 모든 이미지는 dog 2와 유사합니다.
  • A가 dog 2이고 B가 dog 1인 경우, 3 번에서 생성된 모든 이미지는 dog 1과 유사합니다.
  • A가 dog 1이고 B가 cat인 경우, dog 프롬프트로 생성된 이미지는 dog 1과 유사하고 cat 프롬프트로 생성된 이미지는 cat와 유사합니다.

dog 1 학습 후 dog 2 학습한 경우

1번에서, dog 1의 8장 이미지에 대해 200스텝으로 모델을 미세 조정하고, 2번에서는 dog 2의 4장 이미지에 대해 200스텝으로 모델을 추가로 미세 조정합니다.

다음은 2번의 결과로 미세 조정된 모델에서 다양한 프롬프트에 대해 생성된 이미지입니다.

dogs와 cats 학습하기

1번에서는 cat 이미지 8장에 대해 200스텝으로 모델을 미세 조정합니다. 그런 다음 dog 1의 이미지 8장에 대해 200스텝에 걸쳐 모델을 추가로 미세 조정합니다.

다음은 2번이 끝난 후 미세 조정된 모델에서 생성된 이미지입니다. cat 관련 프롬프트가 있는 이미지는 미세 조정 1번의 cat처럼 보이고, dog 관련 프롬프트가 있는 이미지는 미세 조정 2번의 dog처럼 보입니다.

Prior preservation

Prior preservation은 학습하려는 클래스와 동일한 클래스의 이미지를 추가로 사용하는 기술입니다. 예를 들어, 학습 데이터가 특정 개의 이미지로 구성된 경우, Prior preservation을 통해 일반 개의 클래스 이미지를 통합합니다. 특정 개를 훈련하는 동안 다른 개의 이미지를 보여줌으로써 과적합을 피하려고 합니다. 인스턴스 프롬프트에 있는 특정 개를 나타내는 태그가 클래스 프롬프트에 누락되었습니다. 예를 들어 인스턴스 프롬프트는 “a photo of a riobugger cat”이고 클래스 프롬프트는 “a photo of a cat.”일 수 있습니다. with_prior_preservation = True하이퍼 파라미터를 설정하여 Prior preservation을 활성화할 수 있습니다. with_prior_preservation = True로 설정하는 경우, dataset_info.jsonclass_prompt를 포함해야 하며, 사용 가능한 모든 클래스 이미지를 포함할 수 있습니다. 다음은 with_prior_preservation = True로 설정한 경우의 학습 데이터 세트 형식입니다:

  • input – 인스턴스 이미지들, dataset_info.json 및 (선택적으로) 디렉토리 class_data_dir이 포함된 디렉토리입니다. 다음 사항을 고려하여:
    • 이미지는 .png, .jpg, .jpeg 형식일 수 있습니다.
    • dataset_info.json 파일은 {'instance_prompt':<<instance_prompt>>,'class_prompt':<<class_prompt>>} 형식이어야 합니다.
    • class_data_dir 디렉터리에는 클래스 이미지들이 있어야 합니다. class_data_dir에 클래스 이미지들이 없거나 이미 있는 이미지들이 충분하지 않은 경우, 추가 이미지들은 class_prompt을 사용하여 샘플링합니다.

cat과 dog 같은 데이터 세트의 경우, Prior preservation은 미세 조정된 모델의 성능에 큰 영향을 미치지 않으므로 피할 수 있습니다. 그러나 얼굴에 대해 학습할 때는 Prior preservation이 필요합니다. 자세한 내용은 Training Stable Diffusion with Dreambooth using Diffusers를 참조합니다.

Instance types

Stable Diffusion모델을 미세 조정하려면 GPU 지원 인스턴스가 제공하는 가속화된 계산이 필요합니다. ml.g4dn.2xlarge(16GB CUDA 메모리, 1 GPU)와 ml.g5.2xlarge(24GB CUDA 메모리, 1 GPU) 인스턴스로 미세 조정을 실험해 보았습니다. 클래스 이미지를 생성할 때 메모리 요구량이 더 높습니다. 따라서 ml.g4dn.2xlarge 인스턴스에서 훈련 시 CUDA 메모리 부족 문제가 발생하므로 with_prior_preservation=True로 설정하는 경우 ml.g5.2xlarge 인스턴스 유형을 사용하는 것이 좋습니다. 현재 JumpStart 미세 조정 스크립트는 단일 GPU를 사용하므로 멀티 GPU 인스턴스에서 미세 조정을 수행해도 성능 향상을 얻을 수 없습니다. 다양한 인스턴스 유형에 대한 자세한 내용은 Amazon EC2 인스턴스 유형을 참조합니다.

Limitations and bias

Stable Diffusion은 이미지 생성에 있어 인상적인 성능을 제공하지만 몇 가지 제한 사항과 편향성을 가지고 있습니다. 여기에는 다음이 포함되지만 이에 국한되지는 않습니다:

  • 학습 데이터에 이러한 특징이 있는 이미지가 충분히 포함되어 있지 않아 모델이 정확한 얼굴이나 팔다리를 생성하지 못할 수 있습니다.
  • 모델은 성인용 콘텐츠가 포함된 LAION-5B 데이터 세트를 기반으로 학습되었으므로 추가 고려 없이는 제품 사용에 적합하지 않을 수 있습니다.
  • 모델이 영어 텍스트로 학습되었기 때문에 비영어권 언어에서는 모델이 제대로 작동하지 않을 수 있습니다.
  • 모델이 이미지들 내에서 제대로 된 텍스트를 생성하지 못할 수 있습니다.

제한 사항 및 편향에 대한 자세한 내용은 Stable Diffusion v2-1-base Model Card에서 확인합니다. 사전 학습된 모델에 대한 이러한 제한 사항은 미세 조정된 모델에도 적용될 수 있습니다.

Clean up

노트북 실행을 마친 후에는 결제가 중지되도록 프로세스에서 생성된 모든 리소스를 삭제해야 합니다. Endpoint를 정리하는 코드는 관련된 Introduction to JumpStart – Text to Image 예제 노트북에서 제공됩니다.

JumpStart에서 공개적으로 사용 가능한 미세 조정 모델

StabilityAI에서 출시한 Stable Diffusion 모델은 인상적인 성능을 보여주지만 학습된 언어나 도메인 측면에서 한계가 있습니다. 예를 들어 Stable Diffusion 모델은 영어 텍스트에 대해 학습되었지만 영어가 아닌 텍스트에서 이미지를 생성해야 할 수 있습니다. 또는 Stable Diffusion 모델은 사실적인 이미지를 생성하도록 훈련되었지만 애니메이션 또는 예술적인 이미지를 생성해야 할 수도 있습니다.

JumpStart는 다양한 언어와 테마로 공개적으로 사용 가능한 80개 이상의 모델을 제공합니다. 이러한 모델은 종종 StabilityAI에서 출시한 Stable Diffusion 모델에서 미세 조정된 버전입니다. 사용 사례가 미세 조정된 모델 중 하나와 일치하는 경우 자체 데이터 세트를 수집하고 미세 조정할 필요가 없습니다. Studio UI를 통해 또는 사용하기 쉬운 JumpStart API를 사용하여 이러한 모델 중 하나를 간단히 배포할 수 있습니다. 사전 학습된 Stable Diffusion 모델을 JumpStart에 배포하려면 Generate images from text with the stable diffusion model on Amazon SageMaker JumpStart를 참조합니다.

다음은 JumpStart에서 사용할 수 있는 다양한 모델에서 생성된 이미지의 몇 가지 예입니다.

이러한 모델들은 JumpStart 스크립트 또는 DreamBooth 스크립트를 사용하여 미세 조정할 수 없습니다. 여기에서 예제 프롬프트와 함께 공개적으로 사용 가능한 미세 조정된 모델의 전체 목록을 다운로드할 수 있습니다.

이러한 모델들에서 생성된 더 많은 예제 이미지들을 보려면 Appendix의 Open Sourced Fine-tuned models섹션을 참조합니다.

결론

이 블로그에서는 text-to-image를 위한 Stable Diffusion모델을 미세 조정한 다음 JumpStart를 사용하여 배포하는 방법을 보여드렸습니다. 또한 Amazon SageMaker Automatic Model Tuning을 적용하여 최상의 모델 버전을 찾는 방법에 대해서도 설명했습니다. 더욱이, 모델을 미세 조정할 때 고려해야 할 몇 가지 사항과 미세 조정된 모델의 성능에 어떤 영향을 미칠 수 있는지에 대해 논의했습니다. 추가적으로, JumpStart에서 바로 사용할 수 있는 80개 이상의 미세 조정 모델들에 대해서도 논의했습니다. 이 블로그에서는 일부 코드들도 보여드렸는데, 이 데모의 모든 단계가 포함된 전체 코드는 Introduction to JumpStart – Text to Image예제 노트북을 참조합니다.

SageMaker Studio Lab에서 모델을 미세 조정하고 배포하려면 다음 GitHub repo를 참조합니다. 직접 솔루션을 사용해 보고 의견을 보내주세요.

더 많은 모델들과 DreamBooth의 미세 조정에 대해 자세히 알아보려면 다음 리소스를 참조합니다:

JumpStart에 대해 자세히 알아보려면 다음 블로그 게시물을 확인합니다:

Appendix: Experiment datasets

이 섹션에는 이 블로그의 실험에 사용된 데이터 세트가 포함되어 있습니다.

Dog1-8

Dog1-16

Dog2-4

Dog3-8

Appendix: Open Sourced Fine-tuned models

다음은 JumpStart에서 이용할 수 있는 다양한 모델들에서 생성된 이미지들의 몇 가지 예들입니다. 각 이미지의 캡션은 접두사 huggingface-txt2img-로 시작하는 model_id와 다음 줄에 이미지 생성에 사용된 프롬프트가 있습니다.

Youngjoon Choi

Youngjoon Choi

최영준 Principal AI/ML Expert SA는 제조, 하이테크, 금융 등의 다양한 산업에서 엔터프라이즈 IT를 경험하면서 개발자로, 아키텍트로, 데이터 과학자로 다양한 활동을 하였습니다. 기계학습과 딥러닝 연구를 진행하였고, 구체적으로 Hyperparameter optimization과Domain adaptation등을 주제로 알고리즘 연구와 논문 발표를 진행하였습니다. AWS에서는 AI/ML를 전문 분야로 다양한 산업군에서 분산학습/초거대 모델 개발과 ML 파이프라인 구축 등에 대해 AWS 서비스를 이용한 기술 검증 지원, 아키텍처 제안 및 검토 등을 수행하고 있으며, AI/ML 생태계가 더욱 확장할 수 있도록 다양한 기여를 하고자 합니다.

Gonsoo Moon

Gonsoo Moon

AWS AIML 스페셜리스트 솔루션즈 아키텍트로 일하고 있습니다. AI/ML 의 다양한 유스케이스 및 프러뎍션 경험을 바탕으로 고객의 AI/ML 문제를 해결하기 위해 고객과 함께 고민하고 협업하는 일을 주로 하고 있습니다. AI/ML 기술을 데이터 과학자, 개발자, 분석가 분에게 전파하여, 글로벌 및 한국 사회가 발전될 수 있게 기여를 하고자 합니다.