Diffusers documentation
الأداء الأساسي
الأداء الأساسي
عملية الانتشار هي عملية عشوائية تتطلب جهدًا حاسوبيًا كبيرًا. قد تحتاج إلى تشغيل DiffusionPipeline عدة مرات قبل الحصول على المخرجات المطلوبة. ولهذا السبب، من المهم الموازنة بعناية بين سرعة التوليد واستخدام الذاكرة من أجل التسريع في عملية التكرار،
توصي هذه الدليل ببعض النصائح الأساسية للأداء عند استخدام DiffusionPipeline. راجع وثائق قسم تحسين الاستدلال مثل Accelerate inference أو Reduce memory usage للحصول على أدلة أداء أكثر تفصيلاً.
استهلاك الذاكرة
إن تقليل كمية الذاكرة المستخدمة يسرّع بشكل غير مباشر عملية التوليد ويمكن أن يساعد في ملاءمة النموذج على الجهاز.
تنقل طريقة enable_model_cpu_offload() النموذج إلى وحدة المعالجة المركزية (CPU) عندما لا يكون قيد الاستخدام، وذلك لتوفير ذاكرة وحدة معالجة الرسوميات (GPU).
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.bfloat16,
device_map="cuda" # or "mps", "xpu", "cpu"
)
pipeline.enable_model_cpu_offload()
prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
pipeline(prompt).images[0]
print(f"Max memory reserved: {torch.cuda.max_memory_allocated() / 1024**3:.2f} GB")سرعة الاستدلال
تُعد عملية إزالة الضوضاء هي الأكثر استهلاكًا للموارد الحسابية أثناء الانتشار. تُسرّع الأساليب التي تُحسّن هذه العملية سرعة الاستدلال. جرّب الأساليب التالية لتحقيق تسريع.
- أضف
device_map="cuda"لوضع خط الأنابيب على وحدة معالجة رسومية. يؤدي وضع النموذج على مُسرِّع، مثل وحدة معالجة رسومية، إلى زيادة السرعة لأنه يُنفّذ العمليات الحسابية بالتوازي. - اضبط
dtype=torch.bfloat16لتنفيذ خط الأنابيب بدقة نصفية. يقلل خفض دقة نوع البيانات من الوقت اللازم لإجراء العمليات الحسابية، مما يزيد من السرعة.
import torch
import time
from diffusers import DiffusionPipeline, DPMSolverMultistepScheduler
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
dtype=torch.bfloat16,
device_map="cuda
)- استخدم مجدولاً أسرع، مثل DPMSolverMultistepScheduler، والذي يتطلب ما يقرب من 20-25 خطوة فقط.
- اضبط
num_inference_stepsعلى قيمة أدنى. يقلل خفض عدد خطوات الاستدلال من إجمالي عدد العمليات الحسابية. ومع ذلك، قد يؤدي ذلك إلى انخفاض جودة التوليد.
pipeline.scheduler = DPMSolverMultistepScheduler.from_config(pipeline.scheduler.config)
prompt = """
cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California
highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain
"""
start_time = time.perf_counter()
image = pipeline(prompt).images[0]
end_time = time.perf_counter()
print(f"Image generation took {end_time - start_time:.3f} seconds")جودة التوليد
توفر العديد من نماذج الانتشار الحديثة صورًا عالية الجودة دون أي إعداد مسبق. ومع ذلك، يمكنك تحسين جودة التوليد من خلال تجربة ما يلي.
جرّب استخدام موجه (Prompt) أكثر تفصيلاً ووصفاً. شمل تفاصيل مثل وسط الصورة (Medium)، والموضوع، والأسلوب، والجماليات. قد يساعد أيضاً استخدام موجه سلبي (Negative Prompt) بتوجيه النموذج بعيداً عن الميزات غير المرغوبة من خلال استخدام كلمات مثل "جودة منخفضة" أو "مغبش".
import torch from diffusers import DiffusionPipeline pipeline = DiffusionPipeline.from_pretrained( "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu" ) prompt = """ cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain """ negative_prompt = "low quality, blurry, ugly, poor details" pipeline(prompt, negative_prompt=negative_prompt).images[0]لمزيد من التفاصيل حول إنشاء أوامر تلميح أفضل، راجع وثيقة تقنيات التلميح.
جرّب مجدولاً مختلفاً، مثل HeunDiscreteScheduler أو LMSDiscreteScheduler، الذي يتنازل عن سرعة التوليد من أجل الجودة.
import torch from diffusers import DiffusionPipeline, HeunDiscreteScheduler pipeline = DiffusionPipeline.from_pretrained( "stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu" ) pipeline.scheduler = HeunDiscreteScheduler.from_config(pipeline.scheduler.config) prompt = """ cinematic film still of a cat sipping a margarita in a pool in Palm Springs, California highly detailed, high budget hollywood movie, cinemascope, moody, epic, gorgeous, film grain """ negative_prompt = "low quality, blurry, ugly, poor details" pipeline(prompt, negative_prompt=negative_prompt).images[0]
الخطوات التالية
توفر مكتبة Diffusers تحسينات متقدمة وقوية مثل group-offloading وregional compilation. لمعرفة المزيد حول كيفية تعظيم الأداء، راجع قسم تحسين الاستدلال.
Update on GitHub