Buckets:
| # ModularPipelineBlocks | |
| [ModularPipelineBlocks](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) — это базовый блок для построения [ModularPipeline](/docs/diffusers/main/ru/api/modular_diffusers/pipeline#diffusers.ModularPipeline). Он определяет, какие компоненты, входные/выходные данные и вычисления блок должен выполнять на конкретном этапе конвейера. Блок [ModularPipelineBlocks](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) взаимодействует с другими блоками с помощью [state](./modular_diffusers_states), что позволяет модульно конструировать рабочие процессы. | |
| Сам по себе [ModularPipelineBlocks](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) не может быть выполнен. Это чертёж того, что должен делать шаг в конвейере. Чтобы фактически запустить и выполнить конвейер, [ModularPipelineBlocks](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) необходимо преобразовать в [ModularPipeline](/docs/diffusers/main/ru/api/modular_diffusers/pipeline#diffusers.ModularPipeline). | |
| В этом руководстве показано, как создать [ModularPipelineBlocks](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks). | |
| ## Входы и выходы | |
| > [!TIP] | |
| > Если вам не знакомо, как работает состояние в Modular Diffusers, обратитесь к руководству [States](./modular_diffusers_states). | |
| Для [ModularPipelineBlocks](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_blocks#diffusers.ModularPipelineBlocks) необходимы `inputs` и `intermediate_outputs`. | |
| - `inputs` — это значения, которые блок считывает из [PipelineState](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState) для выполнения вычислений. Это могут быть значения, предоставленные пользователем (например, промпт или изображение), или значения, полученные от предыдущего блока (например, закодированные `image_latents`). | |
| Используйте `InputParam` для определения `inputs`. | |
| ```py | |
| class ImageEncodeStep(ModularPipelineBlocks): | |
| ... | |
| @property | |
| def inputs(self): | |
| return [ | |
| InputParam(name="image", type_hint="PIL.Image", required=True, description="raw input image to process"), | |
| ] | |
| ... | |
| ``` | |
| - `intermediate_outputs` — это новые значения, создаваемые блоком и добавляемые в [PipelineState](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState). Значения `intermediate_outputs` доступны в качестве `inputs` для последующих блоков или в качестве итогового результата выполнения конвейера. | |
| Используйте `OutputParam` для определения `intermediate_outputs`. | |
| ```py | |
| class ImageEncodeStep(ModularPipelineBlocks): | |
| ... | |
| @property | |
| def intermediate_outputs(self): | |
| return [ | |
| OutputParam(name="image_latents", description="latents representing the image"), | |
| ] | |
| ... | |
| ``` | |
| Промежуточные входные и выходные данные разделяют данные для соединения блоков. Они доступны в любой момент, что позволяет отслеживать ход выполнения рабочего процесса. | |
| ## Компоненты и конфигурации | |
| Компоненты и конфигурации на уровне пайплайна, необходимые для блока, задаются в [ComponentSpec](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_components#diffusers.ComponentSpec) и [ConfigSpec](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_components#diffusers.ConfigSpec). | |
| - [ComponentSpec](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_components#diffusers.ComponentSpec) содержит ожидаемые компоненты, используемые блоком. Вам необходимо указать `name` компонента и, в идеале, `type_hint`, который точно определяет, что представляет собой компонент. | |
| - [ConfigSpec](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_components#diffusers.ConfigSpec) содержит настройки на уровне конвейера, которые управляют поведением всех блоков. | |
| ```py | |
| class ImageEncodeStep(ModularPipelineBlocks): | |
| ... | |
| @property | |
| def expected_components(self): | |
| return [ | |
| ComponentSpec(name="vae", type_hint=AutoencoderKL), | |
| ] | |
| @property | |
| def expected_configs(self): | |
| return [ | |
| ConfigSpec("force_zeros_for_empty_prompt", True), | |
| ] | |
| ... | |
| ``` | |
| Когда блоки преобразуются в конвейер, компоненты становятся доступными для блока в качестве первого аргумента в `__call__`. | |
| ## Логика вычислений | |
| Вычисления, выполняемые блоком, определяются в методе `__call__` и следуют определённой структуре. | |
| 1. Получите [BlockState](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState), чтобы получить локальный вид `inputs`. | |
| 2. Реализуйте логику вычислений для `inputs`. | |
| 3. Обновите [PipelineState](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState), чтобы отправить изменения из локального [BlockState](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.BlockState) обратно в глобальный [PipelineState](/docs/diffusers/main/ru/api/modular_diffusers/pipeline_states#diffusers.modular_pipelines.PipelineState). | |
| 4. Возвращает компоненты и состояние, которые становятся доступными для следующего блока. | |
| ```py | |
| class ImageEncodeStep(ModularPipelineBlocks): | |
| def __call__(self, components, state): | |
| # Get a local view of the state variables this block needs | |
| block_state = self.get_block_state(state) | |
| # Your computation logic here | |
| # block_state contains all your inputs | |
| # Access them like: block_state.image, block_state.processed_image | |
| # Update the pipeline state with your updated block_states | |
| self.set_block_state(state, block_state) | |
| return components, state | |
| ``` | |
| ## Собираем всё вместе | |
| Вот полный блок со всеми соединёнными частями. | |
| ```py | |
| from diffusers import ComponentSpec, AutoencoderKL | |
| from diffusers.modular_pipelines import InputParam, ModularPipelineBlocks, OutputParam | |
| class ImageEncodeStep(ModularPipelineBlocks): | |
| @property | |
| def description(self): | |
| return "Encode an image into latent space." | |
| @property | |
| def expected_components(self): | |
| return [ | |
| ComponentSpec(name="vae", type_hint=AutoencoderKL), | |
| ] | |
| @property | |
| def inputs(self): | |
| return [ | |
| InputParam(name="image", type_hint="PIL.Image", required=True, description="raw input image to process"), | |
| ] | |
| @property | |
| def intermediate_outputs(self): | |
| return [ | |
| OutputParam(name="image_latents", type_hint="torch.Tensor", description="latents representing the image"), | |
| ] | |
| def __call__(self, components, state): | |
| block_state = self.get_block_state(state) | |
| block_state.image_latents = components.vae.encode(block_state.image) | |
| self.set_block_state(state, block_state) | |
| return components, state | |
| ``` | |
| Каждый блок имеет свойство `doc`, которое автоматически генерируется на основе свойств, определённых выше. Оно содержит краткое описание блока, его компонентов, входов и выходов. | |
| ```py | |
| block = ImageEncoderStep() | |
| print(block.doc) | |
| class ImageEncodeStep | |
| Encode an image into latent space. | |
| Components: | |
| vae (`AutoencoderKL`) | |
| Inputs: | |
| image (`PIL.Image`): | |
| raw input image to process | |
| Outputs: | |
| image_latents (`torch.Tensor`): | |
| latents representing the image | |
| ``` | |
Xet Storage Details
- Size:
- 9.38 kB
- Xet hash:
- c5baf3689c96b9f530fb0a5485c0ba2ebfc6cf44302b61487be3c094c8e6dd6b
·
Xet efficiently stores files, intelligently splitting them into unique chunks and accelerating uploads and downloads. More info.