# Пайплайны и компоненты сообщества

Пайплайны сообщества — это классы [DiffusionPipeline](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline), отличающиеся от реализации, описанной в оригинальной статье. Они обеспечивают дополнительный функционал или расширяют реализацию исходного пайплайна.

> [!TIP]
> Ознакомьтесь с пайплайнами сообщества в [diffusers/examples/community](https://github.com/huggingface/diffusers/tree/main/examples/community), где приведены примеры инференса и обучения для их использования.

Пайплайны сообщества хранятся либо на Hub, либо в репозитории Diffusers на GitHub. Пайплайны Hub полностью настраиваемы (планировщик, модели, код пайплайна и т. д.), тогда как пайплайны GitHub ограничены только пользовательским кодом пайплайна. Сравните два типа пайплайнов в таблице ниже.

|  | GitHub | Hub |
|---|---|---|
| Использование | `custom_pipeline="<filename_without_.py>"` | ID репозитория на Hub или `trust_remote_code=True`, если `_class_name` указывает на пользовательский код |
| Процесс рецензирования | Откройте Pull Request на GitHub и пройдите процесс ревью от команды Diffusers перед слиянием. Этот вариант занимает больше времени. | Загрузите напрямую в репозиторий Hub без рецензирования. Это самый быстрый вариант. |
| Видимость | Входит в официальный репозиторий и документацию Diffusers. | Отображается на вашем профиле в Hub и набирает популярность за счёт вашего использования и продвижения. |

## Загрузка конвейера сообщества

Загрузите любой тип сообщества, передав `custom_pipeline` в [from_pretrained()](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained).

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-3-medium-diffusers",
    custom_pipeline="pipeline_stable_diffusion_3_instruct_pix2pix",
    dtype=torch.float16,
    device_map="cuda"  # or "mps", "xpu", "cpu"
)
```

Добавьте аргумент `custom_revision` в [from_pretrained()](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained), чтобы загрузить community pipeline из конкретной версии (например, `v0.30.0` или `main`). По умолчанию community pipeline загружаются из последней стабильной версии Diffusers.

```py
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "stabilityai/stable-diffusion-3-medium-diffusers",
    custom_pipeline="pipeline_stable_diffusion_3_instruct_pix2pix",
    custom_revision="main",
    dtype=torch.float16,
    device_map="cuda"  # or "mps", "xpu", "cpu"
)
```

> [!WARNING]
> Пока Hugging Face Hub [сканирует](https://huggingface.co/docs/hub/security-malware) файлы, всё равно следует проверить код конвейера Hub и убедиться в его безопасности.

Существует несколько способов загрузки конвейера сообщества.

- Передайте путь к `custom_pipeline`, чтобы загрузить локальный пайплайн сообщества. В каталоге должен находиться файл `pipeline.py`, содержащий класс пайплайна.

  ```py
  import torch
  from diffusers import DiffusionPipeline

  pipeline = DiffusionPipeline.from_pretrained(
      "stabilityai/stable-diffusion-3-medium-diffusers",
      custom_pipeline="path/to/pipeline_directory",
      trust_remote_code=True,
      dtype=torch.float16,
      device_map="cuda"  # or "mps", "xpu", "cpu"
  )
  ```

- Аргумент `custom_pipeline` также поддерживается в [from_pipe()](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline.from_pipe), что полезно для [повторного использования конвейеров](./loading#reusing-models-in-multiple-pipelines) без использования дополнительной памяти. Это ограничивает потребление памяти только самым большим загруженным конвейером.

  ```py
  import torch
  from diffusers import DiffusionPipeline

  pipeline_sd = DiffusionPipeline.from_pretrained(
      "emilianJR/CyberRealistic_V3", dtype=torch.float16, device_map="cuda"  # or "mps", "xpu", "cpu"
  )
  pipeline_lpw = DiffusionPipeline.from_pipe(
      pipeline_sd, custom_pipeline="lpw_stable_diffusion"
  )
  ```

  Метод [from_pipe()](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline.from_pipe) особенно полезен для загрузки пайплайнов сообщества, поскольку многие из них не имеют предобученных весов. Как правило, пайплайны сообщества добавляют новую функцию поверх существующего пайплайна.

## Компоненты сообщества

Компоненты сообщества позволяют создавать конвейеры с кастомными трансформерами, UNet, VAE и планировщиками, которые не поддерживаются в Diffusers. Для этих компонентов требуются собственные модули Python.

В этом разделе показано, как пользователи могут использовать компоненты сообщества для создания конвейера сообщества на примере [showlab/show-1-base](https://huggingface.co/showlab/show-1-base).

1. Загрузите необходимые компоненты: планировщик и процессор изображений. Текстовый энкодер, как правило, импортируется из [Transformers](https://huggingface.co/docs/transformers/index).

```python
from transformers import T5Tokenizer, T5EncoderModel, CLIPImageProcessor
from diffusers import DPMSolverMultistepScheduler

