Diffusers documentation
DiffusionPipeline
DiffusionPipeline
تتكون نماذج الانتشار من عدة مكونات مثل UNets أو محولات الانتشار (DiTs)، ومشفرات النص، ومشفرات الترميز التباينية (VAEs)، ومجدولات. يلتف DiffusionPipeline حول جميع هذه المكونات في واجهة برمجة تطبيقات واحدة سهلة الاستخدام دون التخلي عن المرونة في تعديل مكوناتها.
ستوضح لك هذه الدليل كيفية تحميل DiffusionPipeline.
تحميل خط أنابيب
DiffusionPipeline هو فئة خط أنابيب أساسية تختار تلقائيًا وتعيد نسخة من فئة فرعية لخط أنابيب النموذج، مثل QwenImagePipeline، من خلال فحص ملف model_index.json بحثًا عن اسم الفئة.
مرّر معرّف النموذج إلى from_pretrained() لتحميل خط أنابيب.
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)يتميز كل نموذج بفئة فرعية محددة من خط الأنابيب ترث من DiffusionPipeline. عادةً ما تتمتع الفئة الفرعية بتركيز ضيق وتكون مخصصة لمهمة معينة. راجع الجدول أدناه لمثال.
| فئة فرعية من pipeline | المهمة |
|---|---|
| QwenImagePipeline | النص إلى صورة |
| QwenImageImg2ImgPipeline | صورة إلى صورة |
| QwenImageInpaintPipeline | inpaint |
يمكنك استخدام الفئة الفرعية مباشرةً عن طريق تمرير معرّف النموذج إلى from_pretrained().
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)راجع وثائق تنسيق الملف الواحد لمعرفة كيفية تحميل نماذج الملف الواحد.
خطوط الأنابيب المحلية
يمكن أيضًا تشغيل خطوط الأنابيب محليًا. استخدم snapshot_download لتنزيل مستودع نموذج.
from huggingface_hub import snapshot_download
local_dir = snapshot_download(repo_id="Qwen/Qwen-Image")مرّر ذلك المسار إلى from_pretrained() لتحميله.
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
local_dir, dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)لن يقوم أسلوب from_pretrained() بتنزيل الملفات من Hub عند اكتشافه لمسار محلي. لكن هذا يعني أيضاً أنه لن يقوم بتنزيل وتحديث أي تغييرات أُدخلت على النموذج وتخزينها مؤقتاً.
أنواع بيانات خط الأنابيب
استخدم معامل dtype في from_pretrained() لتحميل نموذج بنوع بيانات محدد. يتيح لك ذلك تحميل نماذج مختلفة بدقة مختلفة. على سبيل المثال، يقلل تحميل نموذج transformer كبير بدقة نصفية من الذاكرة المطلوبة.
مرّر نوع البيانات لكل نموذج كقاموس إلى dtype. استخدم المفتاح default لضبط نوع البيانات الافتراضي. إذا لم يكن النموذج موجودًا في القاموس ولم يُقدَّم default، يتم تحميله بدقة كاملة (torch.float32).
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
"Qwen/Qwen-Image",
dtype={"transformer": torch.bfloat16, "default": torch.float16},
)
print(pipeline.transformer.dtype, pipeline.vae.dtype)لا تحتاج إلى استخدام قاموس إذا كنت تقوم بتحميل جميع النماذج في نفس نوع البيانات.
import torch
from diffusers import QwenImagePipeline
pipeline = QwenImagePipeline.from_pretrained(
"Qwen/Qwen-Image", dtype=torch.bfloat16
)
print(pipeline.transformer.dtype, pipeline.vae.dtype)توزيع الأجهزة
يضع الحجة device_map خط الأنابيب على الأجهزة. في وقت التشغيل، يقبل Diffusers القيم "balanced" و"cpu" وسلسلة المُسرِّع الخاصة بالجهاز الذي تعمل عليه (عادةً "cuda" أو "mps" أو "xpu").
| معامل | الوصف |
|---|---|
| سلسلة accelerator | يضع خط الأنابيب على ذلك الجهاز. مرّر المُسرِّع الذي يدعمه جهازك، مثل "cuda" أو "mps" أو "xpu". |
"balanced" | يوزّع مكوّنات خطّ الأنابيب على وحدات معالجة الرسوميات المرئية. استخدمه مع max_memory عندما تحتاج إلى حدود لكل جهاز. |
"cpu" | يضع خط الأنابيب على وحدة المعالجة المركزية (CPU). |
استخدم الحجة max_memory في from_pretrained() لتخصيص الحد الأقصى لكمية الذاكرة المستخدمة على كل جهاز. افتراضيًا، يستخدم Diffusers الحد الأقصى المتاح.
import torch
from diffusers import DiffusionPipeline
max_memory = {0: "16GB", 1: "16GB"}
pipeline = DiffusionPipeline.from_pretrained(
"Qwen/Qwen-Image",
dtype=torch.bfloat16,
device_map="balanced",
max_memory=max_memory,
)يسمح لك السمة hf_device_map بالوصول إلى device_map وعرضه.
print(pipeline.hf_device_map)
# {'transformer': 1, 'vae': 1, 'text_encoder': 0}أعد تعيين device_map لخط المعالجة باستخدام طريقة reset_device_map(). هذا ضروري إذا كنت ترغب في استخدام طرق مثل .to() وenable_sequential_cpu_offload() وenable_model_cpu_offload().
pipeline.reset_device_map()
التحميل المتوازي
غالبًا ما تُقسَّم النماذج الكبيرة إلى ملفات أصغر مجزأة لتسهيل تحميلها. يدعم Diffusers تحميل المجزئات بالتوازي لتسريع عملية التحميل.
اضبط HF_ENABLE_PARALLEL_LOADING على "YES" لتفعيل التحميل المتوازي للشظايا.
يجب تعيين الحجة device_map إلى "cuda" لإسناد مساحة كبيرة من الذاكرة مسبقًا بناءً على حجم النموذج. يقلل هذا بشكل كبير من وقت تحميل النموذج لأن تسخين مُسند الذاكرة يتجنب الآن العديد من الاستدعاءات الأصغر حجمًا للمُسند لاحقًا.
import os
import torch
from diffusers import DiffusionPipeline
os.environ["HF_ENABLE_PARALLEL_LOADING"] = "YES"
pipeline = DiffusionPipeline.from_pretrained(
"Wan-AI/Wan2.2-I2V-A14B-Diffusers", dtype=torch.bfloat16, device_map="cuda" # or "mps", "xpu", "cpu"
)استبدال النماذج في خط الأنابيب
DiffusionPipeline مرن ويتيح تحميل نماذج أو مجدولات أخرى. يمكنك تجربة مجدولات مختلفة لتحسين سرعة التوليد أو جودته، كما يمكنك استبدال النماذج بنماذج أكثر كفاءة.
يستخدم المثال أدناه إصدارًا أكثر استقرارًا من VAE.
import torch
from diffusers import DiffusionPipeline, AutoModel
vae = AutoModel.from_pretrained(
"madebyollin/sdxl-vae-fp16-fix", dtype=torch.float16
)
pipeline = DiffusionPipeline.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0",
vae=vae,
dtype=torch.float16,
device_map="cuda" # or "mps", "xpu", "cpu"
)إعادة استخدام النماذج في خطوط أنابيب متعددة
عند العمل مع خطوط أنابيب متعددة تستخدم نفس النموذج، تتيح لك الطريقة from_pipe() إعادة استخدام النموذج بدلاً من إعادة تحميله في كل مرة. وهذا يتيح لك استخدام خطوط أنابيب متعددة دون زيادة استهلاك الذاكرة.
يُحدَّد استهلاك الذاكرة بواسطة خط الأنابيب الذي يتطلب أعلى قدر من الذاكرة بغض النظر عن عدد خطوط الأنابيب.
يُحمّل المثال أدناه خط أنابيب ثم يُحمّل خط أنابيب ثانٍ باستخدام from_pipe() لاستخدام إرشاد الانتباه المُعطَّل (PAG) لتحسين جودة التوليد.
استخدم AutoPipelineForText2Image لأن DiffusionPipeline لا يدعم PAG. راجع وثائق AutoPipeline لمعرفة المزيد.
import torch
from diffusers import AutoPipelineForText2Image
pipeline_sdxl = AutoPipelineForText2Image.from_pretrained(
"stabilityai/stable-diffusion-xl-base-1.0", dtype=torch.float16, 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
"""
image = pipeline_sdxl(prompt).images[0]
print(f"Max memory reserved: {torch.cuda.max_memory_allocated() / 1024**3:.2f} GB")
# Max memory reserved: 10.47 GBاضبط enable_pag=True في خط الأنابيب الثاني لتفعيل PAG. يستخدم خط الأنابيب الثاني نفس كمية الذاكرة لأنه يتشارك أوزان النموذج مع خط الأنابيب الأول.
pipeline = AutoPipelineForText2Image.from_pipe(
pipeline_sdxl, enable_pag=True
)
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
"""
image = pipeline(prompt).images[0]
print(f"Max memory reserved: {torch.cuda.max_memory_allocated() / 1024**3:.2f} GB")
# Max memory reserved: 10.47 GBتشارك خطوط الأنابيب التي أنشأها from_pipe() نفس النماذج والحالة. يعدّل تغيير حالة نموذج في خط أنابيب واحد جميع خطوط الأنابيب الأخرى التي تشارك نفس النموذج.
Some methods may not work correctly on pipelines created with from_pipe(). For example, enable_model_cpu_offload() relies on a unique model execution order, which may differ in the new pipeline. To ensure proper functionality, reapply these methods on the new pipeline.
الخطوات التالية
بعد تحميل خط الأنابيب، تقوم عادةً بضبط جدول إزالة الضوضاء، أو تبديل صيغ الأوزان، أو إرفاق المُكيِّفات.
- يتناول المجدولون تبديل خوارزمية إزالة الضوضاء وإعدادها.
- يتناول صيغ النماذج صيغة GGUF ونقاط التفتيش أحادية الملف وتخطيطات الأوزان الأخرى.
- يتناول تقليل استهلاك الذاكرة عمليات الإزاحة وأدوات الذاكرة الأخرى.
- يتناول LoRA تحميل المُكيّفات على خطّ الأنابيب.
- يتناول نقاط التفتيش القديمة أداة فحص الأمان الخاصة بنقاط تفتيش Stable Diffusion الأقدم.