Diffusers documentation
معالجات الأداء المعدنية (MPS)
معالجات الأداء المعدنية (MPS)
تُشير الشارات
في خطوط الأنابيب إلى أن النموذج يمكنه الاستفادة من واجهة الخلفية MPS على أجهزة Apple silicon للحصول على استدلال أسرع. لا تتردد في فتح طلب سحب لإضافة هذه الشارة إلى خطوط الأنابيب التي تفتقر إليها.
🤗 يتوافق Diffusers مع شرائح Apple silicon (M1/M2) باستخدام جهاز PyTorch mps، والذي يستفيد من إطار عمل Metal لاستغلال وحدة معالجة الرسوميات (GPU) في أجهزة MacOS. ستحتاج إلى توافر ما يلي:
- حاسوب macOS مزوّد بمعالجات Apple silicon (M1/M2)
- macOS 12.6 أو أحدث (يُوصى بـ 13.0 أو أحدث)
- نسخة arm64 من Python
- PyTorch 2.0 (موصى به) أو 1.13 (الحد الأدنى من الإصدارات المدعومة لـ
mps)
يستخدم الخلفية mps واجهة .to() في PyTorch لنقل خط أنابيب 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لا يدعم واجهة mps في PyTorch أحجام NDArray أكبر من
2**32. يرجى فتح قضية إذا واجهت هذه المشكلة حتى نتمكن من التحقيق فيها.
إذا كنت تستخدم PyTorch 1.13، فأنت بحاجة إلى “تهيئة” خط الأنابيب عبر تمريرة إضافية لمرة واحدة. هذا حل مؤقت لمشكلة تتسبب فيها أول تمريرة استنتاج في إنتاج نتائج تختلف قليلاً عن النتائج اللاحقة. لا تحتاج إلى تنفيذ هذه التمريرة إلا مرة واحدة، وبعد خطوة استنتاج واحدة فقط يمكنك التخلي عن النتيجة.
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 وكيفية حلها.
تقطيع الانتباه
أداء M1/M2 حساس للغاية لضغط الذاكرة. عند حدوث ذلك، يقوم النظام تلقائيًا بالتبديل (swapping) إذا لزم الأمر، مما يؤدي إلى تدهور كبير في الأداء.
للمنع من حدوث ذلك، ننصح باستخدام تقطيع الانتباه لتقليل الضغط على الذاكرة أثناء الاستدلال ومنع التبديل. وهذا الأمر ذو صلة خاصة إذا كان جهازك يحتوي على أقل من 64 جيجابايت من ذاكرة الوصول العشوائي للنظام، أو إذا كنت تولّد صورًا بدقة غير قياسية أكبر من 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) للعملية المكلفة المتعلقة بالانتباه على عدة خطوات بدلاً من تنفيذها دفعة واحدة. عادةً ما يحسّن هذا الأداء بنسبة ~20% في الحواسيب التي لا تملك ذاكرة موحّدة، لكننا لاحظنا أداءً أفضل في معظم حواسيب Apple silicon ما لم تكن ذاكرة الوصول العشوائي لديك 64 جيجابايت أو أكثر.
الاستدلال الدُفعي
قد يؤدي توليد عدة موجهات دفعة واحدة إلى تعطل النظام أو عدم عملها بشكل موثوق. في هذه الحالة، جرّب التكرار بدلاً من المعالجة الدفعية.
Update on GitHub