Diffusers documentation

Hunyuan-DiT

You are viewing main version, which requires installation from source. If you'd like regular pip install, checkout the latest stable version (v0.42.1).
Hugging Face's logo
Join the Hugging Face community

and get access to the augmented documentation experience

to get started

Hunyuan-DiT

chinese elements understanding

Hunyuan-DiT: мощный диффузионный трансформер с поддержкой нескольких разрешений и тонким пониманием китайского языка от Tencent Hunyuan.

Аннотация из статьи:

Мы представляем Hunyuan-DiT — диффузионный трансформер для генерации изображений по тексту, обеспечивающий детальное понимание как английского, так и китайского языков. Для создания Hunyuan-DiT мы тщательно спроектировали структуру трансформера, текстовый энкодер и позиционное кодирование. Кроме того, мы с нуля построили полный конвейер данных для обновления и оценки данных в процессе итеративной оптимизации модели. Для детального понимания языка мы обучили мультимодальную большую языковую модель для уточнения описаний изображений. В итоге Hunyuan-DiT способен вести многоходовой мультимодальный диалог с пользователями, генерируя и уточняя изображения в соответствии с контекстом. Благодаря нашей комплексной протоколе человеческой оценки с участием более 50 профессиональных оценщиков, Hunyuan-DiT устанавливает новый уровень качества в генерации изображений по китайскому тексту по сравнению с другими открытыми моделями.

Исходный код можно найти в Tencent/HunyuanDiT, а все доступные контрольные точки — в Tencent-Hunyuan.

Ключевые особенности: HunyuanDiT поддерживает генерацию изображений по описаниям на китайском и английском языках, а также создание изображений в нескольких разрешениях.

HunyuanDiT включает следующие компоненты:

  • В качестве основы используется диффузионный трансформер
  • Он объединяет два текстовых кодировщика: двуязычный CLIP и мультиязычный кодировщик T5

Обязательно ознакомьтесь с руководством по планировщикам, чтобы узнать, как исследовать баланс между скоростью и качеством планировщика, а также с разделом повторное использование компонентов в разных конвейерах, чтобы узнать, как эффективно загружать одни и те же компоненты в несколько конвейеров.

Вы можете дополнительно повысить качество генерации, передав изображение, полученное из HungyuanDiTPipeline, в модель SDXL refiner.

Оптимизация

Вы можете оптимизировать время выполнения и потребление памяти конвейера с помощью torch.compile и chunking'а прямого распространения. Чтобы узнать о других методах оптимизации, ознакомьтесь с руководствами Ускорение вывода и Сокращение использования памяти.

Вывод

Используйте torch.compile для снижения задержки при выводе.

Сначала загрузите конвейер:

from diffusers import HunyuanDiTPipeline
import torch

pipeline = HunyuanDiTPipeline.from_pretrained(
	"Tencent-Hunyuan/HunyuanDiT-Diffusers", dtype=torch.float16
).to("cuda")  # or "mps", "xpu", "cpu"

Затем измените раскладку памяти компонентов transformer и vae на torch.channels-last:

pipeline.transformer.to(memory_format=torch.channels_last)
pipeline.vae.to(memory_format=torch.channels_last)

Наконец, скомпилируйте компоненты и запустите инференс:

pipeline.transformer = torch.compile(pipeline.transformer, mode="max-autotune", fullgraph=True)
pipeline.vae.decode = torch.compile(pipeline.vae.decode, mode="max-autotune", fullgraph=True)

image = pipeline(prompt="一个宇航员在骑马").images[0]

Результаты бенчмарка на машине с 80 ГБ A100:

With torch.compile(): Average inference time: 12.470 seconds.
Without torch.compile(): Average inference time: 20.570 seconds.

Оптимизация памяти

Загрузив текстовый энкодер T5 в 8-битном формате, вы можете запустить конвейер, используя менее 6 ГБ видеопамяти GPU. Подробности см. в этом скрипте.

