Buckets:

mishig's picture
|
download
raw
4.15 kB

Metal Performance Shaders (MPS)

Pipelines with a badge indicate a model can take advantage of the MPS backend on Apple silicon devices for faster inference. Feel free to open a Pull Request to add this badge to pipelines that are missing it.

๐Ÿค— Diffusers๋Š” MacOS ๊ธฐ๊ธฐ์˜ GPU๋ฅผ ํ™œ์šฉํ•˜๊ธฐ ์œ„ํ•ด Metal ํ”„๋ ˆ์ž„์›Œํฌ๋ฅผ ์‚ฌ์šฉํ•˜๋Š” PyTorch mps ์žฅ์น˜๋ฅผ ํ†ตํ•ด Apple silicon(M1/M2 ์นฉ)๊ณผ ํ˜ธํ™˜๋ฉ๋‹ˆ๋‹ค. ๋‹ค์Œ์ด ํ•„์š”ํ•ฉ๋‹ˆ๋‹ค:

  • Apple silicon (M1/M2) ํ•˜๋“œ์›จ์–ด๊ฐ€ ํƒ‘์žฌ๋œ macOS ์ปดํ“จํ„ฐ
  • macOS 12.6 ์ด์ƒ (13.0 ์ด์ƒ ๊ถŒ์žฅ)
  • arm64 ๋ฒ„์ „์˜ Python
  • PyTorch 2.0 (๊ถŒ์žฅ) ๋˜๋Š” 1.13(mps์˜ ์ตœ์†Œ ์ง€์› ๋ฒ„์ „)

mps ๋ฐฑ์—”๋“œ๋Š” PyTorch์˜ .to() ์ธํ„ฐํŽ˜์ด์Šค๋ฅผ ์‚ฌ์šฉํ•˜์—ฌ Stable Diffusion ํŒŒ์ดํ”„๋ผ์ธ์„ M1 ๋˜๋Š” M2 ์žฅ์น˜๋กœ ์ด๋™ํ•ฉ๋‹ˆ๋‹ค:

from diffusers import DiffusionPipeline

pipe = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5")
pipe = pipe.to("mps")

# Recommended if your computer has < 64 GB of RAM
pipe.enable_attention_slicing()

prompt = "a photo of an astronaut riding a horse on mars"
image = pipe(prompt).images[0]
image

PyTorch mps ๋ฐฑ์—”๋“œ๋Š” 2**32๋ฅผ ์ดˆ๊ณผํ•˜๋Š” NDArray ํฌ๊ธฐ๋ฅผ ์ง€์›ํ•˜์ง€ ์•Š์Šต๋‹ˆ๋‹ค. ์ด ๋ฌธ์ œ๋ฅผ ๋งŒ๋‚˜์…จ๋‹ค๋ฉด ์กฐ์‚ฌํ•  ์ˆ˜ ์žˆ๋„๋ก Issue๋ฅผ ์—ด์–ด ์ฃผ์„ธ์š”.

PyTorch 1.13๋ฅผ ์‚ฌ์šฉํ•˜๋Š” ๊ฒฝ์šฐ, ํŒŒ์ดํ”„๋ผ์ธ์„ ํ•œ ๋ฒˆ ๋” ํ†ต๊ณผ์‹œ์ผœ "prime"ํ•ด์•ผ ํ•ฉ๋‹ˆ๋‹ค. ์ด๋Š” ์ฒซ ๋ฒˆ์งธ ์ถ”๋ก  ํŒจ์Šค๊ฐ€ ์ดํ›„ ํŒจ์Šค์™€ ์•ฝ๊ฐ„ ๋‹ค๋ฅธ ๊ฒฐ๊ณผ๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๋ฌธ์ œ๋ฅผ ํ•ด๊ฒฐํ•˜๊ธฐ ์œ„ํ•œ ์ž„์‹œ ์กฐ์น˜์ž…๋‹ˆ๋‹ค. ์ด ํŒจ์Šค๋Š” ํ•œ ๋ฒˆ๋งŒ ์ˆ˜ํ–‰ํ•˜๋ฉด ๋˜๋ฉฐ, ์ถ”๋ก  ๋‹จ๊ณ„ ํ•œ ๋ฒˆ๋งŒ ๊ฑฐ์น˜๋ฉด ๊ฒฐ๊ณผ๋ฅผ ํ๊ธฐํ•  ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค.

  from diffusers import DiffusionPipeline

  pipe = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5").to("mps")
  pipe.enable_attention_slicing()

  prompt = "a photo of an astronaut riding a horse on mars"
  # First-time "warmup" pass if PyTorch version is 1.13
+ _ = pipe(prompt, num_inference_steps=1)

  # Results match those from the CPU device after the warmup pass.
  image = pipe(prompt).images[0]

๋ฌธ์ œ ํ•ด๊ฒฐ

์ด ์„น์…˜์—์„œ๋Š” mps ๋ฐฑ์—”๋“œ๋ฅผ ์‚ฌ์šฉํ•  ๋•Œ ๋ฐœ์ƒํ•˜๋Š” ์ผ๋ฐ˜์ ์ธ ๋ฌธ์ œ์™€ ํ•ด๊ฒฐ ๋ฐฉ๋ฒ•์„ ๋‚˜์—ดํ•ฉ๋‹ˆ๋‹ค.

