Diffusers documentation

التخزين المؤقت

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

التخزين المؤقت

تُسرع التخزين المؤقت (Caching) الاستدلال من خلال تخزين المخرجات الوسيطة للطبقات المختلفة، مثل طبقات الانتباه (attention) وطبقات التغذية الأمامية (feedforward)، وإعادة استخدامها، بدلاً من تنفيذ الحساب الكامل في كل خطوة من خطوات الاستدلال. وهو يحسّن سرعة التوليد بشكل كبير على حساب زيادة استهلاك الذاكرة، ولا يتطلب تدريبًا إضافيًا.

يُظهر لك هذا الدليل كيفية استخدام طرق التخزين المؤقت المدعومة في Diffusers.

بث الانتباه الهرمي

بث الانتباه الهرمي (PAB) يستند إلى الملاحظة أن مخرجات الانتباه لا تختلف كثيرًا بين خطوات التوليد المتتالية. تكون فروق الانتباه أصغر في طبقات الانتباه المتقاطع، وتُخزَّن عمومًا عبر نطاق أوسع من الخطوات الزمنية. يتبع ذلك طبقات الانتباه الزمني وطبقات الانتباه المكاني.

لا تمتلك جميع نماذج الفيديو ثلاثة أنواع من الانتباه (المتقاطع، والزمني، والمكاني)!

يمكن دمج PAB مع تقنيات أخرى مثل توازي التسلسل وتوازي التوجيه الحر من التصنيف (توازي البيانات) لتحقيق توليد الفيديو شبه الفوري.

قم بإعداد PyramidAttentionBroadcastConfig ومرره إلى محوّل خط الأنابيب لتفعيله. يتحكم spatial_attention_block_skip_range في تكرار تخطي حسابات الانتباه في كتل الانتباه المكانية، بينما يمثل spatial_attention_timestep_skip_range نطاق خطوات الزمن المراد تخطيها. انتبه إلى اختيار نطاق مناسب، لأن الفاصل الأصغر قد يؤدي إلى بطء في سرعة الاستدلال، بينما قد يؤدي الفاصل الأكبر إلى انخفاض في جودة التوليد.

import torch
from diffusers import CogVideoXPipeline, PyramidAttentionBroadcastConfig

pipeline = CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-5b", dtype=torch.bfloat16)
pipeline.to("cuda")  # or "mps", "xpu", "cpu"

config = PyramidAttentionBroadcastConfig(
    spatial_attention_block_skip_range=2,
    spatial_attention_timestep_skip_range=(100, 800),
    current_timestep_callback=lambda: pipe.current_timestep,
)
pipeline.transformer.enable_cache(config)

FasterCache

يخزّن FasterCache ميزات الانتباه ويعيد استخدامها، على غرار PAB، نظراً لأن فروقات المخرجات تكون صغيرة لكل خطوة زمنية تالية.

قد يختار هذا الأسلوب أيضًا تخطي تنبؤ الفرع غير الشرطي، عند استخدام التوجيه الحر من التصنيف للعينة (وهو أمر شائع في معظم النماذج الأساسية)، وتقديره من تنبؤ الفرع الشرطي إذا كان هناك تكرار كبير في المخرجات الكامنة المتنبأ بها بين خطوات الزمن المتتالية.

قم بإعداد FasterCacheConfig ومرّره إلى محوّل خط الأنابيب لتفعيله.

import torch
from diffusers import CogVideoXPipeline, FasterCacheConfig

pipe line= CogVideoXPipeline.from_pretrained("THUDM/CogVideoX-5b", dtype=torch.bfloat16)
pipeline.to("cuda")  # or "mps", "xpu", "cpu"

config = FasterCacheConfig(
    spatial_attention_block_skip_range=2,
    spatial_attention_timestep_skip_range=(-1, 681),
    current_timestep_callback=lambda: pipe.current_timestep,
    attention_weight_callback=lambda _: 0.3,
    unconditional_batch_skip_range=5,
    unconditional_batch_timestep_skip_range=(-1, 781),
    tensor_format="BFCHW",
)
pipeline.transformer.enable_cache(config)

SeaCache

يقارن SeaCache مؤشرات التطور الطيفي الواعي (SEA) بين خطوات إزالة الضوضاء المتتالية. عندما يبقى التغير التراكمي في المؤشر دون حد معين، يتخطى مجموعة كتل الترانسفورمر المكلفة ويتنبأ بمخرجاتها من بقايا مخزنة مسبقًا. ابنِ المؤشر من الكمونيات البصرية التي تشكّل المخرجات المولّدة. شمل إطارات التكييف النظيفة عندما تكون جزءًا من مسار تلك المخرجات، كما هو الحال في توليد الفيديو من صورة وتوليد الفيديو من فيديو. استبعد التلميحات البصرية المنفصلة التي تكيّف التوليد لكنها ليست جزءًا من المخرجات. يتم استبعاد تكييف النص لأنه ليس كمونًا بصريًا.

