학부연구생/Diffusion Model

How to create pipeline?

yooni825 2024. 7. 1. 14:14

https://yooni-archive.tistory.com/64에 마지막 단계인 Step 6. Generatre Images 에 대한 내용을 이어서 적어보았다.

Step 6. Generate Images

Option 1 : Creating a pipeline :

훈련된 모델을 사용하여 이미지를 생성하는 파이프라인을 설정하고, 그 파이프라인을 통해 이미지를 생성하는 작업을 수행한다.

from diffusers import DDPMPipeline

# 모델과 scheduler를 사용자가 설정할 수 있음 
image_pipe = DDPMPipeline(unet=model, scheduler=noise_scheduler)
pipeline_output = image_pipe()
pipeline_output.images[0]

이 코드는 훈련된 모델을 사용하여 이미지를 생성하는 파이프라인을 설정하고, 그 파이프라인을 통해 이미지를 생성하는 작업을 수행한다.

  1. 'DDPMPipeline' 클래스를 'diffusers' 라이브러리에서 import
  2. 이미지 생성 파이프라인 설정
    • 잎서 훈련된 U-Net 모델을 사용
    • 앞서 설정한 노이즈 스케줄러를 사용
    •  파이프라인은 노이즈가 추가된 이미지를 입력받아 노이즈를 제거하여 깨끗한 이미지를 생성하는 역할을 한다.
  3. 이미지 생성
    • 노이즈를 제거하여 깨끗한 이미지 생성
  4. 생성된 이미지 출력

이미지 파이프라인을 로컬 폴더에 저장하기

image_pipe.save_pretrained("my_pipeline")

폴더 내용 검사하기

!ls my_pipeline/
!ls my_pipeline/unet/
  • scheduler와 unet하위 폴더에는 해당 구성 요소를 재구성하는데 필요한 모든 것이 포함되어 있다. 예를 들어, U-Net 폴더 안에는 모델 가중치 (diffusion_pytorch_model.bin) 와 U-Net 아키텍쳐를 지정하는 Config 파일이 있다.
  • 이 파일들을 함께 사용하면 파이프라인을 재구성하는데 필요한 모든것이 포함된다. 이 파일들을 수동으로 업로드하여 다른 사람들과 파이프라인을 공유할 수 있으며, 다음 섹션에서는 API를 통해 이를 수행하는 방법을 확인할 수 있다.

Option 2 : Writing a Sampling Loop

파이프라인의 forward 메서드를 검사하면 image_pipe()를 실행할 때 어떤 일이 발생하는지 확인할 수 있습니다.

forward 메서드는 PyTorch 모델에서 입력 데이터를 처리하여 출력을 생성하는 핵심 함수이다.

이 메서드를 통해 모델이 어떻게 데이터를 처리하는지, 어떤 연산을 수행하는지 알 수 있다.

랜덤 노이즈로 시작하여, scheduler의 timestep을 가장 노이즈가 많은 단계에서 가장 노이즈가 적은 단계로 순차적으로 진행한다.

각 단계에서 모델 예측에 기반하여 조금씩 노이즈를 제거한다.

# 랜덤 시작점 (8개의 랜덤 이미지 생성):
# 8개의 32X32 RGB 랜덤 이미지 생성 
# t = 1000 일 때의 노이즈가 있는 샘플 
sample = torch.randn(8, 3, 32, 32).to(device)

# 타임스텝 루프 : 각 타임 스텝에서 노이즈를 점진적으로 제거 
for i, t in enumerate(noise_scheduler.timesteps):

    # 모델 예측 얻기 
    # torch.no_grad()를 사용하여 그레디언트 계산을 비활성화 
    with torch.no_grad():
		    # residual : 노이즈를 예측한 것 
        residual = model(sample, t).sample

    # 스텝을 통해 샘플 업데이트 
    # t-1 번째의 sample 이미지를 생성해줌 
    # t번째의 샘플에서 residual로 계산한 노이즈 값을 빼주어 t-1번째의 이미지를 생성 
    sample = noise_scheduler.step(residual, t, sample).prev_sample