Кроме того, вы можете использовать метод enable_forward_chunking() для снижения потребления памяти. Feed-forward chunking выполняет слои feed-forward в блоке трансформера в цикле, а не все сразу. Это позволяет выбирать между расходом памяти и временем инференса.

+ pipeline.transformer.enable_forward_chunking(chunk_size=1, dim=1)

HunyuanDiTPipeline

класс diffusers.HunyuanDiTPipeline

< >

( vae: AutoencoderKLtext_encoder: BertModeltokenizer: BertTokenizertransformer: HunyuanDiT2DModelscheduler: DDPMSchedulersafety_checker: StableDiffusionSafetyCheckerfeature_extractor: CLIPImageProcessorPilrequires_safety_checker: bool = Truetext_encoder_2: transformers.models.t5.modeling_t5.T5EncoderModel | None = Nonetokenizer_2: transformers.models.t5.tokenization_t5.T5Tokenizer | None = None )

Параметры

  • vae (AutoencoderKL) — модель вариационного автоэнкодера (VAE) для кодирования изображений в латентные представления и декодирования из них. Мы используем sdxl-vae-fp16-fix.
  • text_encoder (~transformers.BertModel, ~transformers.CLIPTextModel | None) — Замороженный текстовый энкодер (clip-vit-large-patch14). HunyuanDiT использует дообученный [bilingual CLIP].
  • tokenizer (~transformers.BertTokenizer, ~transformers.CLIPTokenizer | None) — BertTokenizer или CLIPTokenizer для токенизации текста.
  • transformer (HunyuanDiT2DModel) — Модель HunyuanDiT, разработанная командой Tencent Hunyuan.
  • text_encoder_2 (T5EncoderModel) — Встраиватель mT5. Конкретно, это ‘t5-v1_1-xxl’.
  • tokenizer_2 (T5Tokenizer) — Токенизатор для встраивателя mT5.
  • scheduler (DDPMScheduler) — планировщик, используемый в сочетании с HunyuanDiT для удаления шума из закодированных латентов изображения.

Pipeline для генерации изображений из текста на английском/китайском языке с использованием HunyuanDiT.

Эта модель наследуется от DiffusionPipeline. См. документацию родительского класса для общих методов, которые библиотека реализует для всех пайплайнов (например, загрузка или сохранение, запуск на конкретном устройстве и т. д.)

HunyuanDiT использует два текстовых кодировщика: mT5 и [двуязычный CLIP](fine-tuned by ourselves)

__call__

< >

( prompt: str | list[str] = Noneheight: int | None = Nonewidth: int | None = Nonenum_inference_steps: int | None = 50guidance_scale: float | None = 5.0negative_prompt: str | list[str] | None = Nonenum_images_per_prompt: int | None = 1eta: float | None = 0.0generator: typing.Union[torch.Generator, list[torch.Generator], NoneType] = Nonelatents: typing.Optional[torch.Tensor] = Noneprompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_embeds_2: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds_2: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Noneprompt_attention_mask_2: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask_2: typing.Optional[torch.Tensor] = Noneoutput_type: str | None = 'pil'return_dict: bool = Truecallback_on_step_end: typing.Union[typing.Callable[[int, int], NoneType], diffusers.callbacks.PipelineCallback, diffusers.callbacks.MultiPipelineCallbacks, NoneType] = Nonecallback_on_step_end_tensor_inputs: list = ['latents']guidance_rescale: float = 0.0original_size: tuple[int, int] | None = (1024, 1024)target_size: tuple[int, int] | None = Nonecrops_coords_top_left: tuple = (0, 0)use_resolution_binning: bool = True ) → StableDiffusionPipelineOutput or tuple

