# 커뮤니티 파이프라인 및 구성 요소

커뮤니티 파이프라인은 원본 논문 구현과 다른 [DiffusionPipeline](/docs/diffusers/v0.43.0/ko/api/pipelines/overview#diffusers.DiffusionPipeline) 클래스입니다. 추가 기능을 제공하거나 원본 파이프라인 구현을 확장합니다.

> [!TIP]
> 추론 및 학습 예제가 포함된 [diffusers/examples/community](https://github.com/huggingface/diffusers/tree/main/examples/community)의 커뮤니티 파이프라인을 확인해 보세요.

Community pipelines은 Hub 또는 Diffusers의 GitHub 저장소에 저장됩니다. Hub pipelines은 완전히 사용자 정의할 수 있으며(scheduler, models, pipeline 코드 등) GitHub pipelines은 사용자 정의 pipeline 코드만 제한적으로 사용할 수 있습니다. 아래 표에서 두 가지 pipeline 유형을 비교해 보세요.

|  | GitHub | Hub |
|---|---|---|
| 사용 | `custom_pipeline="<filename_without_.py>"` | Hub 저장소 ID 또는 `_class_name`이 사용자 정의 코드를 가리킬 때 `trust_remote_code=True` |
| 리뷰 프로세스 | GitHub에서 Pull Request를 열고 Diffusers 팀의 리뷰 과정을 거친 후 병합됩니다. 이 옵션은 더 느립니다. | 리뷰 없이 Hub 저장소에 직접 업로드합니다. 이 옵션이 가장 빠릅니다. |
| 가시성 | 공식 Diffusers 저장소 및 문서에 포함되어 있습니다. | Hub 프로필에 포함되며, 사용량과 홍보에 따라 노출도가 결정됩니다. |

## 커뮤니티 파이프라인 로드

`custom_pipeline`를 [from_pretrained()](/docs/diffusers/v0.43.0/ko/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/v0.43.0/ko/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained)에 추가하여 특정 버전(예: `v0.30.0` 또는 `main`)의 커뮤니티 파이프라인을 로드할 수 있습니다. 기본적으로 커뮤니티 파이프라인은 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/v0.43.0/ko/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/v0.43.0/ko/api/pipelines/overview#diffusers.DiffusionPipeline.from_pipe) 메서드는 커뮤니티 파이프라인을 로드할 때 특히 유용합니다. 많은 커뮤니티 파이프라인에는 사전 학습된 가중치가 없기 때문입니다. 커뮤니티 파이프라인은 일반적으로 기존 파이프라인 위에 기능을 추가합니다.

## 커뮤니티 구성 요소

Community components를 사용하면 Diffusers에서 지원하지 않는 커스텀 transformers, UNets, VAEs, schedulers를 사용하여 파이프라인을 구축할 수 있습니다. 이러한 컴포넌트는 자체 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. [showone_unet_3d_condition.py](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/unet/showone_unet_3d_condition.py)에 이미 구현된 [custom UNet](https://github.com/showlab/Show-1/blob/main/showone/models/unet_3d_condition.py)를 로드합니다. [UNet3DConditionModel](/docs/diffusers/v0.43.0/ko/api/models/unet3d-cond#diffusers.UNet3DConditionModel)이 이미 Diffusers에 존재하기 때문에 [UNet3DConditionModel](/docs/diffusers/v0.43.0/ko/api/models/unet3d-cond#diffusers.UNet3DConditionModel) 클래스 이름은 커스텀 구현인 `ShowOneUNet3DConditionModel`으로 변경되었습니다. `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")
```

pipeline가 성공적으로 push된 후, 다음 변경 사항을 적용합니다.

- [model_index.json](https://huggingface.co/sayakpaul/show-1-base-with-code/blob/main/model_index.json#L2)의 `_class_name` 속성을 `["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`를 사용할 때 추가적인 안전 조치로, [from_pretrained()](/docs/diffusers/v0.43.0/ko/api/pipelines/overview#diffusers.DiffusionPipeline.from_pretrained)의 `revision` 인자에 커밋 해시를 전달하여 코드가 새로운 악성 코드로 업데이트되지 않았는지 확인하세요(모델 소유자를 완전히 신뢰하는 경우를 제외하고).

## 다음 단계

- 모두가 지연 없이 쉽게 작업을 공유할 수 있도록 커뮤니티 파이프라인을 추가하는 이유에 대한 더 자세한 맥락은 Issue [#841](https://github.com/huggingface/diffusers/issues/841)을 참고하세요.
- 커뮤니티 파이프라인의 추가 예시로 `trust_remote_code` 기능을 함께 사용하는 [stabilityai/japanese-stable-diffusion-xl](https://huggingface.co/stabilityai/japanese-stable-diffusion-xl/) 저장소를 확인해 보세요.

