Diffusers documentation

Hunyuan-DiT

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[str] = ['latents']guidance_rescale: float = 0.0original_size: tuple[int, int] | None = (1024, 1024)target_size: tuple[int, int] | None = Nonecrops_coords_top_left: tuple[int, int] = (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