Spaces:
No application file
No application file
<!--Copyright 2023 The HuggingFace Team. All rights reserved. | |
Licensed under the Apache License, Version 2.0 (the "License"); you may not use this file except in compliance with | |
the License. You may obtain a copy of the License at | |
http://www.apache.org/licenses/LICENSE-2.0 | |
Unless required by applicable law or agreed to in writing, software distributed under the License is distributed on | |
an "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. See the License for the | |
specific language governing permissions and limitations under the License. | |
--> | |
[[open-in-colab]] | |
# ํ์ด๋ณด๊ธฐ | |
Diffusion ๋ชจ๋ธ์ ์ด๋ฏธ์ง๋ ์ค๋์ค์ ๊ฐ์ ๊ด์ฌ ์ํ๋ค์ ์์ฑํ๊ธฐ ์ํด ๋๋ค ๊ฐ์ฐ์์ ๋ ธ์ด์ฆ๋ฅผ ๋จ๊ณ๋ณ๋ก ์ ๊ฑฐํ๋๋ก ํ์ต๋ฉ๋๋ค. ์ด๋ก ์ธํด ์์ฑ AI์ ๋ํ ๊ด์ฌ์ด ๋งค์ฐ ๋์์ก์ผ๋ฉฐ, ์ธํฐ๋ท์์ diffusion ์์ฑ ์ด๋ฏธ์ง์ ์๋ฅผ ๋ณธ ์ ์ด ์์ ๊ฒ์ ๋๋ค. ๐งจ Diffusers๋ ๋๊ตฌ๋ diffusion ๋ชจ๋ธ๋ค์ ๋๋ฆฌ ์ด์ฉํ ์ ์๋๋ก ํ๊ธฐ ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ค. | |
๊ฐ๋ฐ์๋ ์ผ๋ฐ ์ฌ์ฉ์๋ ์ด ํ์ด๋ณด๊ธฐ๋ฅผ ํตํด ๐งจ diffusers๋ฅผ ์๊ฐํ๊ณ ๋น ๋ฅด๊ฒ ์์ฑํ ์ ์๋๋ก ๋์๋๋ฆฝ๋๋ค! ์์์ผ ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฃผ์ ๊ตฌ์ฑ ์์๋ ํฌ๊ฒ ์ธ ๊ฐ์ง์ ๋๋ค: | |
* [`DiffusionPipeline`]์ ์ถ๋ก ์ ์ํด ์ฌ์ ํ์ต๋ diffusion ๋ชจ๋ธ์์ ์ํ์ ๋น ๋ฅด๊ฒ ์์ฑํ๋๋ก ์ค๊ณ๋ ๋์ ์์ค์ ์๋ํฌ์๋ ํด๋์ค์ ๋๋ค. | |
* Diffusion ์์คํ ์์ฑ์ ์ํ ๋น๋ฉ ๋ธ๋ก์ผ๋ก ์ฌ์ฉํ ์ ์๋ ๋๋ฆฌ ์ฌ์ฉ๋๋ ์ฌ์ ํ์ต๋ [model](./api/models) ์ํคํ ์ฒ ๋ฐ ๋ชจ๋. | |
* ๋ค์ํ [schedulers](./api/schedulers/overview) - ํ์ต์ ์ํด ๋ ธ์ด์ฆ๋ฅผ ์ถ๊ฐํ๋ ๋ฐฉ๋ฒ๊ณผ ์ถ๋ก ์ค์ ๋ ธ์ด์ฆ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ์ ์ดํ๋ ์๊ณ ๋ฆฌ์ฆ์ ๋๋ค. | |
ํ์ด๋ณด๊ธฐ์์๋ ์ถ๋ก ์ ์ํด [`DiffusionPipeline`]์ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ๋ณด์ฌ์ค ๋ค์, ๋ชจ๋ธ๊ณผ ์ค์ผ์ค๋ฌ๋ฅผ ๊ฒฐํฉํ์ฌ [`DiffusionPipeline`] ๋ด๋ถ์์ ์ผ์ด๋๋ ์ผ์ ๋ณต์ ํ๋ ๋ฐฉ๋ฒ์ ์๋ดํฉ๋๋ค. | |
<Tip> | |
ํ์ด๋ณด๊ธฐ๋ ๊ฐ๊ฒฐํ ๋ฒ์ ์ ๐งจ Diffusers ์๊ฐ๋ก์ [๋ ธํธ๋ถ](https://colab.research.google.com/github/huggingface/notebooks/blob/main/diffusers/diffusers_intro.ipynb) ๋น ๋ฅด๊ฒ ์์ํ ์ ์๋๋ก ๋์๋๋ฆฝ๋๋ค. ๋ํจ์ ์ ๋ชฉํ, ๋์์ธ ์ฒ ํ, ํต์ฌ API์ ๋ํ ์ถ๊ฐ ์ธ๋ถ ์ ๋ณด๋ฅผ ์์ธํ ์์๋ณด๋ ค๋ฉด ๋ ธํธ๋ถ์ ํ์ธํ์ธ์! | |
</Tip> | |
์์ํ๊ธฐ ์ ์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๊ฐ ๋ชจ๋ ์ค์น๋์ด ์๋์ง ํ์ธํ์ธ์: | |
```py | |
# ์ฃผ์ ํ์ด์ Colab์ ํ์ํ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ค์นํ๊ธฐ. | |
#!pip install --upgrade diffusers accelerate transformers | |
``` | |
- [๐ค Accelerate](https://huggingface.co/docs/accelerate/index)๋ ์ถ๋ก ๋ฐ ํ์ต์ ์ํ ๋ชจ๋ธ ๋ก๋ฉ ์๋๋ฅผ ๋์ฌ์ค๋๋ค. | |
- [๐ค Transformers](https://huggingface.co/docs/transformers/index)๋ [Stable Diffusion](https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/overview)๊ณผ ๊ฐ์ด ๊ฐ์ฅ ๋ง์ด ์ฌ์ฉ๋๋ diffusion ๋ชจ๋ธ์ ์คํํ๋ ๋ฐ ํ์ํฉ๋๋ค. | |
## DiffusionPipeline | |
[`DiffusionPipeline`] ์ ์ถ๋ก ์ ์ํด ์ฌ์ ํ์ต๋ diffusion ์์คํ ์ ์ฌ์ฉํ๋ ๊ฐ์ฅ ์ฌ์ด ๋ฐฉ๋ฒ์ ๋๋ค. ๋ชจ๋ธ๊ณผ ์ค์ผ์ค๋ฌ๋ฅผ ํฌํจํ๋ ์๋ ํฌ ์๋ ์์คํ ์ ๋๋ค. ๋ค์ํ ์์ ์ [`DiffusionPipeline`]์ ๋ฐ๋ก ์ฌ์ฉํ ์ ์์ต๋๋ค. ์๋ ํ์์ ์ง์๋๋ ๋ช ๊ฐ์ง ์์ ์ ์ดํด๋ณด๊ณ , ์ง์๋๋ ์์ ์ ์ ์ฒด ๋ชฉ๋ก์ [๐งจ Diffusers Summary](./api/pipelines/overview#diffusers-summary) ํ์์ ํ์ธํ ์ ์์ต๋๋ค. | |
| **Task** | **Description** | **Pipeline** | |
|------------------------------|--------------------------------------------------------------------------------------------------------------|-----------------| | |
| Unconditional Image Generation | generate an image from Gaussian noise | [unconditional_image_generation](./using-diffusers/unconditional_image_generation) | | |
| Text-Guided Image Generation | generate an image given a text prompt | [conditional_image_generation](./using-diffusers/conditional_image_generation) | | |
| Text-Guided Image-to-Image Translation | adapt an image guided by a text prompt | [img2img](./using-diffusers/img2img) | | |
| Text-Guided Image-Inpainting | fill the masked part of an image given the image, the mask and a text prompt | [inpaint](./using-diffusers/inpaint) | | |
| Text-Guided Depth-to-Image Translation | adapt parts of an image guided by a text prompt while preserving structure via depth estimation | [depth2img](./using-diffusers/depth2img) | | |
๋จผ์ [`DiffusionPipeline`]์ ์ธ์คํด์ค๋ฅผ ์์ฑํ๊ณ ๋ค์ด๋ก๋ํ ํ์ดํ๋ผ์ธ ์ฒดํฌํฌ์ธํธ๋ฅผ ์ง์ ํฉ๋๋ค. | |
ํ๊น ํ์ด์ค ํ๋ธ์ ์ ์ฅ๋ ๋ชจ๋ [checkpoint](https://huggingface.co/models?library=diffusers&sort=downloads)์ ๋ํด [`DiffusionPipeline`]์ ์ฌ์ฉํ ์ ์์ต๋๋ค. | |
์ด ํ์ด๋ณด๊ธฐ์์๋ text-to-image ์์ฑ์ ์ํ [`stable-diffusion-v1-5`](https://huggingface.co/runwayml/stable-diffusion-v1-5) ์ฒดํฌํฌ์ธํธ๋ฅผ ๋ก๋ํฉ๋๋ค. | |
<Tip warning={true}> | |
[Stable Diffusion](https://huggingface.co/CompVis/stable-diffusion) ๋ชจ๋ธ์ ๊ฒฝ์ฐ, ๋ชจ๋ธ์ ์คํํ๊ธฐ ์ ์ [๋ผ์ด์ ์ค](https://huggingface.co/spaces/CompVis/stable-diffusion-license)๋ฅผ ๋จผ์ ์ฃผ์ ๊น๊ฒ ์ฝ์ด์ฃผ์ธ์. ๐งจ Diffusers๋ ๋ถ์พํ๊ฑฐ๋ ์ ํดํ ์ฝํ ์ธ ๋ฅผ ๋ฐฉ์งํ๊ธฐ ์ํด [`safety_checker`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/stable_diffusion/safety_checker.py)๋ฅผ ๊ตฌํํ๊ณ ์์ง๋ง, ๋ชจ๋ธ์ ํฅ์๋ ์ด๋ฏธ์ง ์์ฑ ๊ธฐ๋ฅ์ผ๋ก ์ธํด ์ฌ์ ํ ์ ์ฌ์ ์ผ๋ก ์ ํดํ ์ฝํ ์ธ ๊ฐ ์์ฑ๋ ์ ์์ต๋๋ค. | |
</Tip> | |
[`~DiffusionPipeline.from_pretrained`] ๋ฐฉ๋ฒ์ผ๋ก ๋ชจ๋ธ ๋ก๋ํ๊ธฐ: | |
```python | |
>>> from diffusers import DiffusionPipeline | |
>>> pipeline = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5") | |
``` | |
The [`DiffusionPipeline`]์ ๋ชจ๋ ๋ชจ๋ธ๋ง, ํ ํฐํ, ์ค์ผ์ค๋ง ์ปดํฌ๋ํธ๋ฅผ ๋ค์ด๋ก๋ํ๊ณ ์บ์ํฉ๋๋ค. Stable Diffusion Pipeline์ ๋ฌด์๋ณด๋ค๋ [`UNet2DConditionModel`]๊ณผ [`PNDMScheduler`]๋ก ๊ตฌ์ฑ๋์ด ์์์ ์ ์ ์์ต๋๋ค: | |
```py | |
>>> pipeline | |
StableDiffusionPipeline { | |
"_class_name": "StableDiffusionPipeline", | |
"_diffusers_version": "0.13.1", | |
..., | |
"scheduler": [ | |
"diffusers", | |
"PNDMScheduler" | |
], | |
..., | |
"unet": [ | |
"diffusers", | |
"UNet2DConditionModel" | |
], | |
"vae": [ | |
"diffusers", | |
"AutoencoderKL" | |
] | |
} | |
``` | |
์ด ๋ชจ๋ธ์ ์ฝ 14์ต ๊ฐ์ ํ๋ผ๋ฏธํฐ๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฏ๋ก GPU์์ ํ์ดํ๋ผ์ธ์ ์คํํ ๊ฒ์ ๊ฐ๋ ฅํ ๊ถ์ฅํฉ๋๋ค. | |
PyTorch์์์ ๋ง์ฐฌ๊ฐ์ง๋ก ์ ๋๋ ์ดํฐ ๊ฐ์ฒด๋ฅผ GPU๋ก ์ด๋ํ ์ ์์ต๋๋ค: | |
```python | |
>>> pipeline.to("cuda") | |
``` | |
์ด์ `ํ์ดํ๋ผ์ธ`์ ํ ์คํธ ํ๋กฌํํธ๋ฅผ ์ ๋ฌํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ๋ค์ ๋ ธ์ด์ฆ๊ฐ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง์ ์ก์ธ์คํ ์ ์์ต๋๋ค. ๊ธฐ๋ณธ์ ์ผ๋ก ์ด๋ฏธ์ง ์ถ๋ ฅ์ [`PIL.Image`](https://pillow.readthedocs.io/en/stable/reference/Image.html?highlight=image#the-image-class) ๊ฐ์ฒด๋ก ๊ฐ์ธ์ง๋๋ค. | |
```python | |
>>> image = pipeline("An image of a squirrel in Picasso style").images[0] | |
>>> image | |
``` | |
<div class="flex justify-center"> | |
<img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/image_of_squirrel_painting.png"/> | |
</div> | |
`save`๋ฅผ ํธ์ถํ์ฌ ์ด๋ฏธ์ง๋ฅผ ์ ์ฅํฉ๋๋ค: | |
```python | |
>>> image.save("image_of_squirrel_painting.png") | |
``` | |
### ๋ก์ปฌ ํ์ดํ๋ผ์ธ | |
ํ์ดํ๋ผ์ธ์ ๋ก์ปฌ์์ ์ฌ์ฉํ ์๋ ์์ต๋๋ค. ์ ์ผํ ์ฐจ์ด์ ์ ๊ฐ์ค์น๋ฅผ ๋จผ์ ๋ค์ด๋ก๋ํด์ผ ํ๋ค๋ ์ ์ ๋๋ค: | |
```bash | |
!git lfs install | |
!git clone https://huggingface.co/runwayml/stable-diffusion-v1-5 | |
``` | |
๊ทธ๋ฐ ๋ค์ ์ ์ฅ๋ ๊ฐ์ค์น๋ฅผ ํ์ดํ๋ผ์ธ์ ๋ก๋ํฉ๋๋ค: | |
```python | |
>>> pipeline = DiffusionPipeline.from_pretrained("./stable-diffusion-v1-5") | |
``` | |
์ด์ ์ ์น์ ์์์ ๊ฐ์ด ํ์ดํ๋ผ์ธ์ ์คํํ ์ ์์ต๋๋ค. | |
### ์ค์ผ์ค๋ฌ ๊ต์ฒด | |
์ค์ผ์ค๋ฌ๋ง๋ค ๋ ธ์ด์ฆ ์ ๊ฑฐ ์๋์ ํ์ง์ด ์๋ก ๋ค๋ฆ ๋๋ค. ์์ ์๊ฒ ๊ฐ์ฅ ์ ํฉํ ์ค์ผ์ค๋ฌ๋ฅผ ์ฐพ๋ ๊ฐ์ฅ ์ข์ ๋ฐฉ๋ฒ์ ์ง์ ์ฌ์ฉํด ๋ณด๋ ๊ฒ์ ๋๋ค! ๐งจ Diffusers์ ์ฃผ์ ๊ธฐ๋ฅ ์ค ํ๋๋ ์ค์ผ์ค๋ฌ ๊ฐ์ ์ฝ๊ฒ ์ ํ์ด ๊ฐ๋ฅํ๋ค๋ ๊ฒ์ ๋๋ค. ์๋ฅผ ๋ค์ด, ๊ธฐ๋ณธ ์ค์ผ์ค๋ฌ์ธ [`PNDMScheduler`]๋ฅผ [`EulerDiscreteScheduler`]๋ก ๋ฐ๊พธ๋ ค๋ฉด, [`~diffusers.ConfigMixin.from_config`] ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ก๋ํ์ธ์: | |
```py | |
>>> from diffusers import EulerDiscreteScheduler | |
>>> pipeline = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5") | |
>>> pipeline.scheduler = EulerDiscreteScheduler.from_config(pipeline.scheduler.config) | |
``` | |
์ ์ค์ผ์ค๋ฌ๋ก ์ด๋ฏธ์ง๋ฅผ ์์ฑํด๋ณด๊ณ ์ด๋ค ์ฐจ์ด๊ฐ ์๋์ง ํ์ธํด ๋ณด์ธ์! | |
๋ค์ ์น์ ์์๋ ๋ชจ๋ธ๊ณผ ์ค์ผ์ค๋ฌ๋ผ๋ [`DiffusionPipeline`]์ ๊ตฌ์ฑํ๋ ์ปดํฌ๋ํธ๋ฅผ ์์ธํ ์ดํด๋ณด๊ณ ์ด๋ฌํ ์ปดํฌ๋ํธ๋ฅผ ์ฌ์ฉํ์ฌ ๊ณ ์์ด ์ด๋ฏธ์ง๋ฅผ ์์ฑํ๋ ๋ฐฉ๋ฒ์ ๋ฐฐ์๋ณด๊ฒ ์ต๋๋ค. | |
## ๋ชจ๋ธ | |
๋๋ถ๋ถ์ ๋ชจ๋ธ์ ๋ ธ์ด์ฆ๊ฐ ์๋ ์ํ์ ๊ฐ์ ธ์ ๊ฐ ์๊ฐ ๊ฐ๊ฒฉ๋ง๋ค ๋ ธ์ด์ฆ๊ฐ ์ ์ ์ด๋ฏธ์ง์ ์ ๋ ฅ ์ด๋ฏธ์ง ์ฌ์ด์ ์ฐจ์ด์ธ *๋ ธ์ด์ฆ ์์ฐจ*(๋ค๋ฅธ ๋ชจ๋ธ์ ์ด์ ์ํ์ ์ง์ ์์ธกํ๊ฑฐ๋ ์๋ ๋๋ [`v-prediction`](https://github.com/huggingface/diffusers/blob/5e5ce13e2f89ac45a0066cb3f369462a3cf1d9ef/src/diffusers/schedulers/scheduling_ddim.py#L110)์ ์์ธกํ๋ ํ์ต์ ํฉ๋๋ค)์ ์์ธกํฉ๋๋ค. ๋ชจ๋ธ์ ๋ฏน์ค ์ค ๋งค์นํ์ฌ ๋ค๋ฅธ diffusion ์์คํ ์ ๋ง๋ค ์ ์์ต๋๋ค. | |
๋ชจ๋ธ์ [`~ModelMixin.from_pretrained`] ๋ฉ์๋๋ก ์์๋๋ฉฐ, ์ด ๋ฉ์๋๋ ๋ชจ๋ธ ๊ฐ์ค์น๋ฅผ ๋ก์ปฌ์ ์บ์ํ์ฌ ๋ค์์ ๋ชจ๋ธ์ ๋ก๋ํ ๋ ๋ ๋น ๋ฅด๊ฒ ๋ก๋ํ ์ ์์ต๋๋ค. ํ์ด๋ณด๊ธฐ์์๋ ๊ณ ์์ด ์ด๋ฏธ์ง์ ๋ํด ํ์ต๋ ์ฒดํฌํฌ์ธํธ๊ฐ ์๋ ๊ธฐ๋ณธ์ ์ธ unconditional ์ด๋ฏธ์ง ์์ฑ ๋ชจ๋ธ์ธ [`UNet2DModel`]์ ๋ก๋ํฉ๋๋ค: | |
```py | |
>>> from diffusers import UNet2DModel | |
>>> repo_id = "google/ddpm-cat-256" | |
>>> model = UNet2DModel.from_pretrained(repo_id) | |
``` | |
๋ชจ๋ธ ๋งค๊ฐ๋ณ์์ ์ก์ธ์คํ๋ ค๋ฉด `model.config`๋ฅผ ํธ์ถํฉ๋๋ค: | |
```py | |
>>> model.config | |
``` | |
๋ชจ๋ธ ๊ตฌ์ฑ์ ๐ง ๊ณ ์ ๋ ๐ง ๋์ ๋๋ฆฌ๋ก, ๋ชจ๋ธ์ด ์์ฑ๋ ํ์๋ ํด๋น ๋งค๊ฐ ๋ณ์๋ค์ ๋ณ๊ฒฝํ ์ ์์ต๋๋ค. ์ด๋ ์๋์ ์ธ ๊ฒ์ผ๋ก, ์ฒ์์ ๋ชจ๋ธ ์ํคํ ์ฒ๋ฅผ ์ ์ํ๋ ๋ฐ ์ฌ์ฉ๋ ๋งค๊ฐ๋ณ์๋ ๋์ผํ๊ฒ ์ ์งํ๋ฉด์ ๋ค๋ฅธ ๋งค๊ฐ๋ณ์๋ ์ถ๋ก ์ค์ ์กฐ์ ํ ์ ์๋๋ก ํ๊ธฐ ์ํ ๊ฒ์ ๋๋ค. | |
๊ฐ์ฅ ์ค์ํ ๋งค๊ฐ๋ณ์๋ค์ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: | |
* `sample_size`: ์ ๋ ฅ ์ํ์ ๋์ด ๋ฐ ๋๋น ์น์์ ๋๋ค. | |
* `in_channels`: ์ ๋ ฅ ์ํ์ ์ ๋ ฅ ์ฑ๋ ์์ ๋๋ค. | |
* `down_block_types` ๋ฐ `up_block_types`: UNet ์ํคํ ์ฒ๋ฅผ ์์ฑํ๋ ๋ฐ ์ฌ์ฉ๋๋ ๋ค์ด ๋ฐ ์ ์ํ๋ง ๋ธ๋ก์ ์ ํ. | |
* `block_out_channels`: ๋ค์ด์ํ๋ง ๋ธ๋ก์ ์ถ๋ ฅ ์ฑ๋ ์. ์ ์ํ๋ง ๋ธ๋ก์ ์ ๋ ฅ ์ฑ๋ ์์ ์ญ์์ผ๋ก ์ฌ์ฉ๋๊ธฐ๋ ํฉ๋๋ค. | |
* `layers_per_block`: ๊ฐ UNet ๋ธ๋ก์ ์กด์ฌํ๋ ResNet ๋ธ๋ก์ ์์ ๋๋ค. | |
์ถ๋ก ์ ๋ชจ๋ธ์ ์ฌ์ฉํ๋ ค๋ฉด ๋๋ค ๊ฐ์ฐ์์ ๋ ธ์ด์ฆ๋ก ์ด๋ฏธ์ง ๋ชจ์์ ๋ง๋ญ๋๋ค. ๋ชจ๋ธ์ด ์ฌ๋ฌ ๊ฐ์ ๋ฌด์์ ๋ ธ์ด์ฆ๋ฅผ ์์ ํ ์ ์์ผ๋ฏ๋ก 'batch' ์ถ, ์ ๋ ฅ ์ฑ๋ ์์ ํด๋นํ๋ 'channel' ์ถ, ์ด๋ฏธ์ง์ ๋์ด์ ๋๋น๋ฅผ ๋ํ๋ด๋ 'sample_size' ์ถ์ด ์์ด์ผ ํฉ๋๋ค: | |
```py | |
>>> import torch | |
>>> torch.manual_seed(0) | |
>>> noisy_sample = torch.randn(1, model.config.in_channels, model.config.sample_size, model.config.sample_size) | |
>>> noisy_sample.shape | |
torch.Size([1, 3, 256, 256]) | |
``` | |
์ถ๋ก ์ ์ํด ๋ชจ๋ธ์ ๋ ธ์ด์ฆ๊ฐ ์๋ ์ด๋ฏธ์ง์ `timestep`์ ์ ๋ฌํฉ๋๋ค. 'timestep'์ ์ ๋ ฅ ์ด๋ฏธ์ง์ ๋ ธ์ด์ฆ ์ ๋๋ฅผ ๋ํ๋ด๋ฉฐ, ์์ ๋ถ๋ถ์ ๋ ๋ง์ ๋ ธ์ด์ฆ๊ฐ ์๊ณ ๋ ๋ถ๋ถ์ ๋ ์ ์ ๋ ธ์ด์ฆ๊ฐ ์์ต๋๋ค. ์ด๋ฅผ ํตํด ๋ชจ๋ธ์ด diffusion ๊ณผ์ ์์ ์์ ๋๋ ๋์ ๋ ๊ฐ๊น์ด ์์น๋ฅผ ๊ฒฐ์ ํ ์ ์์ต๋๋ค. `sample` ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ๋ชจ๋ธ ์ถ๋ ฅ์ ์ป์ต๋๋ค: | |
```py | |
>>> with torch.no_grad(): | |
... noisy_residual = model(sample=noisy_sample, timestep=2).sample | |
``` | |
ํ์ง๋ง ์ค์ ์๋ฅผ ์์ฑํ๋ ค๋ฉด ๋ ธ์ด์ฆ ์ ๊ฑฐ ํ๋ก์ธ์ค๋ฅผ ์๋ดํ ์ค์ผ์ค๋ฌ๊ฐ ํ์ํฉ๋๋ค. ๋ค์ ์น์ ์์๋ ๋ชจ๋ธ์ ์ค์ผ์ค๋ฌ์ ๊ฒฐํฉํ๋ ๋ฐฉ๋ฒ์ ๋ํด ์์๋ด ๋๋ค. | |
## ์ค์ผ์ค๋ฌ | |
์ค์ผ์ค๋ฌ๋ ๋ชจ๋ธ ์ถ๋ ฅ์ด ์ฃผ์ด์ก์ ๋ ๋ ธ์ด์ฆ๊ฐ ๋ง์ ์ํ์์ ๋ ธ์ด์ฆ๊ฐ ์ ์ ์ํ๋ก ์ ํํ๋ ๊ฒ์ ๊ด๋ฆฌํฉ๋๋ค - ์ด ๊ฒฝ์ฐ 'noisy_residual'. | |
<Tip> | |
๐งจ Diffusers๋ Diffusion ์์คํ ์ ๊ตฌ์ถํ๊ธฐ ์ํ ํด๋ฐ์ค์ ๋๋ค. [`DiffusionPipeline`]์ ์ฌ์ฉํ๋ฉด ๋ฏธ๋ฆฌ ๋ง๋ค์ด์ง Diffusion ์์คํ ์ ํธ๋ฆฌํ๊ฒ ์์ํ ์ ์์ง๋ง, ๋ชจ๋ธ๊ณผ ์ค์ผ์ค๋ฌ ๊ตฌ์ฑ ์์๋ฅผ ๊ฐ๋ณ์ ์ผ๋ก ์ ํํ์ฌ ์ฌ์ฉ์ ์ง์ Diffusion ์์คํ ์ ๊ตฌ์ถํ ์๋ ์์ต๋๋ค. | |
</Tip> | |
ํ์ด๋ณด๊ธฐ์ ๊ฒฝ์ฐ, [`~diffusers.ConfigMixin.from_config`] ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ [`DDPMScheduler`]๋ฅผ ์ธ์คํด์คํํฉ๋๋ค: | |
```py | |
>>> from diffusers import DDPMScheduler | |
>>> scheduler = DDPMScheduler.from_config(repo_id) | |
>>> scheduler | |
DDPMScheduler { | |
"_class_name": "DDPMScheduler", | |
"_diffusers_version": "0.13.1", | |
"beta_end": 0.02, | |
"beta_schedule": "linear", | |
"beta_start": 0.0001, | |
"clip_sample": true, | |
"clip_sample_range": 1.0, | |
"num_train_timesteps": 1000, | |
"prediction_type": "epsilon", | |
"trained_betas": null, | |
"variance_type": "fixed_small" | |
} | |
``` | |
<Tip> | |
๐ก ์ค์ผ์ค๋ฌ๊ฐ ๊ตฌ์ฑ์์ ์ด๋ป๊ฒ ์ธ์คํด์คํ๋๋์ง ์ฃผ๋ชฉํ์ธ์. ๋ชจ๋ธ๊ณผ ๋ฌ๋ฆฌ ์ค์ผ์ค๋ฌ์๋ ํ์ต ๊ฐ๋ฅํ ๊ฐ์ค์น๊ฐ ์์ผ๋ฉฐ ๋งค๊ฐ๋ณ์๋ ์์ต๋๋ค! | |
</Tip> | |
๊ฐ์ฅ ์ค์ํ ๋งค๊ฐ๋ณ์๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค: | |
* `num_train_timesteps`: ๋ ธ์ด์ฆ ์ ๊ฑฐ ํ๋ก์ธ์ค์ ๊ธธ์ด, ์ฆ ๋๋ค ๊ฐ์ฐ์ค ๋ ธ์ด์ฆ๋ฅผ ๋ฐ์ดํฐ ์ํ๋ก ์ฒ๋ฆฌํ๋ ๋ฐ ํ์ํ ํ์์คํ ์์ ๋๋ค. | |
* `beta_schedule`: ์ถ๋ก ๋ฐ ํ์ต์ ์ฌ์ฉํ ๋ ธ์ด์ฆ ์ค์ผ์ค ์ ํ์ ๋๋ค. | |
* `beta_start` ๋ฐ `beta_end`: ๋ ธ์ด์ฆ ์ค์ผ์ค์ ์์ ๋ฐ ์ข ๋ฃ ๋ ธ์ด์ฆ ๊ฐ์ ๋๋ค. | |
๋ ธ์ด์ฆ๊ฐ ์ฝ๊ฐ ์ ์ ์ด๋ฏธ์ง๋ฅผ ์์ธกํ๋ ค๋ฉด ์ค์ผ์ค๋ฌ์ [`~diffusers.DDPMScheduler.step`] ๋ฉ์๋์ ๋ชจ๋ธ ์ถ๋ ฅ, `timestep`, ํ์ฌ `sample`์ ์ ๋ฌํ์ธ์. | |
```py | |
>>> less_noisy_sample = scheduler.step(model_output=noisy_residual, timestep=2, sample=noisy_sample).prev_sample | |
>>> less_noisy_sample.shape | |
``` | |
`less_noisy_sample`์ ๋ค์ `timestep`์ผ๋ก ๋๊ธฐ๋ฉด ๋ ธ์ด์ฆ๊ฐ ๋ ์ค์ด๋ญ๋๋ค! ์ด์ ์ด ๋ชจ๋ ๊ฒ์ ํ๋ฐ ๋ชจ์ ์ ์ฒด ๋ ธ์ด์ฆ ์ ๊ฑฐ ๊ณผ์ ์ ์๊ฐํํด ๋ณด๊ฒ ์ต๋๋ค. | |
๋จผ์ ๋ ธ์ด์ฆ ์ ๊ฑฐ๋ ์ด๋ฏธ์ง๋ฅผ ํ์ฒ๋ฆฌํ์ฌ `PIL.Image`๋ก ํ์ํ๋ ํจ์๋ฅผ ๋ง๋ญ๋๋ค: | |
```py | |
>>> import PIL.Image | |
>>> import numpy as np | |
>>> def display_sample(sample, i): | |
... image_processed = sample.cpu().permute(0, 2, 3, 1) | |
... image_processed = (image_processed + 1.0) * 127.5 | |
... image_processed = image_processed.numpy().astype(np.uint8) | |
... image_pil = PIL.Image.fromarray(image_processed[0]) | |
... display(f"Image at step {i}") | |
... display(image_pil) | |
``` | |
๋ ธ์ด์ฆ ์ ๊ฑฐ ํ๋ก์ธ์ค์ ์๋๋ฅผ ๋์ด๋ ค๋ฉด ์ ๋ ฅ๊ณผ ๋ชจ๋ธ์ GPU๋ก ์ฎ๊ธฐ์ธ์: | |
```py | |
>>> model.to("cuda") | |
>>> noisy_sample = noisy_sample.to("cuda") | |
``` | |
์ด์ ๋ ธ์ด์ฆ๊ฐ ์ ์ ์ํ์ ์์ฐจ๋ฅผ ์์ธกํ๊ณ ์ค์ผ์ค๋ฌ๋ก ๋ ธ์ด์ฆ๊ฐ ์ ์ ์ํ์ ๊ณ์ฐํ๋ ๋ ธ์ด์ฆ ์ ๊ฑฐ ๋ฃจํ๋ฅผ ์์ฑํฉ๋๋ค: | |
```py | |
>>> import tqdm | |
>>> sample = noisy_sample | |
>>> for i, t in enumerate(tqdm.tqdm(scheduler.timesteps)): | |
... # 1. predict noise residual | |
... with torch.no_grad(): | |
... residual = model(sample, t).sample | |
... # 2. compute less noisy image and set x_t -> x_t-1 | |
... sample = scheduler.step(residual, t, sample).prev_sample | |
... # 3. optionally look at image | |
... if (i + 1) % 50 == 0: | |
... display_sample(sample, i + 1) | |
``` | |
๊ฐ๋งํ ์์์ ๊ณ ์์ด๊ฐ ์์์ผ๋ก๋ง ์์ฑ๋๋ ๊ฒ์ ์ง์ผ๋ณด์ธ์!๐ป | |
<div class="flex justify-center"> | |
<img src="https://huggingface.co/datasets/huggingface/documentation-images/resolve/main/diffusers/diffusion-quicktour.png"/> | |
</div> | |
## ๋ค์ ๋จ๊ณ | |
์ด๋ฒ ํ์ด๋ณด๊ธฐ์์ ๐งจ Diffusers๋ก ๋ฉ์ง ์ด๋ฏธ์ง๋ฅผ ๋ง๋ค์ด ๋ณด์ จ๊ธฐ๋ฅผ ๋ฐ๋๋๋ค! ๋ค์ ๋จ๊ณ๋ก ๋์ด๊ฐ์ธ์: | |
* [training](./tutorials/basic_training) ํํ ๋ฆฌ์ผ์์ ๋ชจ๋ธ์ ํ์ตํ๊ฑฐ๋ ํ์ธํ๋ํ์ฌ ๋๋ง์ ์ด๋ฏธ์ง๋ฅผ ์์ฑํ ์ ์์ต๋๋ค. | |
* ๋ค์ํ ์ฌ์ฉ ์ฌ๋ก๋ ๊ณต์ ๋ฐ ์ปค๋ฎค๋ํฐ [ํ์ต ๋๋ ํ์ธํ๋ ์คํฌ๋ฆฝํธ](https://github.com/huggingface/diffusers/tree/main/examples#-diffusers-examples) ์์๋ฅผ ์ฐธ์กฐํ์ธ์. | |
* ์ค์ผ์ค๋ฌ ๋ก๋, ์ก์ธ์ค, ๋ณ๊ฒฝ ๋ฐ ๋น๊ต์ ๋ํ ์์ธํ ๋ด์ฉ์ [๋ค๋ฅธ ์ค์ผ์ค๋ฌ ์ฌ์ฉ](./using-diffusers/schedulers) ๊ฐ์ด๋์์ ํ์ธํ์ธ์. | |
* [Stable Diffusion](./stable_diffusion) ๊ฐ์ด๋์์ ํ๋กฌํํธ ์์ง๋์ด๋ง, ์๋ ๋ฐ ๋ฉ๋ชจ๋ฆฌ ์ต์ ํ, ๊ณ ํ์ง ์ด๋ฏธ์ง ์์ฑ์ ์ํ ํ๊ณผ ์๋ น์ ์ดํด๋ณด์ธ์. | |
* [GPU์์ ํ์ดํ ์น ์ต์ ํ](./optimization/fp16) ๊ฐ์ด๋์ [์ ํ ์ค๋ฆฌ์ฝ(M1/M2)์์์ Stable Diffusion](./optimization/mps) ๋ฐ [ONNX ๋ฐํ์](./optimization/onnx) ์คํ์ ๋ํ ์ถ๋ก ๊ฐ์ด๋๋ฅผ ํตํด ๐งจ Diffuser ์๋๋ฅผ ๋์ด๋ ๋ฐฉ๋ฒ์ ๋ ์์ธํ ์์๋ณด์ธ์. |