File size: 17,807 Bytes
43b7e92 |
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 |
<!--Copyright 2024 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.
-->
# ์ฒ ํ
๐งจ Diffusers๋ ๋ค์ํ ๋ชจ๋ฌ๋ฆฌํฐ์์ **์ต์ ์** ์ฌ์ ํ๋ จ๋ diffusion ๋ชจ๋ธ์ ์ ๊ณตํฉ๋๋ค.
๊ทธ ๋ชฉ์ ์ ์ถ๋ก ๊ณผ ํ๋ จ์ ์ํ **๋ชจ๋์ ํด๋ฐ์ค**๋ก ์ฌ์ฉ๋๋ ๊ฒ์
๋๋ค.
์ฐ๋ฆฌ๋ ์ค๋ ์๊ฐ์ ๊ฒฌ๋ ์ ์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํ๋ ๊ฒ์ ๋ชฉํ๋ก ํ๊ณ , ๋ฐ๋ผ์ API ์ค๊ณ๋ฅผ ๋งค์ฐ ์ค์์ํฉ๋๋ค.
๊ฐ๋จํ ๋งํด์, Diffusers๋ PyTorch์ ์์ฐ์ค๋ฌ์ด ํ์ฅ์ด ๋๋๋ก ๊ตฌ์ถ๋์์ต๋๋ค. ๋ฐ๋ผ์ ๋๋ถ๋ถ์ ์ค๊ณ ์ ํ์ [PyTorch์ ์ค๊ณ ์์น](https://pytorch.org/docs/stable/community/design.html#pytorch-design-philosophy)์ ๊ธฐ๋ฐํฉ๋๋ค. ์ด์ ๊ฐ์ฅ ์ค์ํ ๊ฒ๋ค์ ์ดํด๋ณด๊ฒ ์ต๋๋ค:
## ์ฑ๋ฅ๋ณด๋ค๋ ์ฌ์ฉ์ฑ์
- Diffusers๋ ๋ง์ ๋ด์ฅ ์ฑ๋ฅ ํฅ์ ๊ธฐ๋ฅ์ ๊ฐ๊ณ ์์ง๋ง (์์ธํ ๋ด์ฉ์ [๋ฉ๋ชจ๋ฆฌ์ ์๋](https://huggingface.co/docs/diffusers/optimization/fp16) ์ฐธ์กฐ), ๋ชจ๋ธ์ ํญ์ ๊ฐ์ฅ ๋์ ์ ๋ฐ๋์ ์ต์ํ์ ์ต์ ํ๋ก ๋ก๋๋ฉ๋๋ค. ๋ฐ๋ผ์ ๊ธฐ๋ณธ์ ์ธ diffusion ํ์ดํ๋ผ์ธ์ ๋ฐ๋ก ์ ์ํ์ง ์๋๋ค๋ฉด CPU์์ float32 ์ ๋ฐ๋๋ก ์ธ์คํด์คํ๋ฉ๋๋ค. ์ด๋ ๋ค์ํ ํ๋ซํผ๊ณผ ๊ฐ์๊ธฐ์์์ ์ฌ์ฉ์ฑ์ ๋ณด์ฅํ๋ฉฐ, ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์คํํ๊ธฐ ์ํด ๋ณต์กํ ์ค์น๊ฐ ํ์ํ์ง ์์์ ์๋ฏธํฉ๋๋ค.
- Diffusers๋ **๊ฐ๋ฒผ์ด** ํจํค์ง๋ฅผ ์งํฅํ๊ธฐ ๋๋ฌธ์ ํ์ ์ข
์์ฑ์ ๊ฑฐ์ ์์ง๋ง ์ฑ๋ฅ์ ํฅ์์ํฌ ์ ์๋ ๋ง์ ์ ํ์ ์ข
์์ฑ์ด ์์ต๋๋ค (`accelerate`, `safetensors`, `onnx` ๋ฑ). ์ ํฌ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ ํ ๊ฐ๋ณ๊ฒ ์ ์งํ์ฌ ๋ค๋ฅธ ํจํค์ง์ ๋ํ ์ข
์์ฑ ๊ฑฑ์ ์ด ์๋๋ก ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค.
- Diffusers๋ ๊ฐ๊ฒฐํ๊ณ ์ดํดํ๊ธฐ ์ฌ์ด ์ฝ๋๋ฅผ ์ ํธํฉ๋๋ค. ์ด๋ ๋๋ค ํจ์๋ ๊ณ ๊ธ PyTorch ์ฐ์ฐ์์ ๊ฐ์ ์์ถ๋ ์ฝ๋ ๊ตฌ๋ฌธ์ ์์ฃผ ์ฌ์ฉํ์ง ์๋ ๊ฒ์ ์๋ฏธํฉ๋๋ค.
## ์ฌ์๋ณด๋ค๋ ๊ฐ๋จํจ์
PyTorch์์๋ **๋ช
์์ ์ธ ๊ฒ์ด ์์์ ์ธ ๊ฒ๋ณด๋ค ๋ซ๋ค**์ **๋จ์ํ ๊ฒ์ด ๋ณต์กํ ๊ฒ๋ณด๋ค ๋ซ๋ค**๋ผ๊ณ ๋งํฉ๋๋ค. ์ด ์ค๊ณ ์ฒ ํ์ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ์ฌ๋ฌ ๋ถ๋ถ์ ๋ฐ์๋์ด ์์ต๋๋ค:
- [`DiffusionPipeline.to`](https://huggingface.co/docs/diffusers/main/en/api/diffusion_pipeline#diffusers.DiffusionPipeline.to)์ ๊ฐ์ ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ฌ์ฉ์๊ฐ ์ฅ์น ๊ด๋ฆฌ๋ฅผ ํ ์ ์๋๋ก PyTorch์ API๋ฅผ ๋ฐ๋ฆ
๋๋ค.
- ์๋ชป๋ ์
๋ ฅ์ ์กฐ์ฉํ ์์ ํ๋ ๋์ ๊ฐ๊ฒฐํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ๋ฐ์์ํค๋ ๊ฒ์ด ์ฐ์ ์
๋๋ค. Diffusers๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ฐ๋ฅํ ํ ์ฝ๊ฒ ์ฌ์ฉํ ์ ์๋๋ก ํ๋ ๊ฒ๋ณด๋ค ์ฌ์ฉ์๋ฅผ ๊ฐ๋ฅด์น๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค.
- ๋ณต์กํ ๋ชจ๋ธ๊ณผ ์ค์ผ์ค๋ฌ ๋ก์ง์ด ๋ด๋ถ์์ ๋ง๋ฒ์ฒ๋ผ ์ฒ๋ฆฌํ๋ ๋์ ๋
ธ์ถ๋ฉ๋๋ค. ์ค์ผ์ค๋ฌ/์ํ๋ฌ๋ ์๋ก์๊ฒ ์ต์ํ์ ์ข
์์ฑ์ ๊ฐ์ง๊ณ ๋ถ๋ฆฌ๋์ด ์์ต๋๋ค. ์ด๋ก์จ ์ฌ์ฉ์๋ ์ธ๋กค๋ ๋
ธ์ด์ฆ ์ ๊ฑฐ ๋ฃจํ๋ฅผ ์์ฑํด์ผ ํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด ๋ถ๋ฆฌ๋ ๋๋ฒ๊น
์ ๋ ์ฝ๊ฒํ๊ณ ๋
ธ์ด์ฆ ์ ๊ฑฐ ๊ณผ์ ์ ์กฐ์ ํ๊ฑฐ๋ diffusers ๋ชจ๋ธ์ด๋ ์ค์ผ์ค๋ฌ๋ฅผ ๊ต์ฒดํ๋ ๋ฐ ์ฌ์ฉ์์๊ฒ ๋ ๋ง์ ์ ์ด๊ถ์ ์ ๊ณตํฉ๋๋ค.
- diffusers ํ์ดํ๋ผ์ธ์ ๋ฐ๋ก ํ๋ จ๋ ๊ตฌ์ฑ ์์์ธ text encoder, unet ๋ฐ variational autoencoder๋ ๊ฐ๊ฐ ์์ฒด ๋ชจ๋ธ ํด๋์ค๋ฅผ ๊ฐ์ต๋๋ค. ์ด๋ก์จ ์ฌ์ฉ์๋ ์๋ก ๋ค๋ฅธ ๋ชจ๋ธ์ ๊ตฌ์ฑ ์์ ๊ฐ์ ์ํธ ์์ฉ์ ์ฒ๋ฆฌํด์ผ ํ๋ฉฐ, ์ง๋ ฌํ ํ์์ ๋ชจ๋ธ ๊ตฌ์ฑ ์์๋ฅผ ๋ค๋ฅธ ํ์ผ๋ก ๋ถ๋ฆฌํฉ๋๋ค. ๊ทธ๋ฌ๋ ์ด๋ ๋๋ฒ๊น
๊ณผ ์ปค์คํฐ๋ง์ด์ง์ ๋ ์ฝ๊ฒํฉ๋๋ค. DreamBooth๋ Textual Inversion ํ๋ จ์ Diffusers์ 'diffusion ํ์ดํ๋ผ์ธ์ ๋จ์ผ ๊ตฌ์ฑ ์์๋ค์ ๋ถ๋ฆฌํ ์ ์๋ ๋ฅ๋ ฅ' ๋๋ถ์ ๋งค์ฐ ๊ฐ๋จํฉ๋๋ค.
## ์ถ์ํ๋ณด๋ค๋ ์์ ๊ฐ๋ฅํ๊ณ ๊ธฐ์ฌํ๊ธฐ ์ฌ์์
๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋๋ถ๋ถ์ ๋ํด Diffusers๋ [Transformers ๋ผ์ด๋ธ๋ฌ๋ฆฌ](https://github.com/huggingface/transformers)์ ์ค์ํ ์ค๊ณ ์์น์ ์ฑํํฉ๋๋ค, ๋ฐ๋ก ์ฑ๊ธํ ์ถ์ํ๋ณด๋ค๋ copy-pasted ์ฝ๋๋ฅผ ์ ํธํ๋ค๋ ๊ฒ์
๋๋ค. ์ด ์ค๊ณ ์์น์ [Don't repeat yourself (DRY)](https://en.wikipedia.org/wiki/Don%27t_repeat_yourself)์ ๊ฐ์ ์ธ๊ธฐ ์๋ ์ค๊ณ ์์น๊ณผ๋ ๋์กฐ์ ์ผ๋ก ๋งค์ฐ ์๊ฒฌ์ด ๋ถ๋ถํ๋ฐ์.
๊ฐ๋จํ ๋งํด์, Transformers๊ฐ ๋ชจ๋ธ๋ง ํ์ผ์ ๋ํด ์ํํ๋ ๊ฒ์ฒ๋ผ, Diffusers๋ ๋งค์ฐ ๋ฎ์ ์์ค์ ์ถ์ํ์ ๋งค์ฐ ๋
๋ฆฝ์ ์ธ ์ฝ๋๋ฅผ ์ ์งํ๋ ๊ฒ์ ์ ํธํฉ๋๋ค. ํจ์, ๊ธด ์ฝ๋ ๋ธ๋ก, ์ฌ์ง์ด ํด๋์ค๋ ์ฌ๋ฌ ํ์ผ์ ๋ณต์ฌํ ์ ์์ผ๋ฉฐ, ์ด๋ ์ฒ์์๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ์ ์งํ ์ ์๊ฒ ๋ง๋๋ ๋์, ์ํฌ๋ฅธ ์ค๊ณ ์ ํ์ผ๋ก ๋ณด์ผ ์ ์์ต๋๋ค. ํ์ง๋ง ์ด๋ฌํ ์ค๊ณ๋ ๋งค์ฐ ์ฑ๊ณต์ ์ด๋ฉฐ, ์ปค๋ฎค๋ํฐ ๊ธฐ๋ฐ์ ์คํ ์์ค ๊ธฐ๊ณ ํ์ต ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๋งค์ฐ ์ ํฉํฉ๋๋ค. ๊ทธ ์ด์ ๋ ๋ค์๊ณผ ๊ฐ์ต๋๋ค:
- ๊ธฐ๊ณ ํ์ต์ ํจ๋ฌ๋ค์, ๋ชจ๋ธ ์ํคํ
์ฒ ๋ฐ ์๊ณ ๋ฆฌ์ฆ์ด ๋น ๋ฅด๊ฒ ๋ณํํ๋ ๋งค์ฐ ๋น ๋ฅด๊ฒ ์์ง์ด๋ ๋ถ์ผ์ด๊ธฐ ๋๋ฌธ์ ์ค๋ ๊ธฐ๊ฐ ์ง์๋๋ ์ฝ๋ ์ถ์ํ๋ฅผ ์ ์ํ๊ธฐ๊ฐ ๋งค์ฐ ์ด๋ ต์ต๋๋ค.
- ๊ธฐ๊ณ ํ์ต ์ ๋ฌธ๊ฐ๋ค์ ์์ด๋์ด์ ์ฐ๊ตฌ๋ฅผ ์ํด ๊ธฐ์กด ์ฝ๋๋ฅผ ๋น ๋ฅด๊ฒ ์กฐ์ ํ ์ ์์ด์ผ ํ๋ฏ๋ก, ๋ง์ ์ถ์ํ๋ณด๋ค๋ ๋
๋ฆฝ์ ์ธ ์ฝ๋๋ฅผ ์ ํธํฉ๋๋ค.
- ์คํ ์์ค ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ ์ปค๋ฎค๋ํฐ ๊ธฐ์ฌ์ ์์กดํ๋ฏ๋ก, ๊ธฐ์ฌํ๊ธฐ ์ฌ์ด ๋ผ์ด๋ธ๋ฌ๋ฆฌ๋ฅผ ๊ตฌ์ถํด์ผ ํฉ๋๋ค. ์ฝ๋๊ฐ ์ถ์ํ๋๋ฉด ์์กด์ฑ์ด ๋ง์์ง๊ณ ์ฝ๊ธฐ ์ด๋ ต๊ณ ๊ธฐ์ฌํ๊ธฐ ์ด๋ ค์์ง๋๋ค. ๊ธฐ์ฌ์๋ค์ ์ค์ํ ๊ธฐ๋ฅ์ ๋ง๊ฐ๋จ๋ฆด๊น ๋๋ ค์ํ์ฌ ๋งค์ฐ ์ถ์ํ๋ ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ์ฌํ์ง ์๊ฒ ๋ฉ๋๋ค. ๋ผ์ด๋ธ๋ฌ๋ฆฌ์ ๊ธฐ์ฌํ๋ ๊ฒ์ด ๋ค๋ฅธ ๊ธฐ๋ณธ ์ฝ๋๋ฅผ ๋ง๊ฐ๋จ๋ฆด ์ ์๋ค๋ฉด, ์ ์ฌ์ ์ธ ์๋ก์ด ๊ธฐ์ฌ์์๊ฒ ๋์ฑ ํ์๋ฐ์ ์ ์์ ๋ฟ๋ง ์๋๋ผ ์ฌ๋ฌ ๋ถ๋ถ์ ๋ํด ๋ณ๋ ฌ์ ์ผ๋ก ๊ฒํ ํ๊ณ ๊ธฐ์ฌํ๊ธฐ๊ฐ ๋ ์ฌ์์ง๋๋ค.
Hugging Face์์๋ ์ด ์ค๊ณ๋ฅผ **๋จ์ผ ํ์ผ ์ ์ฑ
**์ด๋ผ๊ณ ๋ถ๋ฅด๋ฉฐ, ํน์ ํด๋์ค์ ๋๋ถ๋ถ์ ์ฝ๋๊ฐ ๋จ์ผํ๊ณ ๋
๋ฆฝ์ ์ธ ํ์ผ์ ์์ฑ๋์ด์ผ ํ๋ค๋ ์๋ฏธ์
๋๋ค. ์ฒ ํ์ ๋ํด ์์ธํ ์์๋ณด๋ ค๋ฉด [์ด ๋ธ๋ก๊ทธ ๊ธ](https://huggingface.co/blog/transformers-design-philosophy)์ ์ฐธ์กฐํ ์ ์์ต๋๋ค.
Diffusers์์๋ ์ด๋ฌํ ์ฒ ํ์ ํ์ดํ๋ผ์ธ๊ณผ ์ค์ผ์ค๋ฌ์ ๋ชจ๋ ๋ฐ๋ฅด์ง๋ง, diffusion ๋ชจ๋ธ์ ๋ํด์๋ ์ผ๋ถ๋ง ๋ฐ๋ฆ
๋๋ค. ์ผ๋ถ๋ง ๋ฐ๋ฅด๋ ์ด์ ๋ Diffusion ํ์ดํ๋ผ์ธ์ธ [DDPM](https://huggingface.co/docs/diffusers/api/pipelines/ddpm), [Stable Diffusion](https://huggingface.co/docs/diffusers/api/pipelines/stable_diffusion/overview#stable-diffusion-pipelines), [unCLIP (DALLยทE 2)](https://huggingface.co/docs/diffusers/api/pipelines/unclip) ๋ฐ [Imagen](https://imagen.research.google/) ๋ฑ ๋๋ถ๋ถ์ diffusion ํ์ดํ๋ผ์ธ์ ๋์ผํ diffusion ๋ชจ๋ธ์ธ [UNet](https://huggingface.co/docs/diffusers/api/models/unet2d-cond)์ ์์กดํ๊ธฐ ๋๋ฌธ์
๋๋ค.
์ข์์, ์ด์ ๐งจ Diffusers๊ฐ ์ค๊ณ๋ ๋ฐฉ์์ ๋๋ต์ ์ผ๋ก ์ดํดํ์ ๊ฒ์
๋๋ค ๐ค.
์ฐ๋ฆฌ๋ ์ด๋ฌํ ์ค๊ณ ์์น์ ์ผ๊ด๋๊ฒ ๋ผ์ด๋ธ๋ฌ๋ฆฌ ์ ์ฒด์ ์ ์ฉํ๋ ค๊ณ ๋
ธ๋ ฅํ๊ณ ์์ต๋๋ค. ๊ทธ๋ผ์๋ ๋ถ๊ตฌํ๊ณ ์ฒ ํ์ ๋ํ ์ผ๋ถ ์์ธ ์ฌํญ์ด๋ ๋ถํํ ์ค๊ณ ์ ํ์ด ์์ ์ ์์ต๋๋ค. ๋์์ธ์ ๋ํ ํผ๋๋ฐฑ์ด ์๋ค๋ฉด [GitHub์์ ์ง์ ](https://github.com/huggingface/diffusers/issues/new?assignees=&labels=&template=feedback.md&title=) ์๋ ค์ฃผ์๋ฉด ๊ฐ์ฌํ๊ฒ ์ต๋๋ค.
## ๋์์ธ ์ฒ ํ ์์ธํ ์์๋ณด๊ธฐ
์ด์ ๋์์ธ ์ฒ ํ์ ์ธ๋ถ ์ฌํญ์ ์ข ๋ ์์ธํ ์ดํด๋ณด๊ฒ ์ต๋๋ค. Diffusers๋ ์ฃผ๋ก ์ธ ๊ฐ์ง ์ฃผ์ ํด๋์ค๋ก ๊ตฌ์ฑ๋ฉ๋๋ค: [ํ์ดํ๋ผ์ธ](https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines), [๋ชจ๋ธ](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models), ๊ทธ๋ฆฌ๊ณ [์ค์ผ์ค๋ฌ](https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers). ๊ฐ ํด๋์ค์ ๋ํ ๋ ์์ธํ ์ค๊ณ ๊ฒฐ์ ์ฌํญ์ ์ดํด๋ณด๊ฒ ์ต๋๋ค.
### ํ์ดํ๋ผ์ธ
ํ์ดํ๋ผ์ธ์ ์ฌ์ฉํ๊ธฐ ์ฝ๋๋ก ์ค๊ณ๋์์ผ๋ฉฐ (๋ฐ๋ผ์ [*์ฌ์๋ณด๋ค๋ ๊ฐ๋จํจ์*](#์ฌ์๋ณด๋ค๋-๊ฐ๋จํจ์)์ 100% ๋ฐ๋ฅด์ง๋ ์์), feature-completeํ์ง ์์ผ๋ฉฐ, ์ถ๋ก ์ ์ํ [๋ชจ๋ธ](#๋ชจ๋ธ)๊ณผ [์ค์ผ์ค๋ฌ](#์ค์ผ์ค๋ฌ)๋ฅผ ์ฌ์ฉํ๋ ๋ฐฉ๋ฒ์ ์์๋ก ๊ฐ์ฃผ๋ ์ ์์ต๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ค๊ณ ์์น์ ๋ฐ๋ฆ
๋๋ค:
- ํ์ดํ๋ผ์ธ์ ๋จ์ผ ํ์ผ ์ ์ฑ
์ ๋ฐ๋ฆ
๋๋ค. ๋ชจ๋ ํ์ดํ๋ผ์ธ์ src/diffusers/pipelines์ ๊ฐ๋ณ ๋๋ ํ ๋ฆฌ์ ์์ต๋๋ค. ํ๋์ ํ์ดํ๋ผ์ธ ํด๋๋ ํ๋์ diffusion ๋
ผ๋ฌธ/ํ๋ก์ ํธ/๋ฆด๋ฆฌ์ค์ ํด๋นํฉ๋๋ค. ์ฌ๋ฌ ํ์ดํ๋ผ์ธ ํ์ผ์ ํ๋์ ํ์ดํ๋ผ์ธ ํด๋์ ๋ชจ์ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด [`src/diffusers/pipelines/stable-diffusion`](https://github.com/huggingface/diffusers/tree/main/src/diffusers/pipelines/stable_diffusion)์์ ๊ทธ๋ ๊ฒ ํ๊ณ ์์ต๋๋ค. ํ์ดํ๋ผ์ธ์ด ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ณต์ ํ๋ ๊ฒฝ์ฐ, [#Copied from mechanism](https://github.com/huggingface/diffusers/blob/125d783076e5bd9785beb05367a2d2566843a271/src/diffusers/pipelines/stable_diffusion/pipeline_stable_diffusion_img2img.py#L251)์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ํ์ดํ๋ผ์ธ์ ๋ชจ๋ [`DiffusionPipeline`]์ ์์ํฉ๋๋ค.
- ๊ฐ ํ์ดํ๋ผ์ธ์ ์๋ก ๋ค๋ฅธ ๋ชจ๋ธ ๋ฐ ์ค์ผ์ค๋ฌ ๊ตฌ์ฑ ์์๋ก ๊ตฌ์ฑ๋์ด ์์ผ๋ฉฐ, ์ด๋ [`model_index.json` ํ์ผ](https://huggingface.co/runwayml/stable-diffusion-v1-5/blob/main/model_index.json)์ ๋ฌธ์ํ๋์ด ์์ผ๋ฉฐ, ํ์ดํ๋ผ์ธ์ ์์ฑ ์ด๋ฆ๊ณผ ๋์ผํ ์ด๋ฆ์ผ๋ก ์ก์ธ์คํ ์ ์์ผ๋ฉฐ, [`DiffusionPipeline.components`](https://huggingface.co/docs/diffusers/main/en/api/diffusion_pipeline#diffusers.DiffusionPipeline.components) ํจ์๋ฅผ ํตํด ํ์ดํ๋ผ์ธ ๊ฐ์ ๊ณต์ ํ ์ ์์ต๋๋ค.
- ๊ฐ ํ์ดํ๋ผ์ธ์ [`DiffusionPipeline.from_pretrained`](https://huggingface.co/docs/diffusers/main/en/api/diffusion_pipeline#diffusers.DiffusionPipeline.from_pretrained) ํจ์๋ฅผ ํตํด ๋ก๋ํ ์ ์์ด์ผ ํฉ๋๋ค.
- ํ์ดํ๋ผ์ธ์ ์ถ๋ก ์**๋ง** ์ฌ์ฉ๋์ด์ผ ํฉ๋๋ค.
- ํ์ดํ๋ผ์ธ์ ๋งค์ฐ ๊ฐ๋
์ฑ์ด ์ข๊ณ , ์ดํดํ๊ธฐ ์ฝ๊ณ , ์ฝ๊ฒ ์กฐ์ ํ ์ ์๋๋ก ์ค๊ณ๋์ด์ผ ํฉ๋๋ค.
- ํ์ดํ๋ผ์ธ์ ์๋ก ์ํธ์์ฉํ๊ณ , ์์ ์์ค API์ ์ฝ๊ฒ ํตํฉํ ์ ์๋๋ก ์ค๊ณ๋์ด์ผ ํฉ๋๋ค.
- ํ์ดํ๋ผ์ธ์ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๊ฐ feature-completeํ์ง ์๊ฒ ํ๋ ๊ฒ์ ๋ชฉํ๋ก ํฉ๋๋ค. future-completeํ ์ฌ์ฉ์ ์ธํฐํ์ด์ค๋ฅผ ์ํ๋ค๋ฉด [InvokeAI](https://github.com/invoke-ai/InvokeAI), [Diffuzers](https://github.com/abhishekkrthakur/diffuzers), [lama-cleaner](https://github.com/Sanster/lama-cleaner)๋ฅผ ์ฐธ์กฐํด์ผ ํฉ๋๋ค.
- ๋ชจ๋ ํ์ดํ๋ผ์ธ์ ์ค๋ก์ง `__call__` ๋ฉ์๋๋ฅผ ํตํด ์คํํ ์ ์์ด์ผ ํฉ๋๋ค. `__call__` ์ธ์์ ์ด๋ฆ์ ๋ชจ๋ ํ์ดํ๋ผ์ธ์์ ๊ณต์ ๋์ด์ผ ํฉ๋๋ค.
- ํ์ดํ๋ผ์ธ์ ํด๊ฒฐํ๊ณ ์ ํ๋ ์์
์ ์ด๋ฆ์ผ๋ก ์ง์ ๋์ด์ผ ํฉ๋๋ค.
- ๋๋ถ๋ถ์ ๊ฒฝ์ฐ์ ์๋ก์ด diffusion ํ์ดํ๋ผ์ธ์ ์๋ก์ด ํ์ดํ๋ผ์ธ ํด๋/ํ์ผ์ ๊ตฌํ๋์ด์ผ ํฉ๋๋ค.
### ๋ชจ๋ธ
๋ชจ๋ธ์ [PyTorch์ Module ํด๋์ค](https://pytorch.org/docs/stable/generated/torch.nn.Module.html)์ ์์ฐ์ค๋ฌ์ด ํ์ฅ์ด ๋๋๋ก, ๊ตฌ์ฑ ๊ฐ๋ฅํ ํด๋ฐ์ค๋ก ์ค๊ณ๋์์ต๋๋ค. ๊ทธ๋ฆฌ๊ณ ๋ชจ๋ธ์ **๋จ์ผ ํ์ผ ์ ์ฑ
**์ ์ผ๋ถ๋ง ๋ฐ๋ฆ
๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ค๊ณ ์์น์ ๋ฐ๋ฆ
๋๋ค:
- ๋ชจ๋ธ์ **๋ชจ๋ธ ์ํคํ
์ฒ ์ ํ**์ ํด๋นํฉ๋๋ค. ์๋ฅผ ๋ค์ด [`UNet2DConditionModel`] ํด๋์ค๋ 2D ์ด๋ฏธ์ง ์
๋ ฅ์ ๊ธฐ๋ํ๊ณ ์ผ๋ถ context์ ์์กดํ๋ ๋ชจ๋ UNet ๋ณํ๋ค์ ์ฌ์ฉ๋ฉ๋๋ค.
- ๋ชจ๋ ๋ชจ๋ธ์ [`src/diffusers/models`](https://github.com/huggingface/diffusers/tree/main/src/diffusers/models)์์ ์ฐพ์ ์ ์์ผ๋ฉฐ, ๊ฐ ๋ชจ๋ธ ์ํคํ
์ฒ๋ ํด๋น ํ์ผ์ ์ ์๋์ด์ผ ํฉ๋๋ค. ์๋ฅผ ๋ค์ด [`unet_2d_condition.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/unet_2d_condition.py), [`transformer_2d.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/transformer_2d.py) ๋ฑ์ด ์์ต๋๋ค.
- ๋ชจ๋ธ์ **๋จ์ผ ํ์ผ ์ ์ฑ
**์ ๋ฐ๋ฅด์ง ์์ผ๋ฉฐ, [`attention.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention.py), [`resnet.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/resnet.py), [`embeddings.py`](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/embeddings.py) ๋ฑ๊ณผ ๊ฐ์ ์์ ๋ชจ๋ธ ๊ตฌ์ฑ ์์๋ฅผ ์ฌ์ฉํด์ผ ํฉ๋๋ค. **์ฐธ๊ณ **: ์ด๋ Transformers์ ๋ชจ๋ธ๋ง ํ์ผ๊ณผ๋ ๋์กฐ์ ์ผ๋ก ๋ชจ๋ธ์ด ์ค์ ๋ก ๋จ์ผ ํ์ผ ์ ์ฑ
์ ๋ฐ๋ฅด์ง ์์์ ๋ณด์ฌ์ค๋๋ค.
- ๋ชจ๋ธ์ PyTorch์ `Module` ํด๋์ค์ ๋ง์ฐฌ๊ฐ์ง๋ก ๋ณต์ก์ฑ์ ๋
ธ์ถํ๊ณ ๋ช
ํํ ์ค๋ฅ ๋ฉ์์ง๋ฅผ ์ ๊ณตํด์ผ ํฉ๋๋ค.
- ๋ชจ๋ ๋ชจ๋ธ์ `ModelMixin`๊ณผ `ConfigMixin`์ ์์ํฉ๋๋ค.
- ๋ชจ๋ธ์ ์ฃผ์ ์ฝ๋ ๋ณ๊ฒฝ์ด ํ์ํ์ง ์๊ณ , ์ญํธํ์ฑ์ ์ ์งํ๋ฉฐ, ๋ฉ๋ชจ๋ฆฌ ๋๋ ์ปดํจํ
๊ณผ ๊ด๋ จํ ์ค์ํ ์ด๋์ ์ ๊ณตํ ๋ ์ฑ๋ฅ์ ์ํด ์ต์ ํํ ์ ์์ต๋๋ค.
- ๋ชจ๋ธ์ ๊ธฐ๋ณธ์ ์ผ๋ก ๊ฐ์ฅ ๋์ ์ ๋ฐ๋์ ๊ฐ์ฅ ๋ฎ์ ์ฑ๋ฅ ์ค์ ์ ๊ฐ์ ธ์ผ ํฉ๋๋ค.
- Diffusers์ ์ด๋ฏธ ์๋ ๋ชจ๋ธ ์ํคํ
์ฒ๋ก ๋ถ๋ฅํ ์ ์๋ ์๋ก์ด ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ๋ฅผ ํตํฉํ ๋๋ ๊ธฐ์กด ๋ชจ๋ธ ์ํคํ
์ฒ๋ฅผ ์๋ก์ด ์ฒดํฌํฌ์ธํธ์ ํธํ๋๋๋ก ์์ ํด์ผ ํฉ๋๋ค. ์๋ก์ด ํ์ผ์ ๋ง๋ค์ด์ผ ํ๋ ๊ฒฝ์ฐ๋ ๋ชจ๋ธ ์ํคํ
์ฒ๊ฐ ๊ทผ๋ณธ์ ์ผ๋ก ๋ค๋ฅธ ๊ฒฝ์ฐ์๋ง ํด๋นํฉ๋๋ค.
- ๋ชจ๋ธ์ ๋ฏธ๋์ ๋ณ๊ฒฝ ์ฌํญ์ ์ฝ๊ฒ ํ์ฅํ ์ ์๋๋ก ์ค๊ณ๋์ด์ผ ํฉ๋๋ค. ์ด๋ ๊ณต๊ฐ ํจ์ ์ธ์๋ค๊ณผ ๊ตฌ์ฑ ์ธ์๋ค์ ์ ํํ๊ณ ,๋ฏธ๋์ ๋ณ๊ฒฝ ์ฌํญ์ "์์"ํ๋ ๊ฒ์ ํตํด ๋ฌ์ฑํ ์ ์์ต๋๋ค. ์๋ฅผ ๋ค์ด, ๋ถ๋ฆฌ์ธ `is_..._type` ์ธ์๋ณด๋ค๋ ์๋ก์ด ๋ฏธ๋ ์ ํ์ ์ฝ๊ฒ ํ์ฅํ ์ ์๋ ๋ฌธ์์ด "...type" ์ธ์๋ฅผ ์ถ๊ฐํ๋ ๊ฒ์ด ์ผ๋ฐ์ ์ผ๋ก ๋ ์ข์ต๋๋ค. ์๋ก์ด ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ๊ฐ ์๋ํ๋๋ก ํ๊ธฐ ์ํด ๊ธฐ์กด ์ํคํ
์ฒ์ ์ต์ํ์ ๋ณ๊ฒฝ๋ง์ ๊ฐํด์ผ ํฉ๋๋ค.
- ๋ชจ๋ธ ๋์์ธ์ ์ฝ๋์ ๊ฐ๋
์ฑ๊ณผ ๊ฐ๊ฒฐ์ฑ์ ์ ์งํ๋ ๊ฒ๊ณผ ๋ง์ ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ๋ฅผ ์ง์ํ๋ ๊ฒ ์ฌ์ด์ ์ด๋ ค์ด ๊ท ํ ์กฐ์ ์
๋๋ค. ๋ชจ๋ธ๋ง ์ฝ๋์ ๋๋ถ๋ถ์ ์๋ก์ด ๋ชจ๋ธ ์ฒดํฌํฌ์ธํธ๋ฅผ ์ํด ํด๋์ค๋ฅผ ์์ ํ๋ ๊ฒ์ด ์ข์ง๋ง, [UNet ๋ธ๋ก](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/unet_2d_blocks.py) ๋ฐ [Attention ํ๋ก์ธ์](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py)์ ๊ฐ์ด ์ฝ๋๋ฅผ ์ฅ๊ธฐ์ ์ผ๋ก ๊ฐ๊ฒฐํ๊ณ ์ฝ๊ธฐ ์ฝ๊ฒ ์ ์งํ๊ธฐ ์ํด ์๋ก์ด ํด๋์ค๋ฅผ ์ถ๊ฐํ๋ ์์ธ๋ ์์ต๋๋ค.
### ์ค์ผ์ค๋ฌ
์ค์ผ์ค๋ฌ๋ ์ถ๋ก ์ ์ํ ๋
ธ์ด์ฆ ์ ๊ฑฐ ๊ณผ์ ์ ์๋ดํ๊ณ ํ๋ จ์ ์ํ ๋
ธ์ด์ฆ ์ค์ผ์ค์ ์ ์ํ๋ ์ญํ ์ ํฉ๋๋ค. ์ค์ผ์ค๋ฌ๋ ๊ฐ๋ณ ํด๋์ค๋ก ์ค๊ณ๋์ด ์์ผ๋ฉฐ, ๋ก๋ ๊ฐ๋ฅํ ๊ตฌ์ฑ ํ์ผ๊ณผ **๋จ์ผ ํ์ผ ์ ์ฑ
**์ ์๊ฒฉํ ๋ฐ๋ฆ
๋๋ค.
๋ค์๊ณผ ๊ฐ์ ์ค๊ณ ์์น์ ๋ฐ๋ฆ
๋๋ค:
- ๋ชจ๋ ์ค์ผ์ค๋ฌ๋ [`src/diffusers/schedulers`](https://github.com/huggingface/diffusers/tree/main/src/diffusers/schedulers)์์ ์ฐพ์ ์ ์์ต๋๋ค.
- ์ค์ผ์ค๋ฌ๋ ํฐ ์ ํธ๋ฆฌํฐ ํ์ผ์์ ๊ฐ์ ธ์ค์ง **์์์ผ** ํ๋ฉฐ, ์์ฒด ํฌํจ์ฑ์ ์ ์งํด์ผ ํฉ๋๋ค.
- ํ๋์ ์ค์ผ์ค๋ฌ Python ํ์ผ์ ํ๋์ ์ค์ผ์ค๋ฌ ์๊ณ ๋ฆฌ์ฆ(๋
ผ๋ฌธ์์ ์ ์๋ ๊ฒ๊ณผ ๊ฐ์)์ ํด๋นํฉ๋๋ค.
- ์ค์ผ์ค๋ฌ๊ฐ ์ ์ฌํ ๊ธฐ๋ฅ์ ๊ณต์ ํ๋ ๊ฒฝ์ฐ, `#Copied from` ๋ฉ์ปค๋์ฆ์ ์ฌ์ฉํ ์ ์์ต๋๋ค.
- ๋ชจ๋ ์ค์ผ์ค๋ฌ๋ `SchedulerMixin`๊ณผ `ConfigMixin`์ ์์ํฉ๋๋ค.
- [`ConfigMixin.from_config`](https://huggingface.co/docs/diffusers/main/en/api/configuration#diffusers.ConfigMixin.from_config) ๋ฉ์๋๋ฅผ ์ฌ์ฉํ์ฌ ์ค์ผ์ค๋ฌ๋ฅผ ์ฝ๊ฒ ๊ต์ฒดํ ์ ์์ต๋๋ค. ์์ธํ ๋ด์ฉ์ [์ฌ๊ธฐ](../using-diffusers/schedulers.md)์์ ์ค๋ช
ํฉ๋๋ค.
- ๋ชจ๋ ์ค์ผ์ค๋ฌ๋ `set_num_inference_steps`์ `step` ํจ์๋ฅผ ๊ฐ์ ธ์ผ ํฉ๋๋ค. `set_num_inference_steps(...)`๋ ๊ฐ ๋
ธ์ด์ฆ ์ ๊ฑฐ ๊ณผ์ (์ฆ, `step(...)`์ด ํธ์ถ๋๊ธฐ ์ ) ์ด์ ์ ํธ์ถ๋์ด์ผ ํฉ๋๋ค.
- ๊ฐ ์ค์ผ์ค๋ฌ๋ ๋ชจ๋ธ์ด ํธ์ถ๋ ํ์์คํ
์ ๋ฐฐ์ด์ธ `timesteps` ์์ฑ์ ํตํด ๋ฃจํ๋ฅผ ๋ ์ ์๋ ํ์์คํ
์ ๋
ธ์ถํฉ๋๋ค.
- `step(...)` ํจ์๋ ์์ธก๋ ๋ชจ๋ธ ์ถ๋ ฅ๊ณผ "ํ์ฌ" ์ํ(x_t)์ ์
๋ ฅ์ผ๋ก ๋ฐ๊ณ , "์ด์ " ์ฝ๊ฐ ๋ ๋
ธ์ด์ฆ๊ฐ ์ ๊ฑฐ๋ ์ํ(x_t-1)์ ๋ฐํํฉ๋๋ค.
- ๋
ธ์ด์ฆ ์ ๊ฑฐ ์ค์ผ์ค๋ฌ์ ๋ณต์ก์ฑ์ ๊ณ ๋ คํ์ฌ, `step` ํจ์๋ ๋ชจ๋ ๋ณต์ก์ฑ์ ๋
ธ์ถํ์ง ์์ผ๋ฉฐ, "๋ธ๋ ๋ฐ์ค"์ผ ์ ์์ต๋๋ค.
- ๊ฑฐ์ ๋ชจ๋ ๊ฒฝ์ฐ์ ์๋ก์ด ์ค์ผ์ค๋ฌ๋ ์๋ก์ด ์ค์ผ์ค๋ง ํ์ผ์ ๊ตฌํ๋์ด์ผ ํฉ๋๋ค.
|