تتحكم حزم Cosmos 3 Transfer في التلميحات كسلاسل بصرية مستقلة، لذا يستثني مُكيّفها هذه التلميحات من المؤشر. تقارن فروع Control-CFG مسار الإخراج نفسه مع الاحتفاظ بقاياها المخزنة مسبقاً. لا تزال التلميحات الشرطية تؤثر على محول التحويل.

توفر التنفيذ محولات مدمجة للنماذج التالية:

  • Cosmos 3 هو التكامل الأساسي المُحسَّن والمُختبَر. يقوم بتخزين المكدس الكامل لفك الترميز عبر حدّ ما بعد التطبيع.
  • يستخدم Wan T2V مسار الكتل المتكررة العام في وضع eager. تُظهر هذه التكيفية كيف يمكن لمحوّل فيديو أحادي التدفق آخر أن يوفر كامنات رؤية خام إلى SeaCache؛ وهي ليست ادعاءً بأن نفس معاملات التخزين المؤقت مثالية لـ Wan أو أن متغيرات Wan الأخرى مدعومة.

يمكن لحوّالات الفيديو الأخرى أن تتكامل مع المسار العام عندما تستخدم CacheMixin، وتكشف عن قائمة كتل متكررة معترف بها، وتسجّل تخطيط مدخلات/مخرجات الكتل في TransformerBlockRegistry. يجب أن تدخل خط الأنابيب في cache_context لكل استدعاء للحوّال، وتربط step_index وsigma وnum_inference_steps، وتستخدم أسماء سياق منفصلة للمسارات المستقلة مثل التوجيه الشرطي وغير الشرطي. مرّر raw_vision_callback الذي يعيد الكامنات البصرية التي تشكّل المخرجات المولّدة عندما لا يتوفر مُكيّف مدمج. تحقّق من جودة المخرجات وضبط معاملات التخزين المؤقت لكل نموذج ومجدول؛ فالدعم ونتائج الاختبارات لا تنتقل تلقائيًا من Cosmos 3.

Cosmos 3

SeaCache معطّل افتراضيًا. فعّله على المحوّل؛ إذ يربط حل إزالة الضوضاء في Cosmos 3 خطوة الجدولة النشطة، وقيمة sigma، وعدد الخطوات مع كل استدعاء لـ cache_context، لذا لا حاجة إلى أي ربط إضافي:

from diffusers import Cosmos3OmniPipeline, SeaCacheConfig

pipe = Cosmos3OmniPipeline.from_pretrained("nvidia/Cosmos3-Nano")
pipe.transformer.enable_cache(SeaCacheConfig(threshold=0.2, max_consecutive_cached=2))

يعمل هذا الواجهة البرمجية على مستوى النموذج مع Cosmos3OmniPipeline وCosmos3OmniModularPipeline وCosmos3DistilledModularPipeline. يُعد SeaCache تحسينًا تقريبيًا وقد يُغيّر المخرجات المولّدة. استدعِ pipe.transformer.disable_cache() عندما تحتاج إلى تنفيذ كل خطوة إزالة الضوضاء عبر المحوّل الكامل.

FirstBlockCache

يتحقق FirstBlock Cache من مقدار تغيّر الطبقات المبكرة في مُزيل الضوضاء من خطوة زمنية إلى التالية. إذا كان التغير صغيراً، يتخطّى النموذج الطبقات اللاحقة المكلفة ويعيد استخدام المخرجات السابقة.

import torch
from diffusers import DiffusionPipeline
from diffusers.hooks import apply_first_block_cache, FirstBlockCacheConfig

pipeline = DiffusionPipeline.from_pretrained(
    "Qwen/Qwen-Image", dtype=torch.bfloat16
)
apply_first_block_cache(pipeline.transformer, FirstBlockCacheConfig(threshold=0.2))

TaylorSeer ذاكرة مؤقتة

يعمل TaylorSeer Cache على تسريع استنتاج النماذج الانتشارية من خلال استخدام توسعات متسلسلة تايلور لتقريب وتخزين التفعيلات الوسيطة عبر خطوات إزالة الضوضاء. يتنبأ هذا المنهج بالمخرجات المستقبلية بناءً على الحسابات السابقة، ويعيد استخدامها عند فترات محددة لتقليل الحسابات المكررة.

يقدّم هذا آلية التخزين المؤقت نتائج قوية مع حد أدنى من العبء الإضافي على الذاكرة. لتحليل الأداء التفصيلي، راجعوا نتائجنا هنا.

