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: un potente difusor Transformer multi-resolución con comprensión detallada del chino de Tencent Hunyuan.

El resumen del artículo es:

Presentamos Hunyuan-DiT, un transformer de difusión de texto a imagen con una comprensión detallada tanto del inglés como del chino. Para construir Hunyuan-DiT, diseñamos cuidadosamente la estructura del transformer, el codificador de texto y la codificación posicional. También construimos desde cero un pipeline de datos completo para actualizar y evaluar los datos con el fin de optimizar iterativamente el modelo. Para la comprensión lingüística detallada, entrenamos un Modelo de Lenguaje Grande Multimodal para refinar las descripciones de las imágenes. Finalmente, Hunyuan-DiT puede realizar diálogos multimodales de varios turnos con los usuarios, generando y refinando imágenes según el contexto. A través de nuestro protocolo de evaluación humana integral con más de 50 evaluadores humanos profesionales, Hunyuan-DiT establece un nuevo estado del arte en la generación de imágenes a partir de chino en comparación con otros modelos de código abierto.

Puedes encontrar el código original en Tencent/HunyuanDiT y todos los puntos de control disponibles en Tencent-Hunyuan.

Aspectos destacados: HunyuanDiT admite la generación de imágenes a partir de texto en chino e inglés, así como la generación a múltiples resoluciones.

HunyuanDiT tiene los siguientes componentes:

  • Utiliza un transformador de difusión como columna vertebral
  • Combina dos codificadores de texto, un CLIP bilingüe y un codificador T5 multilingüe

Asegúrate de consultar la guía de Schedulers para aprender a explorar el equilibrio entre la velocidad y la calidad del scheduler, y consulta la sección reutilizar componentes entre pipelines para aprender a cargar eficientemente los mismos componentes en múltiples pipelines.

Puedes mejorar aún más la calidad de la generación pasando la imagen generada por HungyuanDiTPipeline al modelo SDXL refiner.

Optimización

Puedes optimizar el tiempo de ejecución y el consumo de memoria del pipeline con torch.compile y feed-forward chunking. Para conocer otros métodos de optimización, consulta las guías Speed up inference y Reduce memory usage.

Inferencia

Use torch.compile para reducir la latencia de inferencia.

Primero, carga el pipeline:

from diffusers import HunyuanDiTPipeline
import torch

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

Luego, cambia el diseño de memoria de los componentes transformer y vae de los pipelines a torch.channels-last:

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

Por último, compile los componentes y ejecute la inferencia:

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]

Los resultados del benchmark en una máquina A100 de 80 GB son:

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

Optimización de memoria

Al cargar el codificador de texto T5 en 8 bits, puedes ejecutar la tubería con menos de 6 GB de VRAM de GPU. Consulta este script para más detalles.

Además, puedes usar el método enable_forward_chunking() para reducir el uso de memoria. El chunking de feed-forward ejecuta las capas feed-forward de un bloque transformer en un bucle en lugar de todas a la vez. Esto te ofrece un equilibrio entre el consumo de memoria y el tiempo de ejecución de la inferencia.

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

HunyuanDiTPipeline

clase 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 )

Parámetros

  • vae (AutoencoderKL) — Modelo de Variational Auto-Encoder (VAE) para codificar y decodificar imágenes a partir de representaciones latentes. Utilizamos sdxl-vae-fp16-fix.
  • text_encoder (~transformers.BertModel, ~transformers.CLIPTextModel | None) — Codificador de texto congelado (clip-vit-large-patch14). HunyuanDiT utiliza un [CLIP bilingüe] afinado.
  • tokenizer (~transformers.BertTokenizer, ~transformers.CLIPTokenizer | None) — Un BertTokenizer o CLIPTokenizer para tokenizar el texto.
  • transformer (HunyuanDiT2DModel) — El modelo HunyuanDiT diseñado por Tencent Hunyuan.
  • text_encoder_2 (T5EncoderModel) — El codificador mT5. Específicamente, es ‘t5-v1_1-xxl’.
  • tokenizer_2 (T5Tokenizer) — El tokenizador para el incrustador mT5.
  • scheduler (DDPMScheduler) — Un scheduler para usar en combinación con HunyuanDiT para desruidar los latentes de imagen codificados.