Attention ์Šฌ๋ผ์ด์‹ฑ

M1/M2์˜ ์„ฑ๋Šฅ์€ ๋ฉ”๋ชจ๋ฆฌ ์••๋ ฅ์— ๋งค์šฐ ๋ฏผ๊ฐํ•ฉ๋‹ˆ๋‹ค. ์ด๋Ÿฌํ•œ ์ƒํ™ฉ์ด ๋ฐœ์ƒํ•˜๋ฉด ์‹œ์Šคํ…œ์€ ํ•„์š”ํ•  ๋•Œ ์ž๋™์œผ๋กœ ์Šค์™‘์„ ์ˆ˜ํ–‰ํ•˜๋ฉฐ, ์ด๋กœ ์ธํ•ด ์„ฑ๋Šฅ์ด ํฌ๊ฒŒ ์ €ํ•˜๋ฉ๋‹ˆ๋‹ค.

์ด๋Ÿฌํ•œ ๋ฌธ์ œ๋ฅผ ๋ฐฉ์ง€ํ•˜๊ธฐ ์œ„ํ•ด ์ถ”๋ก  ์ค‘ ๋ฉ”๋ชจ๋ฆฌ ๋ถ€๋‹ด์„ ์ค„์ด๊ณ  ์Šค์™‘์„ ๋ง‰๊ธฐ ์œ„ํ•ด attention slicing์„ ์‚ฌ์šฉํ•˜๋Š” ๊ฒƒ์„ ๊ถŒ์žฅํ•ฉ๋‹ˆ๋‹ค. ์ปดํ“จํ„ฐ์˜ ์‹œ์Šคํ…œ RAM์ด 64GB ๋ฏธ๋งŒ์ด๊ฑฐ๋‚˜ 512ร—512 ํ”ฝ์…€๋ณด๋‹ค ํฐ ๋น„ํ‘œ์ค€ ํ•ด์ƒ๋„๋กœ ์ด๋ฏธ์ง€๋ฅผ ์ƒ์„ฑํ•˜๋Š” ๊ฒฝ์šฐ ํŠนํžˆ ์ค‘์š”ํ•ฉ๋‹ˆ๋‹ค. ํŒŒ์ดํ”„๋ผ์ธ์—์„œ enable_attention_slicing() ํ•จ์ˆ˜๋ฅผ ํ˜ธ์ถœํ•˜์„ธ์š”:

from diffusers import DiffusionPipeline
import torch

pipeline = DiffusionPipeline.from_pretrained("stable-diffusion-v1-5/stable-diffusion-v1-5", dtype=torch.float16, variant="fp16", use_safetensors=True).to("mps")
pipeline.enable_attention_slicing()

Attention slicing์€ ๋น„์šฉ์ด ๋†’์€ attention ์—ฐ์‚ฐ์„ ํ•œ ๋ฒˆ์— ์ˆ˜ํ–‰ํ•˜๋Š” ๋Œ€์‹  ์—ฌ๋Ÿฌ ๋‹จ๊ณ„๋กœ ๋‚˜๋ˆ„์–ด ์ˆ˜ํ–‰ํ•ฉ๋‹ˆ๋‹ค. ๋ฒ”์šฉ ๋ฉ”๋ชจ๋ฆฌ๊ฐ€ ์—†๋Š” ์ปดํ“จํ„ฐ์—์„œ๋Š” ์ผ๋ฐ˜์ ์œผ๋กœ ์„ฑ๋Šฅ์ด ์•ฝ 20% ํ–ฅ์ƒ๋˜์ง€๋งŒ, 64GB ์ด์ƒ์˜ RAM์ด ์—†๋Š” ๋Œ€๋ถ€๋ถ„์˜ Apple silicon ์ปดํ“จํ„ฐ์—์„œ๋Š” ๋” ๋‚˜์€ ์„ฑ๋Šฅ์„ ๊ด€์ฐฐํ–ˆ์Šต๋‹ˆ๋‹ค.

๋ฐฐ์น˜ ์ถ”๋ก 

Generating multiple prompts in a batch๋ฅผ ์‚ฌ์šฉํ•˜๋ฉด ์ถฉ๋Œ์ด ๋ฐœ์ƒํ•˜๊ฑฐ๋‚˜ ์•ˆ์ •์ ์œผ๋กœ ์ž‘๋™ํ•˜์ง€ ์•Š์„ ์ˆ˜ ์žˆ์Šต๋‹ˆ๋‹ค. ์ด ๊ฒฝ์šฐ, ๋ฐฐ์น˜ ์ฒ˜๋ฆฌ ๋Œ€์‹  ๋ฐ˜๋ณต(iteration)์„ ์‹œ๋„ํ•ด ๋ณด์„ธ์š”.

Xet Storage Details

Size:
4.15 kB
ยท
Xet hash:
5d9f67393ccb555ee4436ddb5744cc315023a265a5adb0a59a3d67b70efc66fa

Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.