How to create pipeline?
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]

이 코드는 훈련된 모델을 사용하여 이미지를 생성하는 파이프라인을 설정하고, 그 파이프라인을 통해 이미지를 생성하는 작업을 수행한다.
- 'DDPMPipeline' 클래스를 'diffusers' 라이브러리에서 import
- 이미지 생성 파이프라인 설정
- 잎서 훈련된 U-Net 모델을 사용
- 앞서 설정한 노이즈 스케줄러를 사용
- 이 파이프라인은 노이즈가 추가된 이미지를 입력받아 노이즈를 제거하여 깨끗한 이미지를 생성하는 역할을 한다.
- 이미지 생성
- 노이즈를 제거하여 깨끗한 이미지 생성
- 생성된 이미지 출력
이미지 파이프라인을 로컬 폴더에 저장하기
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