Pipeline para la generación de imágenes a partir de inglés/chino usando HunyuanDiT.

Este modelo hereda de DiffusionPipeline. Consulta la documentación de la clase superior para los métodos genéricos que la biblioteca implementa para todos los pipelines (como la descarga o el guardado, la ejecución en un dispositivo específico, etc.)

HunyuanDiT utiliza dos codificadores de texto: mT5 y [CLIP bilingüe](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

Parámetros

  • prompt (str o list[str], opcional) — El prompt o prompts para guiar la generación de imágenes. Si no se define, debe pasar prompt_embeds.
  • height (int) — La altura en píxeles de la imagen generada.
  • width (int) — El ancho en píxeles de la imagen generada.
  • num_inference_steps (int, opcional, valor predeterminado 50) — El número de pasos de desruido. Más pasos de desruido suelen conducir a una imagen de mayor calidad a costa de una inferencia más lenta. Este parámetro se modula por strength.
  • guidance_scale (float, opcional, valor predeterminado 7.5) — Un valor de escala de guía más alto anima al modelo a generar imágenes estrechamente vinculadas al prompt de texto a costa de una menor calidad de imagen. La escala de guía se habilita cuando guidance_scale > 1.
  • negative_prompt (str o list[str], opcional) — El prompt o los prompts para guiar lo que no debe incluirse en la generación de imágenes. Si no se define, es necesario pasar negative_prompt_embeds en su lugar. Se ignora cuando no se usa guía (guidance_scale < 1).
  • num_images_per_prompt (int, opcional, valor predeterminado 1) — El número de imágenes que se generarán por indicación.
  • eta (float, opcional, valor predeterminado 0.0) — Corresponde al parámetro eta (η) del artículo DDIM. Solo se aplica al DDIMScheduler y se ignora en otros programadores.
  • generator (torch.Generator o list[torch.Generator], opcional) — Un torch.Generator para hacer que la generación sea determinista.
  • latents (torch.Tensor, opcional) — Latentes ruidosos pregenerados muestreados de una distribución gaussiana, que se utilizarán como entradas para la generación de imágenes. Se pueden usar para ajustar la misma generación con diferentes prompts. Si no se proporciona, se genera un tensor de latentes mediante muestreo usando el generator aleatorio suministrado.
  • prompt_embeds (torch.Tensor, opcional) — Incrustaciones de texto pregeneradas. Se pueden usar para ajustar fácilmente las entradas de texto (ponderación del prompt). Si no se proporcionan, las incrustaciones de texto se generan a partir del argumento de entrada prompt.
  • prompt_embeds_2 (torch.Tensor, opcional) — Incrustaciones de texto pregeneradas. Se pueden usar para ajustar fácilmente las entradas de texto (ponderación del prompt). Si no se proporcionan, las incrustaciones de texto se generan a partir del argumento de entrada prompt.
  • negative_prompt_embeds (torch.Tensor, opcional) — Incrustaciones de texto negativo pregeneradas. Se pueden usar para ajustar fácilmente las entradas de texto (ponderación del prompt). Si no se proporcionan, negative_prompt_embeds se generan a partir del argumento de entrada negative_prompt.
  • negative_prompt_embeds_2 (torch.Tensor, opcional) — Incrustaciones de texto negativas pregeneradas. Se pueden usar para ajustar fácilmente las entradas de texto (ponderación del prompt). Si no se proporcionan, negative_prompt_embeds se generan a partir del argumento de entrada negative_prompt.
  • prompt_attention_mask (torch.Tensor, opcional) — Máscara de atención para el prompt. Es obligatoria cuando se pasa prompt_embeds directamente.
  • prompt_attention_mask_2 (torch.Tensor, opcional) — Máscara de atención para el prompt. Obligatorio cuando se pasa prompt_embeds_2 directamente.
  • negative_prompt_attention_mask (torch.Tensor, opcional) — Máscara de atención para el prompt negativo. Es obligatoria cuando se pasa negative_prompt_embeds directamente.
  • negative_prompt_attention_mask_2 (torch.Tensor, opcional) — Máscara de atención para el prompt negativo. Obligatorio cuando se pasa negative_prompt_embeds_2 directamente.
  • output_type (str, opcional, por defecto "pil") — El formato de salida de la imagen generada. Elija entre PIL.Image o np.array.
  • return_dict (bool, opcional, valor predeterminado True) — Indica si se debe devolver un StableDiffusionPipelineOutput en lugar de una tupla simple.
  • callback_on_step_end (Callable[[int, int], None], PipelineCallback, MultiPipelineCallbacks, opcional) — Una función de callback o una lista de funciones de callback que se llamarán al final de cada paso de desruido.
  • callback_on_step_end_tensor_inputs (list[str], opcional) — Una lista de entradas de tensor que deben pasarse a la función de callback. Si no se define, se pasarán todas las entradas de tensor.
  • guidance_rescale (float, opcional, valor predeterminado 0.0) — Reescala el noise_cfg según guidance_rescale. Basado en los hallazgos de Common Diffusion Noise Schedules and Sample Steps are Flawed. Ver la sección 3.4
  • original_size (tuple[int, int], opcional, valor predeterminado (1024, 1024)) — El tamaño original de la imagen. Se utiliza para calcular los ids de tiempo.
  • target_size (tuple[int, int], opcional) — El tamaño objetivo de la imagen. Se utiliza para calcular los ids de tiempo.
  • crops_coords_top_left (tuple[int, int], opcional, valor predeterminado (0, 0)) — Las coordenadas de la esquina superior izquierda del recorte. Se utiliza para calcular los ids de tiempo.
  • use_resolution_binning (bool, opcional, valor predeterminado True) — Si se usa o no el agrupamiento por resolución. Si es True, la resolución de entrada se mapeará a la resolución estándar más cercana. Las resoluciones admitidas son 1024x1024, 1280x1280, 1024x768, 1152x864, 1280x960, 768x1024, 864x1152, 960x1280, 1280x768 y 768x1280. Se recomienda establecerlo en True.

Si return_dict es True, se devuelve StableDiffusionPipelineOutput, en caso contrario se devuelve una tuple cuyo primer elemento es una lista con las imágenes generadas y el segundo elemento es una lista de bool que indica si la imagen generada correspondiente contiene contenido “not-safe-for-work” (nsfw).

La función de llamada a la pipeline para la generación con HunyuanDiT.

Ejemplos:

>>> 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 )