Параметры

  • prompt (str или list[str], необязательный) — Промпт или промпты для управления генерацией изображения. Если не задан, необходимо передать prompt_embeds.
  • height (int) — Высота генерируемого изображения в пикселях.
  • width (int) — Ширина генерируемого изображения в пикселях.
  • num_inference_steps (int, необязательный, по умолчанию 50) — Количество шагов денойзинга. Как правило, большее число шагов денойзинга приводит к изображению более высокого качества, но за счёт более медленного вывода. Этот параметр модулируется strength.
  • guidance_scale (float, необязательный, по умолчанию 7.5) — Более высокое значение guidance scale побуждает модель генерировать изображения, тесно связанные с текстовым prompt, ценой снижения качества изображения. Guidance scale включается, когда guidance_scale > 1.
  • negative_prompt (str or list[str], необязательный) — Промпт или промпты, определяющие, что не должно присутствовать в генерируемом изображении. Если не задан, необходимо передать negative_prompt_embeds. Игнорируется, если не используется направляющий сигнал (guidance_scale < 1).
  • num_images_per_prompt (int, необязательный, по умолчанию 1) — Количество изображений, генерируемых для каждого промпта.
  • eta (float, необязательный, по умолчанию 0.0) — Соответствует параметру eta (η) из статьи DDIM. Применяется только к DDIMScheduler и игнорируется другими планировщиками.
  • generator (torch.Generator или list[torch.Generator], необязательный) — torch.Generator для обеспечения детерминированности генерации.
  • latents (torch.Tensor, необязательный) — Предварительно сгенерированные зашумленные латенты, выбранные из гауссова распределения, которые используются в качестве входных данных для генерации изображений. Можно использовать, чтобы корректировать одну и ту же генерацию с разными промптами. Если не задано, тензор латентов генерируется путём выборки с использованием переданного случайного generator.
  • prompt_embeds (torch.Tensor, необязательный) — Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не задано, текстовые эмбеддинги генерируются из входного аргумента prompt.
  • prompt_embeds_2 (torch.Tensor, необязательный) — Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не передано, текстовые эмбеддинги генерируются из входного аргумента prompt.
  • negative_prompt_embeds (torch.Tensor, необязательный) — Предварительно сгенерированные эмбеддинги отрицательного текста. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не задано, negative_prompt_embeds генерируются из входного аргумента negative_prompt.
  • negative_prompt_embeds_2 (torch.Tensor, необязательный) — Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных (взвешивание промпта). Если не задан, negative_prompt_embeds генерируются из входного аргумента negative_prompt.
  • prompt_attention_mask (torch.Tensor, необязательный) — Маска внимания для промпта. Обязателен, если prompt_embeds передается напрямую.
  • prompt_attention_mask_2 (torch.Tensor, необязательный) — Маска внимания для промпта. Обязателен, если prompt_embeds_2 передается напрямую.
  • negative_prompt_attention_mask (torch.Tensor, необязательный) — Маска внимания для негативного промпта. Обязателен, если negative_prompt_embeds передается напрямую.
  • negative_prompt_attention_mask_2 (torch.Tensor, необязательный) — Маска внимания для негативного промпта. Обязателен, если negative_prompt_embeds_2 передается напрямую.
  • output_type (str, необязательный, по умолчанию "pil") — Формат вывода сгенерированного изображения. Выберите между PIL.Image и np.array.
  • return_dict (bool, необязательный, по умолчанию True) — Определяет, следует ли возвращать StableDiffusionPipelineOutput вместо обычного кортежа.
  • callback_on_step_end (Callable[[int, int], None], PipelineCallback, MultiPipelineCallbacks, необязательный) — Функция обратного вызова или список функций обратного вызова, которые вызываются в конце каждого шага удаления шума.
  • callback_on_step_end_tensor_inputs (list[str], необязательный) — Список тензорных входных данных, которые должны передаваться в функцию обратного вызова. Если не определено, будут переданы все тензорные входные данные.
  • guidance_rescale (float, optional, defaults to 0.0) — Rescale the noise_cfg according to guidance_rescale. Based on findings of Common Diffusion Noise Schedules and Sample Steps are Flawed. See Section 3.4
  • original_size (tuple[int, int], необязательный, по умолчанию (1024, 1024)) — Исходный размер изображения. Используется для вычисления временных идентификаторов.
  • target_size (tuple[int, int], необязательный) — Целевой размер изображения. Используется для вычисления временных идентификаторов.
  • crops_coords_top_left (tuple[int, int], необязательный, по умолчанию (0, 0)) — Координаты верхнего левого угла кадрирования. Используется для вычисления идентификаторов времени.
  • use_resolution_binning (bool, необязательный, по умолчанию True) — Использовать ли биннинг разрешения. Если True, входное разрешение будет сопоставлено с ближайшим стандартным разрешением. Поддерживаемые разрешения: 1024x1024, 1280x1280, 1024x768, 1152x864, 1280x960, 768x1024, 864x1152, 960x1280, 1280x768 и 768x1280. Рекомендуется установить это значение в True.

