BleachNick's picture
upload required packages
87d40d2
<!--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.
-->
# Apple Silicon (M1/M2)μ—μ„œ Stable Diffusion을 μ‚¬μš©ν•˜λŠ” 방법
DiffusersλŠ” Stable Diffusion 좔둠을 μœ„ν•΄ PyTorch `mps`λ₯Ό μ‚¬μš©ν•΄ Apple μ‹€λ¦¬μ½˜κ³Ό ν˜Έν™˜λ©λ‹ˆλ‹€. λ‹€μŒμ€ Stable Diffusion이 μžˆλŠ” M1 λ˜λŠ” M2 컴퓨터λ₯Ό μ‚¬μš©ν•˜κΈ° μœ„ν•΄ 따라야 ν•˜λŠ” λ‹¨κ³„μž…λ‹ˆλ‹€.
## μš”κ΅¬ 사항
- Apple silicon (M1/M2) ν•˜λ“œμ›¨μ–΄μ˜ Mac 컴퓨터.
- macOS 12.6 λ˜λŠ” 이후 (13.0 λ˜λŠ” 이후 μΆ”μ²œ).
- Python arm64 버전
- PyTorch 2.0(μΆ”μ²œ) λ˜λŠ” 1.13(`mps`λ₯Ό μ§€μ›ν•˜λŠ” μ΅œμ†Œ 버전). Yhttps://pytorch.org/get-started/locally/의 지침에 따라 `pip` λ˜λŠ” `conda`둜 μ„€μΉ˜ν•  수 μžˆμŠ΅λ‹ˆλ‹€.
## μΆ”λ‘  νŒŒμ΄ν”„λΌμΈ
μ•„λž˜ μ½”λ„λŠ” μ΅μˆ™ν•œ `to()` μΈν„°νŽ˜μ΄μŠ€λ₯Ό μ‚¬μš©ν•˜μ—¬ `mps` λ°±μ—”λ“œλ‘œ Stable Diffusion νŒŒμ΄ν”„λΌμΈμ„ M1 λ˜λŠ” M2 μž₯치둜 μ΄λ™ν•˜λŠ” 방법을 λ³΄μ—¬μ€λ‹ˆλ‹€.
<Tip warning={true}>
**PyTorch 1.13을 μ‚¬μš© 쀑일 λ•Œ ** μΆ”κ°€ μΌνšŒμ„± 전달을 μ‚¬μš©ν•˜μ—¬ νŒŒμ΄ν”„λΌμΈμ„ "프라이밍"ν•˜λŠ” 것을 μΆ”μ²œν•©λ‹ˆλ‹€. 이것은 λ°œκ²¬ν•œ μ΄μƒν•œ λ¬Έμ œμ— λŒ€ν•œ μž„μ‹œ ν•΄κ²° λ°©λ²•μž…λ‹ˆλ‹€. 첫 번째 μΆ”λ‘  전달은 후속 전달와 μ•½κ°„ λ‹€λ₯Έ κ²°κ³Όλ₯Ό μƒμ„±ν•©λ‹ˆλ‹€. 이 전달은 ν•œ 번만 μˆ˜ν–‰ν•˜λ©΄ 되며 μΆ”λ‘  단계λ₯Ό ν•œ 번만 μ‚¬μš©ν•˜κ³  κ²°κ³Όλ₯Ό 폐기해도 λ©λ‹ˆλ‹€.
</Tip>
이전 νŒμ—μ„œ μ„€λͺ…ν•œ 것듀을 ν¬ν•¨ν•œ μ—¬λŸ¬ 문제λ₯Ό ν•΄κ²°ν•˜λ―€λ‘œ PyTorch 2 이상을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.
```python
# `huggingface-cli login`에 λ‘œκ·ΈμΈλ˜μ–΄ μžˆμŒμ„ 확인
from diffusers import DiffusionPipeline
pipe = DiffusionPipeline.from_pretrained("runwayml/stable-diffusion-v1-5")
pipe = pipe.to("mps")
# 컴퓨터가 64GB μ΄ν•˜μ˜ RAM 램일 λ•Œ μΆ”μ²œ
pipe.enable_attention_slicing()
prompt = "a photo of an astronaut riding a horse on mars"
# 처음 "μ›Œλ°μ—…" 전달 (μœ„ μ„€λͺ…을 λ³΄μ„Έμš”)
_ = pipe(prompt, num_inference_steps=1)
# κ²°κ³ΌλŠ” μ›Œλ°μ—… 전달 ν›„μ˜ CPU μž₯치의 결과와 μΌμΉ˜ν•©λ‹ˆλ‹€.
image = pipe(prompt).images[0]
```
## μ„±λŠ₯ μΆ”μ²œ
M1/M2 μ„±λŠ₯은 λ©”λͺ¨λ¦¬ μ••λ ₯에 맀우 λ―Όκ°ν•©λ‹ˆλ‹€. μ‹œμŠ€ν…œμ€ ν•„μš”ν•œ 경우 μžλ™μœΌλ‘œ μŠ€μ™‘λ˜μ§€λ§Œ μŠ€μ™‘ν•  λ•Œ μ„±λŠ₯이 크게 μ €ν•˜λ©λ‹ˆλ‹€.
특히 μ»΄ν“¨ν„°μ˜ μ‹œμŠ€ν…œ RAM이 64GB λ―Έλ§Œμ΄κ±°λ‚˜ 512 Γ— 512픽셀보닀 큰 λΉ„ν‘œμ€€ ν•΄μƒλ„μ—μ„œ 이미지λ₯Ό μƒμ„±ν•˜λŠ” 경우, μΆ”λ‘  쀑에 λ©”λͺ¨λ¦¬ μ••λ ₯을 쀄이고 μŠ€μ™€ν•‘μ„ λ°©μ§€ν•˜κΈ° μœ„ν•΄ *μ–΄ν…μ…˜ μŠ¬λΌμ΄μ‹±*을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€. μ–΄ν…μ…˜ μŠ¬λΌμ΄μ‹±μ€ λΉ„μš©μ΄ 많이 λ“œλŠ” μ–΄ν…μ…˜ μž‘μ—…μ„ ν•œ λ²ˆμ— λͺ¨λ‘ μˆ˜ν–‰ν•˜λŠ” λŒ€μ‹  μ—¬λŸ¬ λ‹¨κ³„λ‘œ μˆ˜ν–‰ν•©λ‹ˆλ‹€. 일반적으둜 λ²”μš© λ©”λͺ¨λ¦¬κ°€ μ—†λŠ” μ»΄ν“¨ν„°μ—μ„œ ~20%의 μ„±λŠ₯ 영ν–₯을 λ―ΈμΉ˜μ§€λ§Œ 64GB 이상이 μ•„λ‹Œ 경우 λŒ€λΆ€λΆ„μ˜ Apple Silicon μ»΄ν“¨ν„°μ—μ„œ *더 λ‚˜μ€ μ„±λŠ₯*이 κ΄€μ°°λ˜μ—ˆμŠ΅λ‹ˆλ‹€.
```python
pipeline.enable_attention_slicing()
```
## Known Issues
- μ—¬λŸ¬ ν”„λ‘¬ν”„νŠΈλ₯Ό 배치둜 μƒμ„±ν•˜λŠ” 것은 [좩돌이 λ°œμƒν•˜κ±°λ‚˜ μ•ˆμ •μ μœΌλ‘œ μž‘λ™ν•˜μ§€ μ•ŠμŠ΅λ‹ˆλ‹€](https://github.com/huggingface/diffusers/issues/363). μš°λ¦¬λŠ” 이것이 [PyTorch의 `mps` λ°±μ—”λ“œ](https://github.com/pytorch/pytorch/issues/84039)와 관련이 μžˆλ‹€κ³  μƒκ°ν•©λ‹ˆλ‹€. 이 λ¬Έμ œλŠ” ν•΄κ²°λ˜κ³  μžˆμ§€λ§Œ μ§€κΈˆμ€ 배치 λŒ€μ‹  반볡 방법을 μ‚¬μš©ν•˜λŠ” 것이 μ’‹μŠ΅λ‹ˆλ‹€.