Diffusers documentation
Hunyuan-DiT
Hunyuan-DiT
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
< source >( 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__
< source >( 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 (
strorlist[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 toguidance_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
< source >( 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 (
strorlist[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.
Кодирует промпт в скрытые состояния текстового энкодера.