Diffusers documentation
Hunyuan-DiT
Hunyuan-DiT
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
HungyuanDiTPipelineal 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
< 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 )
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) — UnBertTokenizeroCLIPTokenizerpara 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__
< 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[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 (
strolist[str], opcional) — El prompt o prompts para guiar la generación de imágenes. Si no se define, debe pasarprompt_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 porstrength. - 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 alpromptde texto a costa de una menor calidad de imagen. La escala de guía se habilita cuandoguidance_scale > 1. - negative_prompt (
strolist[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 pasarnegative_prompt_embedsen 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.Generatorolist[torch.Generator], opcional) — Untorch.Generatorpara 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 elgeneratoraleatorio 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 entradaprompt. - 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 entradaprompt. - 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_embedsse generan a partir del argumento de entradanegative_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_embedsse generan a partir del argumento de entradanegative_prompt. - prompt_attention_mask (
torch.Tensor, opcional) — Máscara de atención para el prompt. Es obligatoria cuando se pasaprompt_embedsdirectamente. - prompt_attention_mask_2 (
torch.Tensor, opcional) — Máscara de atención para el prompt. Obligatorio cuando se pasaprompt_embeds_2directamente. - negative_prompt_attention_mask (
torch.Tensor, opcional) — Máscara de atención para el prompt negativo. Es obligatoria cuando se pasanegative_prompt_embedsdirectamente. - negative_prompt_attention_mask_2 (
torch.Tensor, opcional) — Máscara de atención para el prompt negativo. Obligatorio cuando se pasanegative_prompt_embeds_2directamente. - output_type (
str, opcional, por defecto"pil") — El formato de salida de la imagen generada. Elija entrePIL.Imageonp.array. - return_dict (
bool, opcional, valor predeterminadoTrue) — 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únguidance_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 predeterminadoTrue) — Si se usa o no el agrupamiento por resolución. Si esTrue, 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 enTrue.
Devuelve
StableDiffusionPipelineOutput o tuple
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
< 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 )
Parámetros
- prompt (
strolist[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 (
strolist[str], opcional) — El prompt o prompts que no deben guiar la generación de la imagen. Si no se define, se debe pasarnegative_prompt_embedsen su lugar. Se ignora cuando no se usa guía (es decir, se ignora siguidance_scalees menor que1). - 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 entradaprompt. - 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 entradanegative_prompt. - prompt_attention_mask (
torch.Tensor, opcional) — Máscara de atención para el prompt. Es obligatoria cuando se pasaprompt_embedsdirectamente. - negative_prompt_attention_mask (
torch.Tensor, opcional) — Máscara de atención para el prompt negativo. Es obligatoria cuando se pasanegative_prompt_embedsdirectamente. - 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.0para clip y1para T5.
Codifica el prompt en estados ocultos del codificador de texto.