Parámetros

  • prompt (str o list[str], opcional) — prompt a codificar
  • device — (torch.device): dispositivo de torch
  • dtype (torch.dtype) — dtype de torch
  • num_images_per_prompt (int) — número de imágenes que deben generarse por prompt
  • do_classifier_free_guidance (bool) — si se debe usar classifier free guidance o no
  • negative_prompt (str o list[str], opcional) — El prompt o prompts que no deben guiar la generación de la imagen. Si no se define, se debe pasar negative_prompt_embeds en su lugar. Se ignora cuando no se usa guía (es decir, se ignora si guidance_scale es menor que 1).
  • prompt_embeds (torch.Tensor, opcional) — Incrustaciones de texto pregeneradas. Se pueden usar para ajustar fácilmente las entradas de texto, p. ej. ponderación de prompts. Si no se proporcionan, las incrustaciones de texto se generarán a partir del argumento de entrada prompt.
  • negative_prompt_embeds (torch.Tensor, opcional) — Incrustaciones de texto negativo pregeneradas. Se pueden usar para ajustar fácilmente las entradas de texto, p. ej. el ponderado del prompt. Si no se proporciona, negative_prompt_embeds se generará a partir del argumento de entrada negative_prompt.
  • prompt_attention_mask (torch.Tensor, opcional) — Máscara de atención para el prompt. Es obligatoria cuando se pasa prompt_embeds directamente.
  • negative_prompt_attention_mask (torch.Tensor, opcional) — Máscara de atención para el prompt negativo. Es obligatoria cuando se pasa negative_prompt_embeds directamente.
  • max_sequence_length (int, opcional) — longitud máxima de la secuencia a utilizar para el prompt.
  • text_encoder_index (int, opcional) — Índice del codificador de texto a utilizar. 0 para clip y 1 para T5.

Codifica el prompt en estados ocultos del codificador de texto.

Update on GitHub