# 최종 이미지 시각화 
show_images(sample)
  • noise_scheduler.step() 함수는 샘플을 적절하게 업데이트하는데 필요한 수학적 연산을 수행한다. 이는 샘플에서 노이즈를 점진적으로 제거하는 과정의 일부이다. t-1 번째의 sample 이미지를 생성해준다.

모델을 생성했으면 이제 Hub에 올려보자~!!👊🏻👊🏻

Step 7. Push your model to the Hub

위 예제에서는 파이프라인을 로컬 폴더에 저장했습니다. 모델을 Hub에 업로드하려면 파일을 업로드할 모델 저장소가 필요합니다. 모델에 부여할 모델 ID에서 저장소 이름을 결정합니다. (모델 이름을 자유롭게 변경할 수 있습니다. 단, 사용자 이름이 포함되어야 하며, 이는 get_full_repo_name() 함수가 수행하는 작업입니다.)

from huggingface_hub import get_full_repo_name

model_name = "sd-class-butterflies-32"
hub_model_id = get_full_repo_name(model_name)
hub_model_id

다음으로, 🤗 Hub에서 모델 저장소를 생성하고 모델을 업로드합니다

#`HfApu`와 `create_repo`를 `huggingface_hub` 라이브러리에서 import 
from huggingface_hub import HfApi, create_repo

#모델 저장소 생성 **(이미 존재하는 경우에도 오류 발생하지 않음)**
create_repo(hub_model_id, *exist_ok=True*)
#API 객체 생성 
api = HfApi()
#폴더 업로드 
api.upload_folder(
    folder_path="my_pipeline/scheduler", path_in_repo="", repo_id=hub_model_id
)
api.upload_folder(folder_path="my_pipeline/unet", path_in_repo="", repo_id=hub_model_id)
# 파일 업로드 
api.upload_file(
    path_or_fileobj="my_pipeline/model_index.json",
    path_in_repo="model_index.json",
    repo_id=hub_model_id,
)

여기서 이런 오류가 났다…
HfHubHTTPError: 409 Client Error: Conflict for url: https://huggingface.co/api/repos/create (Request ID: Root=1-667fc68b-76995887238cf5fa4489a33c;de5d8597-a2d7-4d1f-846c-36ae58eca1ed)
You already created this model repo

 

해당 오류 메시지는 모델 저장소가 이미 존재하기 때문에 동일한 이름으로 다시 생성할 수 없다는 것을 의미한다고 한다.. 그래서 코드를 create_repo(hub_model_id, exist_ok=True) 이렇게 바꿔주었다.

 

마지막으로, 우리의 나비 generator를 Hub에서 쉽게 찾을 수 있도록 예쁜 model card를 만드는 것이다.

 

이 코드는 Hugging Face Hub에 업로드할 모델에 대한 설명을 포함하는 모델카드를 생성하고, 이를 Hub에 푸시하는 작업을 수행한다.

모델 카드는 모델의 라이선스, 태그, 사용법 등을 설명하는 문서이다.

from huggingface_hub import ModelCard

# 모델 카드 내용 생성 
content = f"""
---
license: mit
tags:
- pytorch
- diffusers
- unconditional-image-generation
- diffusion-models-class
---

# Model Card for Unit 1 of the [Diffusion Models Class 🧨](https://github.com/huggingface/diffusion-models-class)

This model is a diffusion model for unconditional image generation of cute 🦋.

## Usage

from diffusers import DDPMPipeline

pipeline = DDPMPipeline.from_pretrained('{hub_model_id}')
image = pipeline().images[0]
image

"""

card = ModelCard(content)
card.push_to_hub(hub_model_id)

yooni825/sd-class-butterflies-32

HuggingFace Hub에 upload 성공!!!

이 모델이 Hub에 탑재되었으니 아래와 같이 'DDPMPipeline'의 'from_pretrained()' 방식을 사용하여 어디에서나 다운로드할 수 있습니다.

from diffusers import DDPMPipeline

image_pipe = DDPMPipeline.from_pretrained(hub_model_id)
pipeline_output = image_pipe()
pipeline_output.images[0]

잘 돌아간다!!!!🤩

 

Upload README.md with huggingface_hub · yooni825/sd-class-butterflies-32 at 2670f9b

 

huggingface.co