لتفعيل TaylorSeer Cache، أنشئ TaylorSeerCacheConfig وقم بتمريره إلى نموذج التحويل الخاص بخط أنابيبك:

  • cache_interval: عدد الخطوات لإعادة استخدام المخرجات المخزنة مؤقتًا قبل إجراء تمرير أمامي كامل
  • disable_cache_before_step: الخطوات الأولية التي تستخدم الحسابات الكاملة لجمع البيانات للتقديرات
  • max_order: دقة التقريب (نظريًا، تزيد القيم الأعلى من الجودة لكنها تزيد أيضًا من استهلاك الذاكرة، وننصح بإعدادها على 1)
import torch
from diffusers import FluxPipeline, TaylorSeerCacheConfig

pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-dev",
    dtype=torch.bfloat16,
).to("cuda")  # or "mps", "xpu", "cpu"

config = TaylorSeerCacheConfig(
    cache_interval=5,
    max_order=1,
    disable_cache_before_step=10,
    taylor_factors_dtype=torch.bfloat16,
)
pipe.transformer.enable_cache(config)

MagCache

يعمل MagCache على تسريع الاستدلال عن طريق تخطي كتل التحويل (transformer blocks) بناءً على حجم التحديث المتبقي. يلاحظ أن حجم التحديثات (المخرجات - المدخلات) يتناقص بشكل يمكن التنبؤ به على مدى عملية الانتشار. من خلال تراكم "ميزانية خطأ" بناءً على نسب الأحجام المحسوبة مسبقًا، يقرر ديناميكيًا متى يتعين تخطي الحساب وإعادة استخدام المتبقي السابق.

يعتمد MagCache على النسب الحجمية (mag_ratios)، والتي تصف منحنى التلاشي هذا. هذه النسب محددة لنقطة التفتيش النموذجية ومجدول الجدولة. النسب الحجمية المرفقة FLUX_MAG_RATIOS تم قياسها على FLUX.1؛ بينما تحتاج النماذج الأخرى، بما في ذلك Flux2 وFlux2 Klein، إلى عملية معايرة خاصة بها.

لاستخدام MagCache، تتّبع عادةً عملية من خطوتين: المعايرة والاستدلال.

  1. المعايرة: نفّذ الاستدلال مرة واحدة مع calibrate=True. سيقوم الخطاف بقياس أحجام البواقي وطباعة النسب المحسوبة في وحدة التحكم.
  2. الاستدلال: مرر هذه النسب إلى MagCacheConfig لتفعيل التسريع.
import torch
from diffusers import FluxPipeline, MagCacheConfig

pipe = FluxPipeline.from_pretrained(
    "black-forest-labs/FLUX.1-schnell",
    dtype=torch.bfloat16
).to("cuda")  # or "mps", "xpu", "cpu"

# 1. Calibration Step
# Run full inference to measure model behavior.
calib_config = MagCacheConfig(calibrate=True, num_inference_steps=4)
pipe.transformer.enable_cache(calib_config)

# Run a prompt to trigger calibration
pipe("A cat playing chess", num_inference_steps=4)
# Logs will print something like: "MagCache Calibration Results: [1.0, 1.37, 0.97, 0.87]"

# 2. Inference Step
# Apply the specific ratios obtained from calibration for optimized speed.
# Note: For Flux models, you can also import defaults: 
# from diffusers.hooks.mag_cache import FLUX_MAG_RATIOS
mag_config = MagCacheConfig(
    mag_ratios=[1.0, 1.37, 0.97, 0.87],
    num_inference_steps=4
)

pipe.transformer.enable_cache(mag_config) 

image = pipe("A cat playing chess", num_inference_steps=4).images[0]

تمثل mag_ratios منحنى التلاشي الجوهري للمقياس في النموذج. يمكن إعادة استخدام النسب المُعايرة لعدد كبير من الخطوات (مثل 50) مع عدد أقل من الخطوات (مثل 20). يستخدم التنفيذ الاستيفاء (Interpolation) لربط المنحنى بعدد خطوات الاستدلال الحالية.

في خطوط الأنابيب التي تعمل بتوجيه بلا مُصنِّف (Classifier-Free Guidance) بشكل تسلسلي (مثل Kandinsky 5.0)، قد يطبع سجل المعايرة مصفوفتين: واحدة للمرور الشرطي (Conditional) وأخرى للمرور غير الشرطي (Unconditional). في معظم الحالات، يجب عليك استخدام المصفوفة الأولى (الشرطية).

بالنسبة إلى خطوط الأنابيب التي تعمل بتوجيه بلا مُصنِّف (Classifier-Free Guidance) بطريقة مجمَّعة (مثل SDXL أو Flux)، فإن hidden_states التي يعالجها النموذج تحتوي على كلا الفرعين الشرطي وغير الشرطي مدموجين معًا. يأخذ عملية المعايرة هذا الأمر في الحسبان تلقائيًا، فتنتج عن ذلك مصفوفة واحدة من النسب تمثل السلوك المشترك. يمكنك استخدام هذه المصفوفة الناتجة مباشرة دون أي تعديل.

Update on GitHub