Buckets:
| # AnyFlow | |
| [AnyFlow: Any-Step Video Diffusion Model with On-Policy Flow Map Distillation](https://huggingface.co/papers/2605.13724) от NVIDIA, Национального университета Сингапура и Массачусетского технологического института, авторы: Yuchao Gu, Guian Fang, Yuxin Jiang, Weijia Mao, Song Han, Han Cai, Mike Zheng Shou. | |
| > **Кратко:** AnyFlow — это первый фреймворк видео-диффузии с произвольным числом шагов, построенный на flow maps, который позволяет одной модели (двусторонней или каузальной) адаптироваться к произвольным бюджетам инференса. | |
| *Модели согласованности значительно продвинули генерацию видео за малое число шагов. Однако их качество часто снижается в моделях диффузии видео с произвольным числом шагов из-за формулировки на основе неподвижных точек. Чтобы преодолеть это ограничение, мы представляем AnyFlow — первый фреймворк дистилляции диффузионных моделей видео с произвольным числом шагов, построенный на потоковых картах. Вместо обучения только отображения z_t → z_0, AnyFlow обучает переходы z_t → z_r на произвольных временных интервалах, что позволяет одной модели адаптироваться к разным бюджетам вычислений при инференсе. Мы разработали улучшенный рецепт обучения прямой потоковой карты, который дообучает предобученные диффузионные модели видео до моделей потоковых карт, и внедрили обратную симуляцию потоковой карты (Flow Map Backward Simulation) для обеспечения дистилляции on-policy для моделей потоковых карт. Обширные эксперименты на архитектурах с двунаправленным и каузальным вниманием, в масштабах от 1,3B до 14B параметров, на задачах генерации видео по тексту и по изображению показывают, что AnyFlow превосходит базовые решения на основе согласованности, сохраняя высокую точность и гибкость выборки при различных бюджетах шагов.* | |
| Пайплайны AnyFlow были предоставлены командой AnyFlow. Исходный код доступен на [GitHub](https://github.com/NVlabs/AnyFlow), страница проекта находится по адресу [nvlabs.github.io/AnyFlow](https://nvlabs.github.io/AnyFlow), а предобученные модели можно найти в коллекции [nvidia/anyflow](https://huggingface.co/collections/nvidia/anyflow) на Hugging Face. | |
| Доступные модели: | |
| | Чекпоинт | Backbone | Описание | | |
| |---|---|---| | |
| | [`nvidia/AnyFlow-Wan2.1-T2V-1.3B-Diffusers`](https://huggingface.co/nvidia/AnyFlow-Wan2.1-T2V-1.3B-Diffusers) | Wan2.1 1.3B | Двунаправленный T2V | | |
| | [`nvidia/AnyFlow-Wan2.1-T2V-14B-Diffusers`](https://huggingface.co/nvidia/AnyFlow-Wan2.1-T2V-14B-Diffusers) | Wan2.1 14B | Двунаправленный T2V | | |
| | [`nvidia/AnyFlow-FAR-Wan2.1-1.3B-Diffusers`](https://huggingface.co/nvidia/AnyFlow-FAR-Wan2.1-1.3B-Diffusers) | FAR + Wan2.1 1.3B | Causal T2V / I2V / V2V | | |
| | [`nvidia/AnyFlow-FAR-Wan2.1-14B-Diffusers`](https://huggingface.co/nvidia/AnyFlow-FAR-Wan2.1-14B-Diffusers) | FAR + Wan2.1 14B | Causal T2V / I2V / V2V | | |
| > [!TIP] | |
| > `AnyFlowPipeline` предназначена для двунаправленных диффузионных моделей в генерации видео по тексту (T2V). `AnyFlowFARPipeline` — это причинная диффузионная модель, работающая по блокам, которая поддерживает генерацию видео по тексту (T2V), генерацию видео по изображению (I2V) и продолжение видео (V2V). | |
| ### Генерация с AnyFlow (двусторонний T2V) | |
| ```py | |
| 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) | |
| Causal pipeline выбирает между T2V / I2V / V2V с помощью аргумента ``video`` (или ``video_latents``): опустите оба для обычного text-to-video, либо передайте ``video=<tensor>`` формы ``(B, T, C, H, W)`` в диапазоне ``[0, 1]`` с ``T = 4n + 1``, чтобы использовать существующие кадры как условие. Для I2V используйте один кадр условия, а для продолжения V2V — более длинный клип. Если у вас уже есть предварительно закодированные латенты в раскладке модели, передайте их через ``video_latents=<tensor>``, чтобы пропустить кодирование VAE. ``video`` и ``video_latents`` взаимоисключающи. | |
| > [!IMPORTANT] | |
| > Опубликованные контрольные точки содержат в конфигурации трансформера параметр `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`. | |
| ```py | |
| 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) | |
| ``` | |
| ```py | |
| 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) | |
| ``` | |
| ```py | |
| 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` является универсальным. Вы можете подключить его к любому чекпоинту, дистиллированному по flow-map, с помощью `from_pretrained(..., scheduler=FlowMapEulerDiscreteScheduler.from_config(...))`. | |
| - `AnyFlowPipeline` использует [`AnyFlowTransformer3DModel`](../models/anyflow_transformer3d) (двусторонний). `AnyFlowFARPipeline` использует [`AnyFlowFARTransformer3DModel`](../models/anyflow_far_transformer3d), который добавляет patch-эмбеддинг сжатых кадров и каузальную блок-маску FAR. | |
| - Загрузка LoRA поддерживается через `WanLoraLoaderMixin`, тот же миксин, который используется в исходных пайплайнах Wan. | |
| - Для рецептов обучения (обучение forward flow-map и дистилляция on-policy) обратитесь к исходному фреймворку обучения AnyFlow по адресу [`NVlabs/AnyFlow`](https://github.com/NVlabs/AnyFlow); обучение не входит в область применения diffusers. | |
| ## AnyFlowPipeline[[diffusers.AnyFlowPipeline]] | |
| #### diffusers.AnyFlowPipeline[[diffusers.AnyFlowPipeline]] | |
| ```python | |
| diffusers.AnyFlowPipeline(tokenizer: AutoTokenizer, text_encoder: UMT5EncoderModel, transformer: AnyFlowTransformer3DModel, vae: AutoencoderKLWan, scheduler: FlowMapEulerDiscreteScheduler) | |
| ``` | |
| [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/anyflow/pipeline_anyflow.py#L80) | |
| **Параметры:** | |
| tokenizer ([*AutoTokenizer*]) : Токенизатор из [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). | |
| text_encoder ([*UMT5EncoderModel*]) : текстовый энкодер [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). | |
| transformer ([*AnyFlowTransformer3DModel*]) : Двусторонний flow-map 3D-трансформер. | |
| vae ([*AutoencoderKLWan*]) : VAE, кодирующий/декодирующий видео в латентные представления и обратно. | |
| scheduler ([*FlowMapEulerDiscreteScheduler*]) : сэмплер flow-map. Пайплайн вызывает `scheduler.step(..., timestep, sample, r_timestep)` на каждом шаге инференса. | |
| Пайплайн двунаправленной генерации видео из текста для дистиллированных чекпоинтов flow-map AnyFlow, представленный в [AnyFlow](https://huggingface.co/papers/2605.13724). | |
| AnyFlow learns arbitrary-interval transitions \\(z_t \to z_r\\) rather than the fixed \\(z_t \to z_0\\) mapping of consistency models, so a single distilled checkpoint can be evaluated at 1, 2, 4, 8, 16... NFE without retraining. This pipeline operates over the full video tensor in one bidirectional pass; for chunk-wise autoregressive (causal) generation use `AnyFlowFARPipeline`. | |
| Сэмплирование выполняется простым методом Эйлера в форме средней скорости (`z_r = z_t - (t - r) * u`) без повторного добавления шума. Опубликованные чекпоинты NVIDIA включают классификаторно-свободное наведение (classifier-free guidance) в весах модели, поэтому рекомендуемое значение по умолчанию — `guidance_scale=1.0`. | |
| Эта модель наследуется от [*DiffusionPipeline*]. См. документацию родительского класса для общих методов, реализованных для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.). | |
| #### __call__[[diffusers.AnyFlowPipeline.__call__]] | |
| ```python | |
| __call__(prompt: typing.Union[str, typing.List[str]] = None, video: typing.Optional[torch.Tensor] = None, video_latents: typing.Optional[torch.Tensor] = None, negative_prompt: typing.Union[str, typing.List[str]] = None, height: int = 480, width: int = 832, num_frames: int = 81, num_inference_steps: int = 50, sigmas: typing.Optional[typing.List[float]] = None, timesteps: typing.Optional[typing.List[float]] = None, guidance_scale: float = 1.0, num_videos_per_prompt: typing.Optional[int] = 1, generator: typing.Union[torch.Generator, typing.List[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, output_type: typing.Optional[str] = 'np', return_dict: bool = True, attention_kwargs: typing.Optional[typing.Dict[str, typing.Any]] = None, callback_on_step_end: typing.Union[typing.Callable[[int, int, typing.Dict], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = None, callback_on_step_end_tensor_inputs: typing.List[str] = ['latents'], max_sequence_length: int = 512, use_mean_velocity: bool = True) | |
| ``` | |
| [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/anyflow/pipeline_anyflow.py#L380) | |
| **Параметры:** | |
| prompt (`str` или `List[str]`, *необязательный*) : Промпт или промпты для управления генерацией видео. Если не задан, передайте вместо него `prompt_embeds`. | |
| video (`torch.Tensor`, *optional*) : Предварительные кадры для условного кодирования до 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`) : Масштаб classifier-free guidance. Опубликованные чекпоинты AnyFlow интегрируют CFG в веса во время обучения; оставляйте значение `1.0`, если вы не уверены, что ваш чекпоинт ожидает иное. | |
| num_videos_per_prompt (`int`, *необязательный*, по умолчанию `1`) : Количество видео, генерируемых на один запрос. | |
| generator (`torch.Generator` или `List[torch.Generator]`, *необязательный*) : [`torch.Generator`](https://pytorch.org/docs/stable/generated/torch.Generator.html) для обеспечения детерминированности генерации. | |
| latents (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные зашумленные латенты для использования в качестве входных данных. Если не указаны, латенты выбираются из переданного `generator`. | |
| prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для корректировки текстовых входных данных (например, взвешивания промпта). Если не указаны, эмбеддинги генерируются из `prompt`. | |
| negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. | |
| output_type (`str`, *необязательный*, по умолчанию `"np"`) : Формат вывода. Одно из значений `"pil"`, `"np"`, `"pt"` или `"latent"`. | |
| return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли `AnyFlowPipelineOutput` вместо обычного кортежа. | |
| attention_kwargs (`dict`, *необязательный*) : Словарь kwargs, который при указании передается в `AttentionProcessor`, определенный в `self.processor` в [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). | |
| callback_on_step_end (`Callable`, *необязательный*) : функция или `PipelineCallback`, вызываемая в конце каждого шага инференса. Подробности см. в [`callbacks`](../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`, модель flow-map использует в качестве условий и исходный шаг `t`, и целевой шаг `r` для предсказания средней скорости, что соответствует поведению при обучении. Отключите, чтобы воспроизвести чистое интегрирование Эйлера (`r = t`). | |
| **Возвращает:** `~AnyFlowPipelineOutput` или `tuple` | |
| Если `return_dict` равно `True`, возвращается `AnyFlowPipelineOutput`, иначе — `tuple`, первым элементом которого является сгенерированное видео. | |
| Функция вызова конвейера для генерации. | |
| Примеры: | |
| ```python | |
| >>> 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[[diffusers.AnyFlowPipeline.encode_prompt]] | |
| ```python | |
| encode_prompt(prompt: str | list[str], negative_prompt: str | list[str] | None = None, do_classifier_free_guidance: bool = True, num_videos_per_prompt: int = 1, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, max_sequence_length: int = 226, device: typing.Optional[torch.device] = None, dtype: typing.Optional[torch.dtype] = None) | |
| ``` | |
| [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/anyflow/pipeline_anyflow.py#L180) | |
| **Параметры:** | |
| 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`, *optional*, по умолчанию 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 dtype | |
| Кодирует промпт в скрытые состояния текстового энкодера. | |
| #### encode_video[[diffusers.AnyFlowPipeline.encode_video]] | |
| ```python | |
| encode_video(video: Tensor, height: int, width: int) | |
| ``` | |
| [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/anyflow/pipeline_anyflow.py#L360) | |
| Кодирует видео в пиксельном пространстве в латентное представление AnyFlow. | |
| Отражает конвенцию с одним хелпером, используемую в других пайплайнах diffusers (см. `WanImageToVideoPipeline.encode_image`): объединяет предобработку, кодирование VAE и нормализацию латентов в один вызов. Формат вывода — `(B, T_latent, C, H, W)`, что соответствует ожиданиям трансформера AnyFlow для кадров, задающих условия. | |
| ## AnyFlowFARPipeline[[diffusers.AnyFlowFARPipeline]] | |
| #### diffusers.AnyFlowFARPipeline[[diffusers.AnyFlowFARPipeline]] | |
| ```python | |
| diffusers.AnyFlowFARPipeline(tokenizer: AutoTokenizer, text_encoder: UMT5EncoderModel, transformer: AnyFlowFARTransformer3DModel, vae: AutoencoderKLWan, scheduler: FlowMapEulerDiscreteScheduler) | |
| ``` | |
| [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/anyflow/pipeline_anyflow_far.py#L92) | |
| **Параметры:** | |
| tokenizer ([*AutoTokenizer*]) : Токенизатор из [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). | |
| text_encoder ([*UMT5EncoderModel*]) : текстовый энкодер [google/umt5-xxl](https://huggingface.co/google/umt5-xxl). | |
| transformer ([*AnyFlowFARTransformer3DModel*]) : 3D-трансформер FAR с причинно-следственной flow-map. | |
| vae ([*AutoencoderKLWan*]) : VAE, кодирующий/декодирующий видео в латентные представления и обратно. | |
| scheduler ([*FlowMapEulerDiscreteScheduler*]) : сэмплер flow-map. | |
| Causal Пайплайн (на основе FAR) для генерации видео из текста / из изображения / из видео для чекпоинтов AnyFlow, представленный в [AnyFlow](https://huggingface.co/papers/2605.13724). | |
| Пайплайн управляет поштучным авто регрессионным циклом сэмплирования: каждый чанк денуизируется с помощью шагов flow-map, при этом внимание обращается только к предыдущим чанкам через блочно-разреженное каузальное внимание, а промежуточный KV-кэш переиспользуется между чанками. | |
| Режим задачи (T2V / I2V / V2V) определяется тем, какой аргумент условного контекста передается в `__call__`: | |
| - и `video=None`, и `video_latents=None` — чистый текст-в-видео. | |
| - `video=&lt;tensor of shape (B, T, C, H, W) in [0, 1] with T = 4n + 1>` — кадры для условного кодирования до VAE; пайплайн кодирует их с помощью VAE. Передайте видео с одним кадром для I2V или клип с несколькими кадрами для V2V. | |
| - `video_latents=&lt;latent tensor of shape (B, T_latent, C, H_latent, W_latent)>` — уже закодированные латенты в формате FAR (пропускает этап кодирования VAE). | |
| Базовая архитектура FAR представляет собой каузальный вариант Wan2.1, представленный в [FAR](https://huggingface.co/papers/2503.19325). Инференс выполняется с помощью простого метода Эйлера в форме средней скорости для каждого чанка без повторного добавления шума. Совместная поддержка T2V / I2V / V2V обеспечивается одной дистиллированной моделью. | |
| Эта модель наследуется от [*DiffusionPipeline*]. См. документацию родительского класса для общих методов, реализованных для всех пайплайнов (загрузка, сохранение, запуск на конкретном устройстве и т. д.). | |
| #### __call__[[diffusers.AnyFlowFARPipeline.__call__]] | |
| ```python | |
| __call__(prompt: typing.Union[str, typing.List[str]] = None, video: typing.Optional[torch.Tensor] = None, video_latents: typing.Optional[torch.Tensor] = None, negative_prompt: typing.Union[str, typing.List[str]] = None, height: int = 480, width: int = 832, num_frames: int = 81, num_inference_steps: int = 50, sigmas: typing.Optional[typing.List[float]] = None, timesteps: typing.Optional[typing.List[float]] = None, guidance_scale: float = 1.0, num_videos_per_prompt: typing.Optional[int] = 1, generator: typing.Union[torch.Generator, typing.List[torch.Generator], NoneType] = None, latents: typing.Optional[torch.Tensor] = None, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, output_type: typing.Optional[str] = 'np', return_dict: bool = True, attention_kwargs: typing.Optional[typing.Dict[str, typing.Any]] = None, callback_on_step_end: typing.Union[typing.Callable[[int, int, typing.Dict], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = None, callback_on_step_end_tensor_inputs: typing.List[str] = ['latents'], max_sequence_length: int = 512, use_mean_velocity: bool = True, use_kv_cache: bool = True, chunk_partition: typing.Optional[typing.List[int]] = None) | |
| ``` | |
| [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/anyflow/pipeline_anyflow_far.py#L448) | |
| **Параметры:** | |
| prompt (`str` или `List[str]`, *необязательный*) : Промпт или промпты для управления генерацией видео. Если не задан, передайте вместо него `prompt_embeds`. | |
| video (`torch.Tensor`, *optional*) : кадры для предварительного обусловливания до 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`, по умолчанию `50`) : Количество шагов денойзинга на чанк. Дистиллированные чекпоинты AnyFlow-FAR поддерживают сэмплирование с любым числом шагов (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`) : Масштаб classifier-free guidance. Опубликованные чекпоинты AnyFlow интегрируют CFG в веса во время обучения; оставляйте значение `1.0`, если чекпоинт не требует иного. | |
| num_videos_per_prompt (`int`, *необязательный*, по умолчанию `1`) : Количество видео, генерируемых на один запрос. | |
| generator (`torch.Generator` или `List[torch.Generator]`, *необязательный*) : Генератор, используемый для задания начального значения (seed) при выборке. | |
| latents (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные зашумленные латенты. Если не указаны, латенты выбираются из переданного `generator`. | |
| prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные текстовые эмбеддинги. Если не указаны, эмбеддинги генерируются из `prompt`. | |
| negative_prompt_embeds (`torch.Tensor`, *необязательный*) : Предварительно сгенерированные отрицательные текстовые эмбеддинги. | |
| output_type (`str`, *необязательный*, по умолчанию `"np"`) : Формат вывода. Одно из значений `"pil"`, `"np"`, `"pt"` или `"latent"`. | |
| return_dict (`bool`, *необязательный*, по умолчанию `True`) : Возвращать ли `AnyFlowPipelineOutput` вместо обычного кортежа. | |
| attention_kwargs (`dict`, *необязательный*) : Словарь kwargs, который при указании передается в `AttentionProcessor`, определенный в `self.processor` в [diffusers.models.attention_processor](https://github.com/huggingface/diffusers/blob/main/src/diffusers/models/attention_processor.py). | |
| 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` для предсказания средней скорости. Отключите, чтобы воспроизвести чистое интегрирование Эйлера. | |
| 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`, первым элементом которого является сгенерированное видео. | |
| Функция вызова конвейера для генерации. | |
| Примеры: | |
| ```python | |
| >>> 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[[diffusers.AnyFlowFARPipeline.encode_prompt]] | |
| ```python | |
| encode_prompt(prompt: str | list[str], negative_prompt: str | list[str] | None = None, do_classifier_free_guidance: bool = True, num_videos_per_prompt: int = 1, prompt_embeds: typing.Optional[torch.Tensor] = None, negative_prompt_embeds: typing.Optional[torch.Tensor] = None, max_sequence_length: int = 226, device: typing.Optional[torch.device] = None, dtype: typing.Optional[torch.dtype] = None) | |
| ``` | |
| [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/anyflow/pipeline_anyflow_far.py#L197) | |
| **Параметры:** | |
| 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`, *optional*, по умолчанию 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 dtype | |
| Кодирует промпт в скрытые состояния текстового энкодера. | |
| #### encode_video[[diffusers.AnyFlowFARPipeline.encode_video]] | |
| ```python | |
| encode_video(video: Tensor, height: int, width: int) | |
| ``` | |
| [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/anyflow/pipeline_anyflow_far.py#L380) | |
| Кодирует видео в пиксельном пространстве в латентное представление AnyFlow. | |
| Отражает конвенцию с одним хелпером, используемую в других пайплайнах diffusers (см. `WanImageToVideoPipeline.encode_image`): объединяет предобработку, кодирование VAE и нормализацию латентов в один вызов. Формат вывода — `(B, T_latent, C, H, W)`, что соответствует ожиданиям трансформера AnyFlow для кадров, задающих условия. | |
| ## AnyFlowPipelineOutput[[diffusers.pipelines.anyflow.pipeline_output.AnyFlowPipelineOutput]] | |
| #### diffusers.pipelines.anyflow.pipeline_output.AnyFlowPipelineOutput[[diffusers.pipelines.anyflow.pipeline_output.AnyFlowPipelineOutput]] | |
| ```python | |
| diffusers.pipelines.anyflow.pipeline_output.AnyFlowPipelineOutput(frames: Tensor) | |
| ``` | |
| [Источник](https://github.com/huggingface/diffusers/blob/main/src/diffusers/pipelines/anyflow/pipeline_output.py#L23) | |
| **Параметры:** | |
| frames (`torch.Tensor`, `np.ndarray` или list[list[PIL.Image.Image]]) : список видеовыходов — может представлять собой вложенный список длины `batch_size,` где каждый подсписок содержит последовательности денойзированных изображений PIL длины `num_frames.` Также может быть массивом NumPy или тензором Torch формы `(batch_size, num_frames, channels, height, width)`. | |
| Класс вывода для конвейеров AnyFlow. | |
Xet Storage Details
- Size:
- 46.6 kB
- Xet hash:
- ee50a168d285ff0d22aee9cedfb1499b7690074a66297bc926c1d383ceaaae01
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.