Diffusers documentation
LTX2VideoDiffusionDecoderModel
LTX2VideoDiffusionDecoderModel
مفكّك الفيديو التوزيعي الذي قدمته Lightricks في LTX-2.5. تقوم مراحل الانتباه الجوارية برفع عينة الكامن إلى حجم سياق، ثم تقوم المرحلة النهائية بإزالة الضوضاء من البكسلات مشروطةً بذلك السياق.
إنه مُفكّك (decoder) وليس مُشفّر-مُفكّك (autoencoder): تبقى عملية التشفير مع AutoencoderKLLTX2Video، الذي يستهلك هذا المُفكّك فضاءه الكامن (latent space) دون تغيير، وبالتالي يمكن تبادل المتغيرات الكامنة (latents) بين المُفكّك التحويلي (convolutional decoder) وهذا المُفكّك. وبما أنه نموذج انتشار (diffusion model) بحد ذاته، فإنّه يُشغَّل عبر LTX2VideoDiffusionDecodePipeline بدلاً من تمريره كـ vae في خط أنابيب (pipeline): شغّل أي خط أنابيب LTX-2 مع output_type="latent"، ثم فكّك الترميز.
import torch
from diffusers import LTX2Pipeline, LTX2VideoDiffusionDecodePipeline, LTX2VideoDiffusionDecoderModel
pipe = LTX2Pipeline.from_pretrained("Lightricks/LTX-2.5-Diffusers", dtype=torch.bfloat16).to("cuda") # or "mps", "xpu", "cpu"
latents = pipe(prompt="a potter shaping a clay vase", output_type="latent").frames
decoder = LTX2VideoDiffusionDecoderModel.from_pretrained(
"Lightricks/LTX-2.5-Diffusers", subfolder="diffusion_decoder", dtype=torch.bfloat16
).to("cuda")
decode_pipe = LTX2VideoDiffusionDecodePipeline(diffusion_decoder=decoder, scheduler=pipe.scheduler)
# `denormalize=False`: `output_type="latent"` already applied the latent statistics, so applying them
# again here would scale every channel by its std a second time.
# The decoder also draws the noise it denoises, so decoding is only reproducible with a generator.
video = decode_pipe(
latents, generator=torch.Generator("cuda").manual_seed(0), denormalize=False
).frames[0]vae هو مكوّن اختياري في خط أنابيب فك الترميز: لا يُستشار إلا للحصول على إحصاءات الكمون عندما يكون denormalize=True، بينما يحمل المُفكّك إحصاءاته الخاصة، لذا لا يحتاج سير عمل مخصص لفك الترميز فقط إلى تحميل مُشفّر-مفكّك ذاتي ثانٍ.
واجهات الخلفية للانتباه
يُعبَّر عن نافذة الانتباه الجوارية على شكل BlockMask، لذا يعمل المُفكّك افتراضيًا على واجهة flex الانتباه ولا يحتاج إلى أي اعتماد إضافي. لا يجمّع PyTorch دالة flex_attention ما لم تطلب منه ذلك صراحةً، وبدون التجميع تُنشئ الدالة مصفوفة الدرجات الكاملة — وهو أمر غير عملي عند أطوال التسلسلات الكاملة الدقة. لهذه الحالات، إما أن تجمع المُفكّك أو تنتقل إلى نواة NATTEN، وهي أيضًا ما تستخدمه النسخة الأصلية. يجلب المعالج NATTEN من Hub
(shi-labs/natten) عبر حزمة kernels، لذا يحتاج إلى pip install kernels بدلاً من بناء NATTEN محليًا:
from diffusers.models.autoencoders.ltx2_diffusion_decoder import LTX2VideoVaeNeighborhoodNattenProcessor
decoder.set_attn_processor(LTX2VideoVaeNeighborhoodNattenProcessor())جلب كود تنزيل النواة من Hub، لذا يرمي المعالج استثناءً عند تعطيل الكود عن بُعد على مستوى النظام باستخدام DIFFUSERS_DISABLE_REMOTE_CODE=true.
كل وحدة انتباه في المُفكِّك هي انتباه جوار متطابق (فالاختلافات بين المراحل، مثل حجم النواة، موجودة على الوحدة وليس على المُعالِج)، لذا يستبدل set_attn_processor جميعها بمثال مشترك واحد.
تغيير الواجهة الخلفية (decoder.set_attention_backend(...)) إلى أي شيء غير flex يؤدي إلى: لا تقبل أي واجهة خلفية أخرى BlockMask. استخدم معالج NATTEN المذكور أعلاه بدلاً من ذلك.
تقسيم
يقوم decoder.enable_tiling() بفك الترميز في بلاطات متداخلة يتم دمجها معًا مرة أخرى، مما يحدّ من ذروة الذاكرة حسب حجم البلاطة بدلاً من حجم الفيديو. لا تزال مراحل رفع العينة المبكرة منخفضة التكلفة ترى الكامنة الكاملة — حيث تعمل فقط مرحلة رفع العينة الأخيرة ومرحلة الانتشار، اللتان تتحكمان في ذاكرة فك الترميز، لكل بلاطة على حدة — لذا فإن التقسيم إلى بلاطات يغيّر المخرجات فقط بالقرب من حدود البلاطات. نظرًا لأن مرحلة الانتشار تُزيل الضوضاء من كل بلاطة بشكل منفصل، فإن فك الترميز المبوّب لا يعيد إنتاج النتيجة غير المبوّبة بدقة؛ حيث تتطابق أحجام البلاطة والتداخل الافتراضية مع تلك الموجودة في التنفيذ المرجعي. يرفض الانتباه الجوار أي شبكة أصغر من نواته، لذا يتم دمج بلاطة البقايا النهائية مع جارتها بدلاً من فك ترميزها بشكل مستقل.
LTX2VideoDiffusionDecoderModel
فئة diffusers.LTX2VideoDiffusionDecoderModel
< source >( out_channels: int = 3latent_channels: int = 128patch_size: int = 4scaling_factor: float = 1.0decoder_head_dim: int = 64decoder_stage_channels: tuple = (2048, 1024, 512, 512, 256)decoder_stage_depths: tuple = (4, 6, 4, 2, 8)decoder_stage_kernels: tuple = ((3, 7, 7), (3, 7, 7), (3, 5, 5), (3, 5, 5))decoder_upsample_strides: tuple = ((1, 2, 2), (2, 1, 1), (2, 2, 2), (2, 2, 2))decoder_upsample_channel_reductions: tuple = (2, 2, 1, 2)decoder_stage5_kernel: tuple = (11, 11, 11)decoder_t_emb_dim: int = 384decoder_timestep_scale_multiplier: float = 1000.0decoder_model_output_type: str = 'x0'decoder_num_inference_steps: int = 1spatial_compression_ratio: int = 32temporal_compression_ratio: int = 8 )
مفكّك الفيديو التوليدية LTX-2، الذي أُدخل في LTX-2.5.
هذا مُفكّك (decoder) وليس مُشفّر-مُفكّك (autoencoder): فهو لا يحتوي على مُشفّر (encoder) ولا يمكنه إنتاج تمثيلات كامنة (latents). يبقى التشفير على عاتق AutoencoderKLLTX2Video، الذي يستهلك هذا المُفكّك فضاءه الكامن دون تغيير، وبالتالي فإن التمثيلات الكامنة قابلة للتبديل بين المُفكّك التحويلي (convolutional decoder) وهذا المُفكّك.
كما أنه نموذج انتشار وليس مُفكّكًا حتميًا — فهو يُزيل الضوضاء من البكسلات مشروطًا بحجم سياق مبني من الكمونيات — ولهذا السبب يُشغَّل بواسطة LTX2VideoDiffusionDecodePipeline بدلاً من أن يُمرَّر كـ vae في خط أنابيب.
تُحمَل الإحصاءات الكامنة هنا كخوادم مؤقتة (buffers) بحيث يمكن لخط أنابيب فك الترميز (decode pipeline) إلغاء التطبيع دون تحميل مُشفِّر-مفكِّك ذاتي ثانٍ فقط من أجل متجهين.
يرث هذا النموذج من ModelMixin. راجع توثيق الفئة الأصلية لمعرفة طرقه العامة المُنفَّذة لجميع النماذج (مثل التنزيل أو الحفظ).
decode
< source >( z: Tensorgenerator: typing.Optional[torch.Generator] = Nonenum_inference_steps: int | None = Nonereturn_dict: bool = True )
فكّ تشفير دفعة من الكمونيات.
z يُفترض أن يكون غير مُعايَر مسبقًا (حيث يطبّق خط المعالجة latents_mean / latents_std)، بما يتوافق مع AutoencoderKLLTX2Video. يقوم هذا المُفكّك بإزالة الضوضاء، لذا مرّر generator لضمان قابلية التكرار.
enable_tiling
< source >( tile_sample_min_height: int | None = Nonetile_sample_min_width: int | None = Nonetile_sample_min_num_frames: int | None = Nonetile_sample_stride_height: int | None = Nonetile_sample_stride_width: int | None = Nonetile_sample_stride_num_frames: int | None = None )
المعاملات
- tile_sample_min_height (
int, اختياري) — ارتفاع بلاطة واحدة بعد فك الترميز، بالبكسل. - tile_sample_min_width (
int, اختياري) — عرض بلاطة واحدة بعد فك الترميز، بالبكسل. - tile_sample_min_num_frames (
int, اختياري) — عدد الإطارات في بلاطة واحدة بعد فك الترميز. - tile_sample_stride_height (
int, اختياري) — المسافة بالبكسل بين أعلى طرفين لقطعتين عموديتين متتاليتين؛ والفرق عنtile_sample_min_heightهو التداخل المُدمج. - tile_sample_stride_width (
int, اختياري) — المسافة بالبكسل بين الحواف اليسرى لقطعتين أفقيتين متتاليتين. - tile_sample_stride_num_frames (
int, اختياري) — المسافة بالأطارات بين بدايات بلاطتين زمنيتين متتاليتين.
تفعيل فك الترميز المُجزّأ. مراحل الاستيفاء الحتمي قبل المرحلة الأخيرة تعالج دائمًا الكامن الكامل (تعمل بدقة منخفضة وتكون منخفضة التكلفة)؛ بينما تعمل المرحلة الأخيرة ومكعبات الانتشار الخاصة بالمرحلة الخامسة — والتي تستهلك الجزء الأكبر من ذاكرة فك الترميز — على بلاطات متداخلة يتم دمج حدودها خطيًا.
تعطيل فك الترميز المُجزّأ، والعودة إلى فك ترميز الفيديو بالكامل في مسار واحد.
forward
< source >( z: Tensorgenerator: typing.Optional[torch.Generator] = Nonenum_inference_steps: int | None = Nonereturn_dict: bool = True ) → DecoderOutput or tuple
المعاملات
- z (
torch.Tensor) — قيم كامنة (Latents) بأبعاد(B, C, F, H, W)، يُفترض أن تكون غير مُعايرة (denormalized) بالفعل (حيث يطبّق خط الأنابيبlatents_mean/latents_std)، بما يتوافق مع AutoencoderKLLTX2Video. - generator (
torch.Generator، اختياري) — هذا المُفكِّك يُزيل الضوضاء، لذا مرِّر مُولِّدًا لجعل عملية فك الترميز قابلة للتكرار. - num_inference_steps (
int، اختياري) — عدد خطوات إزالة الضوضاء. القيمة الافتراضية هي قيمة الإعدادdecoder_num_inference_stepsالخاصة بفك الترميز. - return_dict (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان يجب إرجاع DecoderOutput بدلاً من tuple عادي.
يعيد
DecoderOutput أو tuple
tiled_decode
< source >( z: Tensorgenerator: typing.Optional[torch.Generator] = Nonenum_inference_steps: int | None = None )
Decode دفعة من الكمونيات باستخدام المرحلة الحتمية الأخيرة والمرحلة الانتشارية التي تعمل لكل بلاطة.
توجد البلاطات على الشبكة الداخلة إلى المرحلة الحتمية الأخيرة، حيث تُخزَّن خلية واحدة إلى كتلة ثابتة من بكسلات الإخراج؛ وتُحوَّل أحجام tile_sample_* إلى تلك الشبكة، لذا ينبغي أن تكون مضاعفات لحجم الخلية (8 بكسل مكانيًا و2 إطار زمنيًا في إعداد الإنتاج). تتبع البلاطات الزمنية خرائط الإطار السببية: تُسقط البلاطة التي تحتوي على t=0 الإطار الرأسي المكرر الناتج عن التوسيع الزمني، ولا تحمل البلاطة التي تحتوي على نهاية الفيديو سوى حشوة الحدود الخاصة بـ NATTEN.