# PAN 2

PAN2は、時間軸に基づいたアクションとカメラモーションの計画の下でシーンがどのように進化するかをシミュレートする基盤となるワールドモデルです。その29Bの生成シミュレーターはデュアルストリームのマルチモーダル拡散トランスフォーマーであり、ここでは統合されています。一方、そのプロンプトを生成する[推論バックボーン](https://huggingface.co/IFM/PAN2#reasoning-backbone)は統合されていません。

PAN 2 は、[Modular Diffusers](../../modular_diffusers/overview) ブロックとしてのみ統合されています。[PAN2Blocks](/docs/diffusers/v0.43.0/ja/api/pipelines/pan2#diffusers.PAN2Blocks) は、2 つのワークフローをサポートします:

| ワークフロー | 入力 |
|---|---|
| `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))
```

すべての呼び出しは、パディングなしでエンコードされる単一のプロンプトを受け取ります。そのため、transformerはアテンションマスクを必要とせず、すべての[attention backend](../../optimization/attention_backends)が利用可能です:

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

## セーフティチェッカー

PAN 2 は、生成前のプロンプトと、生成後のすべての動画に対してガードレールを実行します。ブロックされたプロンプトまたは動画は `ValueError` を引き起こします。これらのチェックはデフォルトで有効になっており、`load_components()` がガードレールを読み込みます。これには [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/ja/api/models/pan2_transformer3d#diffusers.PAN2Transformer3DModel) は [context parallelism](../../optimization/context_parallelism) をサポートしています。テキストと動画のトークン数は、通常、デバイス数（テキストのトークン数はプロンプトに依存します）で割り切れないため、推論には `ulysses_anything` または `ring_anything` を使用してください。例えば学習用の通常の `ulysses_degree` / `ring_degree` は、両方のトークン数が context parallel のサイズで割り切れることを要求します。

```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)

PAN 2 用の ModularPipeline: テキストから動画へ、および最初のフレームから画像を動画への変換。

```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)

Inputs: 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`, *任意*): アテンションプロセッサー用の追加の kwargs です。 output_type (`str`, *任意*, デフォルトは np): 出力形式: 'pil', 'np', 'pt'。

出力: 動画 (`list`): 生成された動画。

