Diffusers documentation
Пайплайны и компоненты сообщества
Пайплайны и компоненты сообщества
Пайплайны сообщества — это классы DiffusionPipeline, отличающиеся от реализации, описанной в оригинальной статье. Они обеспечивают дополнительный функционал или расширяют реализацию исходного пайплайна.
Ознакомьтесь с пайплайнами сообщества в diffusers/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().
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(), чтобы загрузить community pipeline из конкретной версии (например, v0.30.0 или main). По умолчанию community pipeline загружаются из последней стабильной версии Diffusers.
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"
)Пока Hugging Face Hub сканирует файлы, всё равно следует проверить код конвейера Hub и убедиться в его безопасности.
Существует несколько способов загрузки конвейера сообщества.
Передайте путь к
custom_pipeline, чтобы загрузить локальный пайплайн сообщества. В каталоге должен находиться файлpipeline.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(), что полезно для повторного использования конвейеров без использования дополнительной памяти. Это ограничивает потребление памяти только самым большим загруженным конвейером.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() особенно полезен для загрузки пайплайнов сообщества, поскольку многие из них не имеют предобученных весов. Как правило, пайплайны сообщества добавляют новую функцию поверх существующего пайплайна.
Компоненты сообщества
Компоненты сообщества позволяют создавать конвейеры с кастомными трансформерами, UNet, VAE и планировщиками, которые не поддерживаются в Diffusers. Для этих компонентов требуются собственные модули Python.
В этом разделе показано, как пользователи могут использовать компоненты сообщества для создания конвейера сообщества на примере showlab/show-1-base.
- Загрузите необходимые компоненты: планировщик и процессор изображений. Текстовый энкодер, как правило, импортируется из Transformers.
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")На шагах 2 и 3 реализация пользовательского UNet и pipeline должна соответствовать формату, показанному в их файлах, чтобы этот пример работал.
- Загрузите кастомный UNet, который уже реализован в showone_unet_3d_condition.py. Имя класса UNet3DConditionModel изменено на имя кастомной реализации,
ShowOneUNet3DConditionModel, поскольку UNet3DConditionModel уже существует в Diffusers. Все компоненты, необходимые для классаShowOneUNet3DConditionModel, должны быть размещены вshowone_unet_3d_condition.py.
from showone_unet_3d_condition import ShowOneUNet3DConditionModel
unet = ShowOneUNet3DConditionModel.from_pretrained(pipeline_id, subfolder="unet")- Загрузите код пользовательского конвейера (уже реализованный в pipeline_t2v_base_pixel.py). Этот скрипт содержит пользовательский класс
TextToVideoIFPipelineдля генерации видео по тексту. Как и в случае с пользовательским UNet, весь код, необходимый дляTextToVideoIFPipeline, должен находиться вpipeline_t2v_base_pixel.py.
Инициализируйте TextToVideoIFPipeline с ShowOneUNet3DConditionModel.
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"- Опубликуйте конвейер на Hub, чтобы поделиться им с сообществом.
pipeline.push_to_hub("custom-t2v-pipeline")После успешного запуска конвейера внесите следующие изменения.
- Измените атрибут
_class_nameв model_index.json на["pipeline_t2v_base_pixel", "TextToVideoIFPipeline"]. - Загрузите
showone_unet_3d_condition.pyв подпапку unet. - Загрузите
pipeline_t2v_base_pixel.pyв репозиторий pipeline.
Чтобы выполнить инференс, добавьте аргумент trust_remote_code при инициализации пайплайна, чтобы обработать всю «магию» за кулисами.
import torch
from diffusers import DiffusionPipeline
pipeline = DiffusionPipeline.from_pretrained(
"<change-username>/<change-id>", trust_remote_code=True, dtype=torch.float16
)В качестве дополнительной меры предосторожности при использовании
trust_remote_code=Trueпередайте хеш коммита в аргументrevisionв from_pretrained(), чтобы убедиться, что код не был обновлён с добавлением нового вредоносного кода (если вы полностью доверяете владельцам модели).
Дальнейшие шаги
- См. задачу #841, чтобы узнать больше о том, почему мы добавляем community pipelines, чтобы помочь всем легко делиться своими работами без задержек.
- Ознакомьтесь с репозиторием stabilityai/japanese-stable-diffusion-xl для дополнительного примера community-пайплайна, который также использует функцию
trust_remote_code.