pipeline_id = "showlab/show-1-base"
tokenizer = T5Tokenizer.from_pretrained(pipeline_id, subfolder="tokenizer")
text_encoder = T5EncoderModel.from_pretrained(pipeline_id, subfolder="text_encoder")
scheduler = DPMSolverMultistepScheduler.from_pretrained(pipeline_id, subfolder="scheduler")
feature_extractor = CLIPImageProcessor.from_pretrained(pipeline_id, subfolder="feature_extractor")
```

> [!WARNING]
> На шагах 2 и 3 реализация пользовательского [UNet](https://github.com/showlab/Show-1/blob/main/showone/models/unet_3d_condition.py) и [pipeline](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/unet/showone_unet_3d_condition.py) должна соответствовать формату, показанному в их файлах, чтобы этот пример работал.

2. Загрузите [кастомный UNet](https://github.com/showlab/Show-1/blob/main/showone/models/unet_3d_condition.py), который уже реализован в [showone_unet_3d_condition.py](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/unet/showone_unet_3d_condition.py). Имя класса [UNet3DConditionModel](/docs/diffusers/main/ru/api/models/unet3d-cond#diffusers.UNet3DConditionModel) изменено на имя кастомной реализации, `ShowOneUNet3DConditionModel`, поскольку [UNet3DConditionModel](/docs/diffusers/main/ru/api/models/unet3d-cond#diffusers.UNet3DConditionModel) уже существует в Diffusers. Все компоненты, необходимые для класса `ShowOneUNet3DConditionModel`, должны быть размещены в `showone_unet_3d_condition.py`.

```python
from showone_unet_3d_condition import ShowOneUNet3DConditionModel

unet = ShowOneUNet3DConditionModel.from_pretrained(pipeline_id, subfolder="unet")
```

3. Загрузите код пользовательского конвейера (уже реализованный в [pipeline_t2v_base_pixel.py](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/pipeline_t2v_base_pixel.py)). Этот скрипт содержит пользовательский класс `TextToVideoIFPipeline` для генерации видео по тексту. Как и в случае с пользовательским UNet, весь код, необходимый для `TextToVideoIFPipeline`, должен находиться в `pipeline_t2v_base_pixel.py`.

Инициализируйте `TextToVideoIFPipeline` с `ShowOneUNet3DConditionModel`.

```python
import torch
from pipeline_t2v_base_pixel import TextToVideoIFPipeline

pipeline = TextToVideoIFPipeline(
    unet=unet,
    text_encoder=text_encoder,
    tokenizer=tokenizer,
    scheduler=scheduler,
    feature_extractor=feature_extractor,
)
pipeline = pipeline.to("cuda")  # or "mps", "xpu", "cpu"
```

4. Опубликуйте конвейер на Hub, чтобы поделиться им с сообществом.

```python
pipeline.push_to_hub("custom-t2v-pipeline")
```

После успешного запуска конвейера внесите следующие изменения.

- Измените атрибут `_class_name` в [model_index.json](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/model_index.json#L2) на `["pipeline_t2v_base_pixel", "TextToVideoIFPipeline"]`.
- Загрузите `showone_unet_3d_condition.py` в подпапку [unet](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/unet/showone_unet_3d_condition.py).
- Загрузите `pipeline_t2v_base_pixel.py` в репозиторий [pipeline](https://huggingface.co/sayakpaul/show-1-base-with-code/tree/main).

Чтобы выполнить инференс, добавьте аргумент `trust_remote_code` при инициализации пайплайна, чтобы обработать всю «магию» за кулисами.

```python
import torch
from diffusers import DiffusionPipeline

pipeline = DiffusionPipeline.from_pretrained(
    "<change-username>/<change-id>", trust_remote_code=True, dtype=torch.float16
)
```

> [!WARNING]
> В качестве дополнительной меры предосторожности при использовании `trust_remote_code=True` передайте хеш коммита в аргумент `revision` в [from_pretrained()](/docs/diffusers/main/ru/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained), чтобы убедиться, что код не был обновлён с добавлением нового вредоносного кода (если вы полностью доверяете владельцам модели).

## Дальнейшие шаги

- См. задачу [#841](https://github.com/huggingface/diffusers/issues/841), чтобы узнать больше о том, почему мы добавляем community pipelines, чтобы помочь всем легко делиться своими работами без задержек.
- Ознакомьтесь с репозиторием [stabilityai/japanese-stable-diffusion-xl](https://huggingface.co/stabilityai/japanese-stable-diffusion-xl/) для дополнительного примера community-пайплайна, который также использует функцию `trust_remote_code`.

