# PAN 2

PAN2 — это базовая модель мира, которая моделирует эволюцию сцены в соответствии с планом действий и движений камеры, привязанным ко времени. Её генеративный симулятор на 29 млрд параметров представляет собой двухпоточный мультимодальный диффузионный трансформер, интегрированный здесь; при этом [базовая модель рассуждений](https://huggingface.co/IFM/PAN2#reasoning-backbone), генерирующая его промпты, не интегрирована.

PAN 2 интегрируется только в виде блоков [Modular Diffusers](../../modular_diffusers/overview). [PAN2Blocks](/docs/diffusers/v0.43.0/ru/api/pipelines/pan2#diffusers.PAN2Blocks) поддерживает два рабочих процесса:

| Рабочий процесс | Входы |
|---|---|
| `t2v` | `prompt` |
| `i2v` | `prompt`, `image` |

```py
import torch
from diffusers import ModularPipeline
from diffusers.utils import export_to_video, load_image

pipe = ModularPipeline.from_pretrained("IFM/PAN2")
pipe.load_components(dtype=torch.bfloat16)
pipe.to("cuda")

prompt = "A red fox trots through fresh snow in a pine forest at dawn."

video = pipe(prompt=prompt, generator=torch.Generator().manual_seed(0), output="videos")[0]
export_to_video(video, "pan2_t2v.mp4", fps=24)

image = load_image("path/to/first_frame.png")
video = pipe(prompt=prompt, image=image, generator=torch.Generator().manual_seed(0), output="videos")[0]
export_to_video(video, "pan2_i2v.mp4", fps=24)
```

Настройка classifier-free guidance выполняется на guider (`guidance_scale=2.5` по умолчанию):

```py
pipe.update_components(guider=pipe.guider.new(guidance_scale=5.0))
```

Каждый вызов принимает один промпт, который кодируется без дополнения (padding). Поэтому трансформеру никогда не нужна маска внимания, и доступны все [бэкенды внимания](../../optimization/attention_backends):

```py
pipe.transformer.set_attention_backend("flash_hub")  # FlashAttention-2
```

## Проверщик безопасности

PAN 2 выполняет проверку guardrails по промпту перед генерацией и по каждому сгенерированному видео после неё, а заблокированный промпт или видео вызывает `ValueError`. Проверки включены по умолчанию, а `load_components()` загружает guardrails, для которых требуется пакет [PAN 2 guardrail](https://github.com/ifm-ai/pan2-guardrail):

```bash
pip install git+https://github.com/ifm-ai/pan2-guardrail
```

## Параллелизм контекста

[PAN2Transformer3DModel](/docs/diffusers/v0.43.0/ru/api/models/pan2_transformer3d#diffusers.PAN2Transformer3DModel) поддерживает [context parallelism](../../optimization/context_parallelism). Количество токенов текста и видео обычно не делится нацело на число устройств (число токенов текста зависит от промпта), поэтому для инференса используйте `ulysses_anything` или `ring_anything`. Обычные `ulysses_degree` / `ring_degree`, например для обучения, требуют, чтобы оба количества токенов делились нацело на размер контекстного параллелизма.

```py
# torchrun --nproc_per_node=2 pan2_context_parallel.py
import torch
import torch.distributed as dist
from diffusers import ContextParallelConfig, ModularPipeline

dist.init_process_group("nccl")
rank = dist.get_rank()
torch.cuda.set_device(rank)

pipe = ModularPipeline.from_pretrained("IFM/PAN2")
pipe.load_components(dtype=torch.bfloat16)
pipe.to(f"cuda:{rank}")
pipe.transformer.enable_parallelism(config=ContextParallelConfig(ulysses_degree=2, ulysses_anything=True))

video = pipe(prompt="A red fox trots through fresh snow.", generator=torch.Generator().manual_seed(0), output="videos")[0]
dist.destroy_process_group()
```

## PAN2ModularPipeline[[diffusers.PAN2ModularPipeline]]

#### diffusers.PAN2ModularPipeline[[diffusers.PAN2ModularPipeline]]

```python
diffusers.PAN2ModularPipeline(blocks: diffusers.modular_pipelines.modular_pipeline.ModularPipelineBlocks | None = None, pretrained_model_name_or_path: str | os.PathLike | None = None, components_manager: diffusers.modular_pipelines.components_manager.ComponentsManager | None = None, collection: str | None = None, workflow: str | None = None, modular_config_dict: dict[str, typing.Any] | None = None, config_dict: dict[str, typing.Any] | None = None, **kwargs)
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/modular_pipelines/pan2/modular_pipeline.py#L42)

Модульный ModularPipeline для PAN 2: генерация видео из текста и генерация видео из изображения по первому кадру.

```py
import torch
from diffusers import ModularPipeline

pipe = ModularPipeline.from_pretrained("IFM/PAN2")
pipe.load_components(dtype=torch.bfloat16)
```

#### check_safety_checker_loaded[[diffusers.PAN2ModularPipeline.check_safety_checker_loaded]]

```python
check_safety_checker_loaded()
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/modular_pipelines/pan2/modular_pipeline.py#L103)

Вызвать исключение, если проверки включены, но защитный механизм PAN 2 не загружен.

#### disable_safety_checker[[diffusers.PAN2ModularPipeline.disable_safety_checker]]

```python
disable_safety_checker()
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/modular_pipelines/pan2/modular_pipeline.py#L118)

Отключите проверки промпта и видео на свой страх и риск.

#### enable_safety_checker[[diffusers.PAN2ModularPipeline.enable_safety_checker]]

```python
enable_safety_checker()
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/modular_pipelines/pan2/modular_pipeline.py#L97)

Проверьте промпт и сгенерированные видео с использованием защитного механизма PAN 2.

## PAN2Blocks[[diffusers.PAN2Blocks]]

#### diffusers.PAN2Blocks[[diffusers.PAN2Blocks]]

```python
diffusers.PAN2Blocks()
```

[Источник](https://github.com/huggingface/diffusers/blob/v0.43.0/src/diffusers/modular_pipelines/pan2/modular_blocks_pan2.py#L251)

Модульные блоки конвейера для генерации видео из текста и из изображения с PAN 2.

Поддерживаемые рабочие процессы:
- `t2v`: требуется `prompt`
- `i2v`: требуется `prompt`, `image`

Компоненты: text_encoder (`Qwen3_5TextModel`) tokenizer (`Qwen2Tokenizer`) safety_checker (`PAN2SafetyChecker`) vae (`AutoencoderKLWan`) video_processor (`VideoProcessor`) scheduler (`FlowMatchEulerDiscreteScheduler`) transformer (`PAN2Transformer3DModel`) guider (`ClassifierFreeGuidance`)

Конфигурации: enable_safety_checker (по умолчанию: True)

Входные данные: prompt (`str`): Промпт для управления генерацией, одна строка. negative_prompt (`str`, *необязательный*): Промпт, который не должен направлять генерацию, одна строка. Если для управления требуется негативный промпт, а передан пустой или не передан вовсе, используется негативный промпт по умолчанию для PAN 2, диапазоны времени в котором устанавливаются равными длительности клипа. max_sequence_length (`int`, *необязательный*, по умолчанию 1536): Максимальная длина последовательности для кодирования промпта. num_frames (`int`, *необязательный*, по умолчанию 313): Количество кадров видео для генерации, вида `4 * n + 1`. fps (`float`, *необязательный*, по умолчанию 24.0): Частота кадров видео, которая определяет его длительность в негативном промпте по умолчанию. image (`Image`, *необязательный*): Первый кадр, одно изображение. height (`int`, *необязательный*): Высота генерируемого видео в пикселях, по умолчанию 704. width (`int`, *необязательный*): Ширина генерируемого видео в пикселях, по умолчанию 1248. num_videos_per_prompt (`int`, *необязательный*, по умолчанию 1): Количество видео для генерации на один промпт. image_latents (`Tensor`, *необязательный*): Нормализованные латенты первого кадра. Могут быть получены на шаге vae_encoder. num_inference_steps (`int`): Количество шагов денойзинга. sigmas (`list`, *необязательный*): Пользовательские сигмы для процесса денойзинга. latents (`Tensor`): Предварительно сгенерированные зашумленные латенты для использования в качестве входных данных при генерации видео. generator (`Generator`, *необязательный*): Генератор Torch для детерминированной генерации. attention_kwargs (`dict`, *необязательный*): Дополнительные аргументы для процессоров внимания. output_type (`str`, *необязательный*, по умолчанию np): Формат вывода: 'pil', 'np', 'pt'.

Результаты: видео (`list`): сгенерированные видео.

