Diffusers documentation
AnyFlow
AnyFlow
AnyFlow: نموذج انتشار فيديو بخطوات حرة مع تقطير خريطة التدفق وفق السياسة من NVIDIA وجامعة سنغافورة الوطنية ومعهد ماساتشوستس للتكنولوجيا، بقلم Yuchao Gu وGuian Fang وYuxin Jiang وWeijia Mao وSong Han وHan Cai وMike Zheng Shou.
ملخص سريع: يُعد AnyFlow أول إطار عمل لتوليد الفيديو بالانتشار (Diffusion) يعتمد على خرائط التدفق (Flow Maps)، مما يتيح لنموذج واحد (سواء كان ثنائي الاتجاه أو سببي) التكيف مع ميزانيات الاستدلال (Inference) المتغيرة.
شهد توليد الفيديو بعدد قليل من الخطوات تقدماً كبيراً بفضل نماذج الاتساق. ومع ذلك، فإن أدائها غالباً ما يتدهور في نماذج انتشار الفيديو التي تعمل بأي عدد من الخطوات بسبب صياغة النقطة الثابتة. لمعالجة هذه القيود، نقدم AnyFlow، وهو أول إطار لتقطير انتشار الفيديو الذي يعمل بأي عدد من الخطوات، مبني على خرائط التدفق. بدلاً من تعلم التحويل z_t → z_0 فقط، يتعلم AnyFlow الانتقالات z_t → z_r عبر فترات زمنية اختيارية، مما يتيح لنموذج واحد التكيف مع ميزانيات استنتاج مختلفة. صممنا وصفة تدريب محسّنة لخريطة التدفق الأمامية التي تعيد ضبط نماذج انتشار الفيديو المُسبقة التدريب لتصبح نماذج خرائط تدفق، وقدمنا محاكاة خلفية لخريطة التدفق (Flow Map Backward Simulation) لتمكين التقطير وفق السياسة (on-policy distillation) لنماذج خرائط التدفق. تُظهر التجارب الواسعة عبر كل من البنى المعمارية ثنائية الاتجاه والسببية، بمقاييس تتراوح من 1.3B إلى 14B، على مهام النص إلى الفيديو والصورة إلى الفيديو، أن AnyFlow يتفوق على الخطوط الأساسية القائمة على الاتساق مع الحفاظ على دقة عالية وعينة مرنة تحت ميزانيات خطوات متغيرة.
تمت مساهمة خطوط أنابيب AnyFlow من قبل فريق AnyFlow. الكود الأصلي متاح على GitHub، وصفحة المشروع متاحة على nvlabs.github.io/AnyFlow، ويمكن العثور على النماذج المُسبقة التدريب في مجموعة nvidia/anyflow على Hugging Face.
النماذج المتاحة:
| نقطة التفتيش | الهيكل | الوصف |
|---|---|---|
nvidia/AnyFlow-Wan2.1-T2V-1.3B-Diffusers | Wan2.1 1.3B | T2V ثنائي الاتجاه |
nvidia/AnyFlow-Wan2.1-T2V-14B-Diffusers | Wan2.1 14B | T2V ثنائي الاتجاه |
nvidia/AnyFlow-FAR-Wan2.1-1.3B-Diffusers | FAR + Wan2.1 1.3B | T2V / I2V / V2V السببي |
nvidia/AnyFlow-FAR-Wan2.1-14B-Diffusers | FAR + Wan2.1 14B | T2V / I2V / V2V السببي |
AnyFlowPipelineمصمَّم لنماذج الانتشار ثنائية الاتجاه في توليد الفيديو من النص (T2V). أماAnyFlowFARPipelineفهو نموذج انتشار سببي على مستوى المقاطع يدعم توليد الفيديو من النص (T2V)، وتوليد الفيديو من الصورة (I2V)، واستكمال الفيديو (V2V).
التوليد باستخدام AnyFlow (T2V ثنائي الاتجاه)
import torch
from diffusers import AnyFlowPipeline
from diffusers.utils import export_to_video
pipe = AnyFlowPipeline.from_pretrained(
"nvidia/AnyFlow-Wan2.1-T2V-1.3B-Diffusers", dtype=torch.bfloat16
).to("cuda") # or "mps", "xpu", "cpu"
prompt = (
"An astronaut runs smoothly and appears almost weightless on the lunar surface, "
"as seen from a low-angle shot that highlights the vast, desolate background of the moon. "
"The moon's craters and rocky terrain are clearly visible, creating a stark contrast against "
"the running astronaut who moves with graceful, fluid motions."
)
video = pipe(prompt, num_inference_steps=4, num_frames=81).frames[0]
export_to_video(video, "anyflow_t2v.mp4", fps=16)التوليد باستخدام AnyFlow (FAR Causal)
تختار خط أنابيب السببية بين T2V / I2V / V2V عبر الحجة video (أو video_latents):
اترك كلاهما فارغًا للحصول على تحويل نص إلى فيديو عادي، أو مرر video=<tensor> بشكل (B, T, C, H, W) في [0, 1] مع T = 4n + 1 للتكييف على إطارات موجودة. استخدم إطار تكييف واحدًا لـ I2V ومقطعًا أطول لاستكمال V2V. إذا كان لديك بالفعل كامنات مشفرة مسبقًا في تخطيط النموذج، فمررها عبر video_latents=<tensor> لتخطي ترميز VAE. video و video_latents متنافيان.
تُدمج نقاط التفتيش المُصدَّرة
chunk_partition=[1, 3, 3, 3, 3, 3, 3, 2](مجموعها 21) في إعدادات المحوّل، بما يتوافق مع 81 إطارًا خامًا قياسيًّا (21 إطارًا كامنًا عند خطوة VAE الزمنية البالغة 4). عند تغييرnum_frames، مرِّرchunk_partitionمتطابقًا يكون مجموع قيمه(num_frames - 1) // 4 + 1، وإلا فإن خط الأنابيب يرميValueError.
import torch
from diffusers import AnyFlowFARPipeline
from diffusers.utils import export_to_video
pipe = AnyFlowFARPipeline.from_pretrained(
"nvidia/AnyFlow-FAR-Wan2.1-1.3B-Diffusers", dtype=torch.bfloat16
).to("cuda") # or "mps", "xpu", "cpu"
prompt = (
"An astronaut runs smoothly and appears almost weightless on the lunar surface, "
"as seen from a low-angle shot that highlights the vast, desolate background of the moon."
)
video = pipe(prompt, num_inference_steps=4, num_frames=81).frames[0]
export_to_video(video, "anyflow_far_t2v.mp4", fps=16)import numpy as np
import torch
from diffusers import AnyFlowFARPipeline
from diffusers.utils import export_to_video, load_image
pipe = AnyFlowFARPipeline.from_pretrained(
"nvidia/AnyFlow-FAR-Wan2.1-1.3B-Diffusers", dtype=torch.bfloat16
).to("cuda") # or "mps", "xpu", "cpu"
# Example conditioning image from the AnyFlow repo.
first_frame = load_image(
"https://raw.githubusercontent.com/NVlabs/AnyFlow/main/assets/evaluation/example/images/1.jpg"
).resize((832, 480))
arr = np.asarray(first_frame).astype("float32") / 255.0 # (480, 832, 3)
context_tensor = torch.from_numpy(arr).permute(2, 0, 1).unsqueeze(0).unsqueeze(1).to("cuda") # (1, 1, 3, 480, 832)
prompt = (
"A towering, battle-scarred humanoid robot, reminiscent of a Transformer with powerful, segmented armor "
"and glowing red optics, walking through the skeletal remains of a city ruin. Twisted metal and shattered "
"concrete crunch under its heavy steps, as the robot scans the desolate, dust-choked skyline under an dark sky."
)
video = pipe(
prompt=prompt,
video=context_tensor,
num_inference_steps=4,
num_frames=81,
).frames[0]
export_to_video(video, "anyflow_far_i2v.mp4", fps=16)import numpy as np
import torch
from diffusers import AnyFlowFARPipeline
from diffusers.utils import export_to_video, load_video
pipe = AnyFlowFARPipeline.from_pretrained(
"nvidia/AnyFlow-FAR-Wan2.1-1.3B-Diffusers", dtype=torch.bfloat16
).to("cuda") # or "mps", "xpu", "cpu"
# Example conditioning clip from the AnyFlow repo — take the first 9 frames (3 latent frames at VAE temporal stride 4).
context_frames = load_video(
"https://raw.githubusercontent.com/NVlabs/AnyFlow/main/assets/evaluation/example/videos/2.mp4"
)[:9]
arr = np.stack([np.asarray(f.resize((832, 480))) for f in context_frames]).astype("float32") / 255.0
context_tensor = torch.from_numpy(arr).permute(0, 3, 1, 2).unsqueeze(0).to("cuda") # (1, 9, 3, 480, 832)
prompt = (
"A focused trail runner's powerful strides through a dense, sun-dappled forest. "
"The camera tracks alongside, highlighting muscular exertion, sweat, and determined facial expression."
)
video = pipe(
prompt=prompt,
video=context_tensor,
num_inference_steps=4,
num_frames=81,
# Override chunk_partition so the first chunk covers exactly the 3 latent context frames.
chunk_partition=[3, 3, 3, 3, 3, 3, 3],
).frames[0]
export_to_video(video, "anyflow_far_v2v.mp4", fps=16)ملاحظات
- يُدمج التوجيه الحر من التصنيف (Classifier-free guidance) في نقاط التفتيش المنشورة، لذا لا يُنفَّذ مسار أمامي موجّه ثانٍ أثناء الاستدلال. حافظ على القيمة الافتراضية
guidance_scale=1.0ما لم تتطلب نقطة تفتيشك الخاصة غير ذلك. FlowMapEulerDiscreteSchedulerهو مُجدول عام الاستخدام. يمكنك إرفاقه بأي نقطة تحقق مُقطّرة لخريطة التدفق عبرfrom_pretrained(..., scheduler=FlowMapEulerDiscreteScheduler.from_config(...)).AnyFlowPipelineيستخدمAnyFlowTransformer3DModel(ثنائي الاتجاه). يستخدمAnyFlowFARPipelineAnyFlowFARTransformer3DModel، الذي يضيف تضمين بقع إطار مضغوط وقناع كتلة سببية FAR.- يُؤمَّن تحميل LoRA عبر
WanLoraLoaderMixin، وهو نفس الميكسين المستخدم في خطوط إنتاج Wan الأصلية. - بالنسبة لوصفات التدريب (تدريب تدفق الخريطة الأمامية والتقطير وفق السياسة)، يُرجى الرجوع إلى إطار عمل AnyFlow الأصلي للتدريب في
NVlabs/AnyFlow؛ التدريب خارج نطاق diffusers.
AnyFlowPipeline
فئة diffusers.AnyFlowPipeline
< source >( tokenizer: AutoTokenizertext_encoder: UMT5EncoderModeltransformer: AnyFlowTransformer3DModelvae: AutoencoderKLWanscheduler: FlowMapEulerDiscreteScheduler )
المعاملات
- tokenizer ([AutoTokenizer]) — مُقسِّم من google/umt5-xxl.
- text_encoder ([UMT5EncoderModel]) — مُشفِّر النص الخاص بـ google/umt5-xxl.
- transformer ([AnyFlowTransformer3DModel]) — محوّل ثلاثي الأبعاد لخريطة التدفق ثنائي الاتجاه.
- vae ([AutoencoderKLWan]) — نموذج VAE يقوم بتشفير/فك تشفير مقاطع الفيديو إلى تمثيلات كامنة ومنها.
- scheduler ([FlowMapEulerDiscreteScheduler]) —
أداة أخذ عينات خرائط التدفق. تُشغّل خط الأنابيب
scheduler.step(..., timestep, sample, r_timestep)في كل خطوة استنتاج.
خط أنابيب ثنائي الاتجاه لتوليد الفيديو من النص لنقاط التفتيش المُقطّرة عبر خرائط التدفق في AnyFlow، كما طُرحت في AnyFlow.
يتعلّم AnyFlow انتقالات بفواصل زمنية اختيارية بدلاً من التعيين الثابت
في نماذج الاتساق، مما يتيح تقييم نقطة تفتيش مُقطّرة واحدة عند 1 و2 و4 و8 و16… NFE دون
إعادة التدريب. تعمل هذه المسار على كامل متجه الفيديو في مسار ثنائي الاتجاه واحد؛ ولتوليد ذاتي التتابع (سببي) على مستوى المقاطع استخدم AnyFlowFARPipeline.
تتم عملية العينة باستخدام أويلر العادي بصيغة السرعة المتوسطة (z_r = z_t - (t - r) * u) دون إعادة الضجيج. تُدمج نقاط التفتيش التي أصدرتها NVIDIA التوجيه الحر من التصنيف في أوزان النموذج، لذا فإن الإعداد الافتراضي guidance_scale=1.0 هو الإعداد الموصى به.
يرث هذا النموذج من [DiffusionPipeline]. راجع توثيق الفئة الأصلية لمعرفة الطرق العامة المُنفَّذة لجميع خطوط الأنابيب (التنزيل، الحفظ، التشغيل على جهاز معين، إلخ).
__call__
< source >( prompt: typing.Union[str, typing.List[str]] = Nonevideo: typing.Optional[torch.Tensor] = Nonevideo_latents: typing.Optional[torch.Tensor] = Nonenegative_prompt: typing.Union[str, typing.List[str]] = Noneheight: int = 480width: int = 832num_frames: int = 81num_inference_steps: int = 50sigmas: typing.Optional[typing.List[float]] = Nonetimesteps: typing.Optional[typing.List[float]] = Noneguidance_scale: float = 1.0num_videos_per_prompt: typing.Optional[int] = 1generator: typing.Union[torch.Generator, typing.List[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: typing.Optional[str] = 'np'return_dict: bool = Trueattention_kwargs: typing.Optional[typing.Dict[str, typing.Any]] = Nonecallback_on_step_end: typing.Union[typing.Callable[[int, int, typing.Dict], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: typing.List[str] = ['latents']max_sequence_length: int = 512use_mean_velocity: bool = True ) → ~AnyFlowPipelineOutput or tuple
المعاملات
- prompt (
strأوList[str]، اختياري) — الموجّه أو الموجّهات التي توجّه توليد الفيديو. إذا لم يُعرَّف، فمرّرprompt_embedsبدلاً من ذلك. - video (
torch.Tensor، اختياري) — إطارات شرطية قبل VAE على شكل(B, T, C, H, W)ضمن[0, 1]. عند توفيرها، يقوم خط الأنابيب بتشفيرها باستخدام VAE ويُبقي البادئة الكامنة المقابلة ثابتة أثناء أخذ العينات. يتعارض معvideo_latents. - video_latents (
torch.Tensor، اختياري) — قيم VAE مُرمّزة مسبقًا بتنسيق AnyFlow(B, T_latent, C, H_latent, W_latent). يتخطى ترميز VAE على جانب خط الأنابيب. متنافٍ معvideo. - negative_prompt (
strأوList[str]، اختياري) — الموجّه أو الموجّهات التي يجب تجنّبها أثناء توليد الفيديو. يتم تجاهلها عند عدم استخدام التوجيه (guidance_scale < 1). - height (
int، القيمة الافتراضية480) — ارتفاع الفيديو المولّد بالبكسلات. - width (
int، القيمة الافتراضية832) — عرض الفيديو المولّد بالبكسلات. - num_frames (
int، القيمة الافتراضية81) — عدد الإطارات في الفيديو المولّد. يجب أن يحقق الشرط(num_frames - 1) % vae_scale_factor_temporal == 0. - num_inference_steps (
int، القيمة الافتراضية50) — عدد خطوات إزالة الضوضاء. تدعم نقاط التفتيش المُقطّرة من AnyFlow أخذ عينات بأي عدد من الخطوات، لذا فإن القيم المنخفضة مثل1أو2أو4أو8هي القيم المعتادة. يتم تجاهل هذا المعامل عند تقديمsigmasأوtimesteps. - sigmas (
List[float]، اختياري) — جدول سيجما مخصص لعينة أي خطوة، ضمن[0, 1]ومرتب من الضوضاء إلى النقاء. يحدد الطولnum_inference_stepsالفعّال؛ ويضيف المجدول قيمة سيجما النهائية0. - timesteps (
List[float]، اختياري) — جدول خطوات زمنية مخصص للعينة ذات الخطوات الحرة، بنفس وحداتself.scheduler.timesteps(أي مُقيّمة بواسطةnum_train_timesteps). يتعارض معsigmas. - guidance_scale (
float، القيمة الافتراضية1.0) — مقياس التوجيه الحر من التصنيف. نقاط التفتيش الخاصة بـ AnyFlow التي تم إصدارها تدمج CFG في الأوزان أثناء التدريب؛ حافظ على القيمة عند1.0ما لم تكن على علم بأن نقطة التفتيش الخاصة بك تتوقع خلاف ذلك. - num_videos_per_prompt (
int، اختياري، القيمة الافتراضية1) — عدد مقاطع الفيديو التي سيتم توليدها لكل موجه. - generator (
torch.GeneratorأوList[torch.Generator]، اختياري) —torch.Generatorلجعل التوليد حتميًا. - latents (
torch.Tensor، اختياري) — كائنات latents ضجيجية مُولّدة مسبقًا لاستخدامها كمدخلات. إذا لم تُوفَّر، يتم أخذ عينات من latents باستخدامgeneratorالمُقدَّم. - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية مُولَّدة مسبقًا. يمكن استخدامها لتعديل المدخلات النصية (مثلًا، وزن الموجه). إذا لم تُوفَّر، يتم توليد التضمينات منprompt. - negative_prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية سلبية مُولّدة مسبقًا. - output_type (
str، اختياري، الافتراضي"np") — صيغة المخرجات. أحد"pil"،"np"،"pt"، أو"latent". - return_dict (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان يجب إرجاعAnyFlowPipelineOutputبدلاً من tuple عادي. - attention_kwargs (
dict، اختياري) — قاموس kwargs يُمرَّر إلىAttentionProcessorإذا تم تحديده، كما هو معرَّف تحتself.processorفي diffusers.models.attention_processor. - callback_on_step_end (
Callable، اختياري) — دالة أوPipelineCallbackتُستدعى في نهاية كل خطوة من خطوات الاستدلال. راجعcallbacksللتفاصيل. - callback_on_step_end_tensor_inputs (
List[str]، اختياري، القيمة الافتراضية["latents"]) — مدخلات المصفوفات المُمرَّرة إلى الاستدعاء العكسي. يجب أن تكون مجموعة فرعية منself._callback_tensor_inputs. - max_sequence_length (
int، القيمة الافتراضية512) — الحد الأقصى لطول تسلسل مُشفِّر النص. يتم اقتطاع الأوامر الأطول من ذلك. - use_mean_velocity (
bool، القيمة الافتراضيةTrue) — عندما تكونTrue، يُشترط نموذج خريطة التدفق على كل من خطوة الزمن المصدرtوخطوة الزمن الهدفrللتنبؤ بسرعة متوسطة، بما يتوافق مع سلوك وقت التدريب. عطّل هذا الخيار لمحاكاة خطوات أويلر الخام (r = t).
يعيد
~AnyFlowPipelineOutput أو tuple
إذا كان return_dict هو True، يُعاد AnyFlowPipelineOutput، وإلا يُعاد tuple يكون عنصره الأول هو الفيديو المولّد.
دالة الاستدعاء call لخط الأنابيب pipeline الخاص بالتوليد.
أمثلة:
>>> import torch
>>> from diffusers import AnyFlowPipeline
>>> from diffusers.utils import export_to_video
>>> pipe = AnyFlowPipeline.from_pretrained(
... "nvidia/AnyFlow-Wan2.1-T2V-14B-Diffusers", torch_dtype=torch.bfloat16
... ).to("cuda")
>>> prompt = "A red panda eating bamboo in a forest, cinematic lighting"
>>> video = pipe(prompt, num_inference_steps=4, num_frames=33).frames[0]
>>> export_to_video(video, "anyflow_t2v.mp4", fps=16)encode_prompt
< source >( prompt: str | list[str]negative_prompt: str | list[str] | None = Nonedo_classifier_free_guidance: bool = Truenum_videos_per_prompt: int = 1prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 226device: typing.Optional[torch.device] = Nonedtype: typing.Optional[torch.dtype] = None )
المعاملات
- prompt (
strأوlist[str]، اختياري) — الموجّه الذي سيتم ترميزه - negative_prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي لا ينبغي استخدامها لتوجيه توليد الصورة. إذا لم يُعرَّف، يجب تمريرnegative_prompt_embedsبدلاً من ذلك. يتم تجاهله عند عدم استخدام التوجيه (أي يتم تجاهله إذا كانguidance_scaleأقل من1). - do_classifier_free_guidance (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان سيتم استخدام classifier free guidance أم لا. - num_videos_per_prompt (
int، اختياري، القيمة الافتراضية 1) — عدد الفيديوهات التي يجب توليدها لكل موجه. جهاز torch الذي سيتم وضع التضمينات الناتجة عليه - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية مُولَّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد تضمينات النص من معامل الإدخالprompt. - negative_prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية سلبية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد negative_prompt_embeds من معامل الإدخالnegative_prompt. - device — (
torch.device، اختياري): جهاز torch - dtype — (
torch.dtype، اختياري): نوع بيانات torch
يقوم بتشفير الموجه إلى حالات مخفية لمشفّر النص.
ترميز فيديو في فضاء البكسلات إلى التخطيط الكامن الخاص بـ AnyFlow.
يعكس هذا الدالة المساعدة المفردة المتبعة في خطوط أنابيب diffusers الأخرى (انظر WanImageToVideoPipeline.encode_image): حيث تجمع بين المعالجة المسبقة، وتشفير VAE، وتطبيع الكمون في استدعاء واحد. ترتيب المخرجات هو (B, T_latent, C, H, W)، وهو ما يتوقعه محول AnyFlow لإطارات الشروط.
AnyFlowFARPipeline
فئة diffusers.AnyFlowFARPipeline
< source >( tokenizer: AutoTokenizertext_encoder: UMT5EncoderModeltransformer: AnyFlowFARTransformer3DModelvae: AutoencoderKLWanscheduler: FlowMapEulerDiscreteScheduler )
المعاملات
- tokenizer ([AutoTokenizer]) — مُقسِّم من google/umt5-xxl.
- text_encoder ([UMT5EncoderModel]) — مُشفِّر النص الخاص بـ google/umt5-xxl.
- transformer ([AnyFlowFARTransformer3DModel]) — محوّل ثلاثي الأبعاد خرائط التدفق السببية FAR.
- vae ([AutoencoderKLWan]) — نموذج VAE يقوم بتشفير/فك تشفير مقاطع الفيديو إلى تمثيلات كامنة ومنها.
- scheduler ([FlowMapEulerDiscreteScheduler]) — أداة أخذ عينات Flow-map.
خط أنابيب سببي (مبني على FAR) لتحويل النص إلى فيديو / الصورة إلى فيديو / الفيديو إلى فيديو لنقاط التفتيش الخاصة بـ AnyFlow، كما تم تقديمه في AnyFlow.
تدير خط المعالجة حلقة أخذ عينات ذاتية التوليد على مستوى المقاطع: يُزال الضوضاء عن كل مقطع عبر خطوات خريطة التدفق مع الانتباه حصريًا إلى المقاطع السابقة عبر الانتباه السببي المتناثر على مستوى الكتلة، ويُعاد استخدام ذاكرة التخزين المؤقت لـ KV بين المقاطع.
يتم تحديد وضع المهمة (T2V / I2V / V2V) بناءً على حجة الشرط التي يتم تمريرها إلى __call__:
- كلٌّ من
video=Noneوvideo_latents=None— نص إلى فيديو خالص. video=<tensor of shape (B, T, C, H, W) in [0, 1] with T = 4n + 1>— إطارات الشرط قبل VAE؛ يقوم خط المعالجة بتشفيرها باستخدام VAE. مرّر فيديو بإطار واحد لـ I2V أو مقطع متعدد الإطارات لـ V2V.video_latents=<latent tensor of shape (B, T_latent, C, H_latent, W_latent)>— متغيرات مُرمّزة مسبقًا في تخطيط FAR (تتخطّى خطوة ترميز VAE).
يعتمد هيكل FAR على النسخة السببية من Wan2.1 التي قدمها FAR. تتم الاستدلال باستخدام Euler العادي بصيغة متوسط السرعة لكل شريحة دون إعادة الضجيج. يدعم نموذج واحد مُقطّر (distilled) كلًا من T2V / I2V / V2V بشكل مشترك.
يرث هذا النموذج من [DiffusionPipeline]. راجع توثيق الفئة الأصلية لمعرفة الطرق العامة المُنفَّذة لجميع خطوط الأنابيب (التنزيل، الحفظ، التشغيل على جهاز معين، إلخ).
__call__
< source >( prompt: typing.Union[str, typing.List[str]] = Nonevideo: typing.Optional[torch.Tensor] = Nonevideo_latents: typing.Optional[torch.Tensor] = Nonenegative_prompt: typing.Union[str, typing.List[str]] = Noneheight: int = 480width: int = 832num_frames: int = 81num_inference_steps: int = 50sigmas: typing.Optional[typing.List[float]] = Nonetimesteps: typing.Optional[typing.List[float]] = Noneguidance_scale: float = 1.0num_videos_per_prompt: typing.Optional[int] = 1generator: typing.Union[torch.Generator, typing.List[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneoutput_type: typing.Optional[str] = 'np'return_dict: bool = Trueattention_kwargs: typing.Optional[typing.Dict[str, typing.Any]] = Nonecallback_on_step_end: typing.Union[typing.Callable[[int, int, typing.Dict], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: typing.List[str] = ['latents']max_sequence_length: int = 512use_mean_velocity: bool = Trueuse_kv_cache: bool = Truechunk_partition: typing.Optional[typing.List[int]] = None ) → ~AnyFlowPipelineOutput or tuple
المعاملات
- prompt (
strأوList[str]، اختياري) — الموجّه أو الموجّهات التي توجّه توليد الفيديو. إذا لم يُعرَّف، فمرّرprompt_embedsبدلاً من ذلك. - video (
torch.Tensor، اختياري) — إطارات شرطية قبل VAE من الشكل(B, T, C, H, W)ضمن[0, 1](T = 4n + 1). عند تقديمها، يقوم خط الأنابيب بتشفيرها باستخدام VAE ويُبقي البادئة الكامنة المقابلة ثابتة أثناء أخذ العينات. متنافرة معvideo_latents. - video_latents (
torch.Tensor، اختياري) — قيم VAE مُرمّزة مسبقًا بتنسيق FAR(B, T_latent, C, H_latent, W_latent). يتخطى ترميز VAE على جانب خط الأنابيب. يتعارض معvideo. - negative_prompt (
strأوList[str]، اختياري) — الموجّه أو الموجّهات التي يجب تجنّبها أثناء توليد الفيديو. يتم تجاهلها عند عدم استخدام التوجيه (guidance_scale < 1). - height (
int، القيمة الافتراضية480) — ارتفاع الفيديو المولّد بالبكسلات. - width (
int، القيمة الافتراضية832) — عرض الفيديو المولّد بالبكسلات. - num_frames (
int، القيمة الافتراضية81) — عدد الإطارات في الفيديو المولّد. يجب أن يحقق الشرط(num_frames - 1) % vae_scale_factor_temporal == 0. - num_inference_steps (
int, defaults to50) — The number of denoising steps per chunk. Distilled AnyFlow-FAR checkpoints support any-step sampling (1, 2, 4, 8, …). Ignored whensigmasortimestepsis provided. - sigmas (
List[float]، اختياري) — جدول سيجما مخصص لعينة أي خطوة، ضمن[0, 1]ومرتب من الضوضاء إلى النقاء. يحدد الطولnum_inference_stepsالفعّال؛ ويضيف المجدول قيمة سيجما النهائية0. - timesteps (
List[float]، اختياري) — جدول خطوات زمنية مخصص للعينة ذات الخطوات الحرة، بنفس وحداتself.scheduler.timesteps(أي مُقيّمة بواسطةnum_train_timesteps). يتعارض معsigmas. - guidance_scale (
float، القيمة الافتراضية1.0) — مقياس التوجيه الحر من المصنّف. نقاط التفتيش الخاصة بـ AnyFlow التي تم إصدارها تدمج CFG في الأوزان أثناء التدريب؛ حافظ على القيمة عند1.0ما لم تتطلب نقطة التفتيش خلاف ذلك. - num_videos_per_prompt (
int، اختياري، القيمة الافتراضية1) — عدد مقاطع الفيديو التي سيتم توليدها لكل موجه. - generator (
torch.GeneratorأوList[torch.Generator]، اختياري) — مولّد يُستخدم لتبذير العينة. - latents (
torch.Tensor، اختياري) — كائنات latents ضجيجية مُولّدة مسبقًا. إذا لم تُقدَّم، يتم أخذ عينات من الكائنات latents باستخدامgeneratorالمُقدَّم. - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية مُولَّدة مسبقًا. إذا لم تُقدَّم، فسيتم توليد التضمينات منprompt. - negative_prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية سلبية مُولّدة مسبقًا. - output_type (
str، اختياري، الافتراضي"np") — صيغة الإخراج. أحد"pil"،"np"،"pt"، أو"latent". - return_dict (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان يجب إرجاعAnyFlowPipelineOutputبدلاً من tuple عادي. - attention_kwargs (
dict، اختياري) — قاموس kwargs يُمرَّر إلىAttentionProcessorإذا تم تحديده، كما هو معرَّف تحتself.processorفي diffusers.models.attention_processor. - callback_on_step_end (
Callable، اختياري) — دالة أوPipelineCallbackتُستدعى في نهاية كل خطوة من خطوات الاستدلال. - callback_on_step_end_tensor_inputs (
List[str]، اختياري، القيمة الافتراضية["latents"]) — مدخلات المصفوفات التي تُمرَّر إلى الاستدعاء العكسي. يجب أن تكون مجموعة فرعية منself._callback_tensor_inputs. - max_sequence_length (
int، القيمة الافتراضية512) — الحد الأقصى لطول تسلسل مُشفِّر النص. - use_mean_velocity (
bool، القيمة الافتراضيةTrue) — عندما تكونTrue، يُشترط على نموذج خريطة التدفق (flow-map) على كل من خطوة الزمن المصدرtوخطوة الزمن الهدفrلتوقع سرعة متوسطة. عطّل هذا الخيار لمحاكاة خطوات أويلر الخام (raw Euler stepping). - use_kv_cache (
bool، القيمة الافتراضيةTrue) — إعادة استخدام ذاكرة KV الخاصة بانتباه FAR عبر المقاطع السببية. عطّلها فقط لأغراض التصحيح. - chunk_partition (
List[int]، اختياري) — عدد الإطارات لكل جزء. القيمة الافتراضية هيself.transformer.config.chunk_partition(مطابقة لنقاط التفتيش المُصدَرة المكوّنة من 81 إطارًا). عند تغييرnum_frames، قدّمchunk_partitionيكون مجموعها(num_frames - 1) // vae_scale_factor_temporal + 1.
يعيد
~AnyFlowPipelineOutput أو tuple
إذا كان return_dict هو True، يُعاد AnyFlowPipelineOutput، وإلا يُعاد tuple يكون عنصره الأول هو الفيديو المولّد.
دالة الاستدعاء call لخط الأنابيب pipeline الخاص بالتوليد.
أمثلة:
>>> import numpy as np
>>> import torch
>>> from diffusers import AnyFlowFARPipeline
>>> from diffusers.utils import export_to_video, load_image
>>> pipe = AnyFlowFARPipeline.from_pretrained(
... "nvidia/AnyFlow-FAR-Wan2.1-1.3B-Diffusers", torch_dtype=torch.bfloat16
... ).to("cuda")
>>> # Single-frame I2V: wrap the conditioning image as a (1, 1, 3, H, W) tensor in [0, 1].
>>> first_frame = load_image("path/to/first_frame.png").resize((832, 480))
>>> arr = np.asarray(first_frame).astype("float32") / 255.0
>>> context = torch.from_numpy(arr).permute(2, 0, 1).unsqueeze(0).unsqueeze(1).to("cuda")
>>> video = pipe(
... prompt="a cat walks across a sunlit lawn",
... video=context,
... num_inference_steps=4,
... num_frames=81,
... ).frames[0]
>>> export_to_video(video, "anyflow_far.mp4", fps=16)encode_prompt
< source >( prompt: str | list[str]negative_prompt: str | list[str] | None = Nonedo_classifier_free_guidance: bool = Truenum_videos_per_prompt: int = 1prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int = 226device: typing.Optional[torch.device] = Nonedtype: typing.Optional[torch.dtype] = None )
المعاملات
- prompt (
strأوlist[str]، اختياري) — الموجّه الذي سيتم ترميزه - negative_prompt (
strأوlist[str]، اختياري) — الموجّه أو الموجّهات التي لا ينبغي استخدامها لتوجيه توليد الصورة. إذا لم يُعرَّف، يجب تمريرnegative_prompt_embedsبدلاً من ذلك. يتم تجاهله عند عدم استخدام التوجيه (أي يتم تجاهله إذا كانguidance_scaleأقل من1). - do_classifier_free_guidance (
bool، اختياري، القيمة الافتراضيةTrue) — ما إذا كان سيتم استخدام classifier free guidance أم لا. - num_videos_per_prompt (
int، اختياري، القيمة الافتراضية 1) — عدد الفيديوهات التي يجب توليدها لكل موجه. جهاز torch الذي سيتم وضع التضمينات الناتجة عليه - prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية مُولَّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد تضمينات النص من معامل الإدخالprompt. - negative_prompt_embeds (
torch.Tensor، اختياري) — تضمينات نصية سلبية مُولّدة مسبقًا. يمكن استخدامها لتعديل مدخلات النص بسهولة، مثلًا وزن الموجه. إذا لم تُقدَّم، فسيتم توليد negative_prompt_embeds من معامل الإدخالnegative_prompt. - device — (
torch.device، اختياري): جهاز torch - dtype — (
torch.dtype، اختياري): نوع بيانات torch
يقوم بتشفير الموجه إلى حالات مخفية لمشفّر النص.
ترميز فيديو في فضاء البكسلات إلى التخطيط الكامن الخاص بـ AnyFlow.
يعكس هذا الدالة المساعدة المفردة المتبعة في خطوط أنابيب diffusers الأخرى (انظر WanImageToVideoPipeline.encode_image): حيث تجمع بين المعالجة المسبقة، وتشفير VAE، وتطبيع الكمون في استدعاء واحد. ترتيب المخرجات هو (B, T_latent, C, H, W)، وهو ما يتوقعه محول AnyFlow لإطارات الشروط.
AnyFlowPipelineOutput
فئة diffusers.pipelines.anyflow.pipeline_output.AnyFlowPipelineOutput
< source >( frames: Tensor )
المعاملات
- frames (
torch.Tensorأوnp.ndarrayأو قائمة[قائمة[PIL.Image.Image]]) — قائمة من مخرجات الفيديو - يمكن أن تكون قائمة متداخلة بطولbatch_size,حيث تحتوي كل قائمة فرعية على سلاسل صور PIL منزوعة الضوضاء بطولnum_frames.كما يمكن أن تكون مصفوفة NumPy أو متجه Torch بشكل(batch_size, num_frames, channels, height, width).
فئة الإخراج لخطوط أنابيب AnyFlow.