Возвращает

StableDiffusionPipelineOutput или tuple

Если return_dict равно True, возвращается StableDiffusionPipelineOutput, в противном случае возвращается tuple, где первый элемент — это список с сгенерированными изображениями, а второй элемент — это список значений bool, указывающих, содержит ли соответствующее сгенерированное изображение контент, нежелательный для работы (nsfw).

Функция вызова pipeline для генерации с HunyuanDiT.

Примеры:

>>> import torch
>>> from diffusers import HunyuanDiTPipeline

>>> pipe = HunyuanDiTPipeline.from_pretrained(
...     "Tencent-Hunyuan/HunyuanDiT-Diffusers", torch_dtype=torch.float16
... )
>>> pipe.to("cuda")

>>> # You may also use English prompt as HunyuanDiT supports both English and Chinese
>>> # prompt = "An astronaut riding a horse"
>>> prompt = "一个宇航员在骑马"
>>> image = pipe(prompt).images[0]

encode_prompt

< >

( prompt: strdevice: device = Nonedtype: dtype = Nonenum_images_per_prompt: int = 1do_classifier_free_guidance: bool = Truenegative_prompt: str | None = Noneprompt_embeds: typing.Optional[torch.Tensor] = Nonenegative_prompt_embeds: typing.Optional[torch.Tensor] = Noneprompt_attention_mask: typing.Optional[torch.Tensor] = Nonenegative_prompt_attention_mask: typing.Optional[torch.Tensor] = Nonemax_sequence_length: int | None = Nonetext_encoder_index: int = 0 )

Параметры

  • prompt (str или list[str], необязательный) — промпт для кодирования
  • device — (torch.device): устройство torch
  • dtype (torch.dtype) — torch dtype
  • num_images_per_prompt (int) — количество изображений, которые должны быть сгенерированы для каждого промпта
  • do_classifier_free_guidance (bool) — использовать ли classifier free guidance
  • negative_prompt (str or list[str], необязательный) — Промпт или промпты, которые не должны направлять генерацию изображения. Если не задан, необходимо передать negative_prompt_embeds. Игнорируется, если не используется направляющее поле (то есть игнорируется, если guidance_scale меньше 1).
  • prompt_embeds (torch.Tensor, необязательный) — Предварительно сгенерированные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, например, для взвешивания промпта. Если не передано, текстовые эмбеддинги будут сгенерированы из входного аргумента prompt.
  • negative_prompt_embeds (torch.Tensor, необязательный) — Предварительно сгенерированные отрицательные текстовые эмбеддинги. Можно использовать для простой настройки текстовых входных данных, например для взвешивания промпта. Если не передано, negative_prompt_embeds будет сгенерировано из входного аргумента negative_prompt.
  • prompt_attention_mask (torch.Tensor, необязательный) — Маска внимания для промпта. Обязателен, если prompt_embeds передается напрямую.
  • negative_prompt_attention_mask (torch.Tensor, необязательный) — Маска внимания для негативного промпта. Обязателен, если negative_prompt_embeds передается напрямую.
  • max_sequence_length (int, необязательный) — максимальная длина последовательности, используемая для промпта.
  • text_encoder_index (int, необязательный) — Индекс используемого текстового энкодера. 0 для clip и 1 для T5.

Кодирует промпт в скрытые состояния текстового энкодера.

Update on GitHub