Buckets:

mishig's picture
|
download
raw
4.15 kB

Metal Performans Gölgelleyicileri (MPS)

Pull Request açarak bu rozeti eksik olan pipeline'lara eklemekten çekinmeyin. rozetli pipeline'lar, Apple silikonlu cihazlarda MPS arka ucundan yararlanarak daha hızlı çıkarım yapabildiğini gösterir.

🤗 Diffusers, MacOS cihazlarındaki GPU'yu kullanmak için Metal çerçevesini kullanan PyTorch mps cihazı ile Apple silikon (M1/M2 çipleri) ile uyumludur. Aşağıdaki gereksinimleri karşılamış olmanız gerekir:

  • Apple silikon (M1/M2) donanımlı bir macOS bilgisayar
  • macOS 12.6 veya üzeri (13.0 veya üzeri önerilir)
  • arm64 sürümü Python
  • PyTorch 2.0 (önerilen) veya 1.13 (mps için desteklenen en düşük sürüm)

mps arka ucu, Stable Diffusion hattını M1 veya M2 cihazınıza taşımak için PyTorch'un .to() arayüzünü kullanır:

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 arka ucu, 2**32'den büyük NDArray boyutlarını desteklemez. Bu sorunla karşılaşırsanız, inceleyebilmemiz için bir Issue açmanızı rica ederiz.

PyTorch 1.13 kullanıyorsanız, hattı (pipeline) bir kez daha ek geçişle "hazırlamanız" (prime) gerekir. Bu, ilk çıkarım (inference) geçişinin sonraki geçişlerden biraz farklı sonuçlar üretmesi sorununa geçici bir çözümdür. Bu geçişi yalnızca bir kez yapmanız yeterlidir ve tek bir çıkarım adımından sonra sonucu atabilirsiniz.

  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]

Sorun Giderme

Bu bölüm, mps arka ucunu kullanırken karşılaşılan bazı yaygın sorunları ve bunların nasıl çözüleceğini listeler.

Attention dilimleme

M1/M2 performansı bellek baskısına karşı çok hassastır. Bu durum oluştuğunda sistem, ihtiyaç duyduğunda otomatik olarak takas (swap) yapar ve bu da performansı önemli ölçüde düşürür.

Bunun önüne geçmek için, çıkarım sırasında bellek baskısını azaltmak ve takaslamayı (swapping) önlemek amacıyla dikkat dilimleme (attention slicing) kullanmanızı öneririz. Bilgisayarınızın 64 GB'tan az sistem belleği olması veya 512×512 pikselden büyük, standart olmayan çözünürlüklerde görsel üretmeniz durumunda bu özellikle önemlidir. Hattınızda (pipeline) enable_attention_slicing() fonksiyonunu çağırın:

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, maliyetli attention işlemini tek seferde yerine birden fazla adımda gerçekleştirir. Evrensel belleğe sahip olmayan bilgisayarlarda genellikle performansı ~%20 oranında iyileştirir; ancak 64 GB veya daha fazla RAM'a sahip olmadıkça, çoğu Apple silikonlu bilgisayarda daha iyi performans gözlemledik.

Toplu çıkarım

Bir partide birden çok istek üretmek çökmeye veya güvenilir şekilde çalışmamasına neden olabilir. Bu durumda, partileme yerine yineleme yapmayı deneyin.

Xet Storage Details

Size:
4.15 kB
·
Xet hash:
46465984b25aff742107c04b5ffa981a236c5ff4ccbd7b02a3ed9f8378d32025

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