Diffusers documentation
Hunyuan-DiT
Hunyuan-DiT
Hunyuan-DiT: um poderoso Diffusion Transformer multi-resolução com compreensão detalhada do chinês da Tencent Hunyuan.
O resumo do artigo é:
Apresentamos o Hunyuan-DiT, um difusão transformer de texto para imagem com compreensão detalhada tanto do inglês quanto do chinês. Para construir o Hunyuan-DiT, projetamos cuidadosamente a estrutura do transformer, o codificador de texto e a codificação posicional. Também construímos do zero um pipeline de dados completo para atualizar e avaliar dados para otimização iterativa do modelo. Para a compreensão linguística detalhada, treinamos um Modelo de Linguagem Grande Multimodal para refinar as legendas das imagens. Por fim, o Hunyuan-DiT pode realizar diálogos multimodais de múltiplas rodadas com usuários, gerando e refinando imagens de acordo com o contexto. Por meio de nosso protocolo holístico de avaliação humana com mais de 50 avaliadores humanos profissionais, o Hunyuan-DiT estabelece um novo estado da arte na geração de imagens a partir do chinês em comparação com outros modelos de código aberto.
Você pode encontrar a base de código original em Tencent/HunyuanDiT e todos os checkpoints disponíveis em Tencent-Hunyuan.
Destaques: HunyuanDiT suporta geração de imagem a partir de texto em chinês/inglês e geração em múltiplas resoluções.
O HunyuanDiT possui os seguintes componentes:
- Ele usa um transformer de difusão como espinha dorsal
- Ele combina dois codificadores de texto, um CLIP bilíngue e um codificador T5 multilíngue
Certifique-se de consultar o guia de Schedulers para aprender a explorar o compromisso entre a velocidade e a qualidade do scheduler, e veja a seção reutilização de componentes entre pipelines para aprender a carregar eficientemente os mesmos componentes em vários pipelines.
Você pode melhorar ainda mais a qualidade da geração passando a imagem gerada pelo
HungyuanDiTPipelinepara o modelo SDXL refiner.
Otimização
Você pode otimizar o tempo de execução e o consumo de memória do pipeline com torch.compile e feed-forward chunking. Para saber sobre outros métodos de otimização, consulte os guias Acelerar a inferência e Reduzir o uso de memória.
Inferência
Use torch.compile para reduzir a latência de inferência.
Primeiro, carregue o pipeline:
from diffusers import HunyuanDiTPipeline
import torch
pipeline = HunyuanDiTPipeline.from_pretrained(
"Tencent-Hunyuan/HunyuanDiT-Diffusers", dtype=torch.float16
).to("cuda") # or "mps", "xpu", "cpu"Em seguida, altere o layout de memória dos componentes transformer e vae dos pipelines para torch.channels-last:
pipeline.transformer.to(memory_format=torch.channels_last) pipeline.vae.to(memory_format=torch.channels_last)
Por fim, compile os componentes e execute a inferência:
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]Os resultados do benchmark em uma máquina A100 de 80GB são:
With torch.compile(): Average inference time: 12.470 seconds.
Without torch.compile(): Average inference time: 20.570 seconds.Otimização de memória
Ao carregar o codificador de texto T5 em 8 bits, você pode executar o pipeline com menos de 6 GB de VRAM na GPU. Consulte este script para mais detalhes.
Além disso, você pode usar o método enable_forward_chunking() para reduzir o uso de memória. O feed-forward chunking executa as camadas feed-forward em um bloco de transformer em um loop, em vez de tudo de uma vez. Isso oferece um compromisso entre o consumo de memória e o tempo de execução da inferência.
+ pipeline.transformer.enable_forward_chunking(chunk_size=1, dim=1)HunyuanDiTPipeline
classe 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 e decodificar imagens para e a partir de representações latentes. Usamos
sdxl-vae-fp16-fix. - text_encoder (
~transformers.BertModel,~transformers.CLIPTextModel| None) — Codificador de texto congelado (clip-vit-large-patch14). O HunyuanDiT usa um [CLIP bilíngue] ajustado finamente. - tokenizer (
~transformers.BertTokenizer,~transformers.CLIPTokenizer| None) — UmBertTokenizerouCLIPTokenizerpara tokenizar texto. - transformer (HunyuanDiT2DModel) — O modelo HunyuanDiT desenvolvido pela Tencent Hunyuan.
- text_encoder_2 (
T5EncoderModel) — O incorporador mT5. Especificamente, é o ‘t5-v1_1-xxl’. - tokenizer_2 (
T5Tokenizer) — O tokenizer do incorporador mT5. - scheduler (DDPMScheduler) — Um scheduler a ser usado em combinação com HunyuanDiT para desruidar os latentes da imagem codificada.
Pipeline para geração de imagens a partir de inglês/chinês usando HunyuanDiT.
Este modelo herda de DiffusionPipeline. Consulte a documentação da superclasse para os métodos genéricos que a biblioteca implementa para todos os pipelines (como download ou salvamento, execução em um dispositivo específico, etc.)
HunyuanDiT usa dois codificadores de texto: mT5 e [CLIP bilíngue](ajustado por nós mesmos)
__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
Parâmetros
- prompt (
stroulist[str], opcional) — O prompt ou os prompts para orientar a geração de imagens. Se não for definido, você precisa passarprompt_embeds. - height (
int) — A altura da imagem gerada, em pixels. - width (
int) — A largura, em pixels, da imagem gerada. - num_inference_steps (
int, opcional, padrão 50) — O número de etapas de desruidamento. Mais etapas de desruidamento geralmente resultam em uma imagem de maior qualidade, em detrimento de uma inferência mais lenta. Este parâmetro é modulado porstrength. - guidance_scale (
float, opcional, padrão 7.5) — Um valor mais alto de guidance scale incentiva o modelo a gerar imagens fortemente ligadas ao textoprompt, em detrimento da qualidade da imagem. O guidance scale é ativado quandoguidance_scale > 1. - negative_prompt (
stroulist[str], opcional) — O prompt ou os prompts para orientar o que não incluir na geração de imagem. Se não definido, é necessário passarnegative_prompt_embedsem vez disso. Ignorado quando não está usando orientação (guidance_scale < 1). - num_images_per_prompt (
int, opcional, padrão 1) — O número de imagens a serem geradas por prompt. - eta (
float, opcional, padrão 0.0) — Corresponde ao parâmetro eta (η) do paper DDIM. Aplica-se apenas ao DDIMScheduler e é ignorado em outros schedulers. - generator (
torch.Generatoroulist[torch.Generator], opcional) — Umtorch.Generatorpara tornar a geração determinística. - latents (
torch.Tensor, opcional) — Latentes ruidosos pré-gerados, amostrados de uma distribuição gaussiana, a serem usados como entradas para a geração de imagens. Pode ser usado para ajustar a mesma geração com diferentes prompts. Se não for fornecido, um tensor de latentes é gerado por amostragem usando ogeneratoraleatório fornecido. - prompt_embeds (
torch.Tensor, opcional) — Incorporações de texto pré-geradas. Podem ser usadas para ajustar facilmente as entradas de texto (ponderação do prompt). Se não forem fornecidas, as incorporações de texto são geradas a partir do argumento de entradaprompt. - prompt_embeds_2 (
torch.Tensor, opcional) — Incorporações de texto pré-geradas. Podem ser usadas para ajustar facilmente as entradas de texto (ponderação do prompt). Se não forem fornecidas, as incorporações de texto são geradas a partir do argumento de entradaprompt. - negative_prompt_embeds (
torch.Tensor, opcional) — Embeddings de texto negativos pré-gerados. Pode ser usado para ajustar facilmente as entradas de texto (ponderação do prompt). Se não for fornecido, osnegative_prompt_embedssão gerados a partir do argumento de entradanegative_prompt. - negative_prompt_embeds_2 (
torch.Tensor, opcional) — Incorporações de texto negativas pré-geradas. Pode ser usado para ajustar facilmente as entradas de texto (ponderação do prompt). Se não for fornecido,negative_prompt_embedssão geradas a partir do argumento de entradanegative_prompt. - prompt_attention_mask (
torch.Tensor, opcional) — Máscara de atenção para o prompt. Obrigatória quandoprompt_embedsé passado diretamente. - prompt_attention_mask_2 (
torch.Tensor, opcional) — Máscara de atenção para o prompt. Obrigatória quandoprompt_embeds_2é passado diretamente. - negative_prompt_attention_mask (
torch.Tensor, opcional) — Máscara de atenção para o prompt negativo. Obrigatória quandonegative_prompt_embedsé passado diretamente. - negative_prompt_attention_mask_2 (
torch.Tensor, opcional) — Máscara de atenção para o prompt negativo. Obrigatória quandonegative_prompt_embeds_2é passado diretamente. - output_type (
str, opcional, padrão"pil") — O formato de saída da imagem gerada. Escolha entrePIL.Imageounp.array. - return_dict (
bool, opcional, padrãoTrue) — Se deve ou não retornar um StableDiffusionPipelineOutput em vez de uma tupla simples. - callback_on_step_end (
Callable[[int, int], None],PipelineCallback,MultiPipelineCallbacks, opcional) — Uma função de callback ou uma lista de funções de callback a serem chamadas no final de cada etapa de remoção de ruído. - callback_on_step_end_tensor_inputs (
list[str], opcional) — Uma lista de entradas de tensor que devem ser passadas para a função de callback. Se não for definida, todas as entradas de tensor serão passadas. - guidance_rescale (
float, opcional, padrão 0.0) — Recalcula o noise_cfg de acordo comguidance_rescale. Baseado nas conclusões de Common Diffusion Noise Schedules and Sample Steps are Flawed. Veja a Seção 3.4 - original_size (
tuple[int, int], opcional, padrão(1024, 1024)) — O tamanho original da imagem. Usado para calcular os time ids. - target_size (
tuple[int, int], opcional) — O tamanho alvo da imagem. Usado para calcular os ids de tempo. - crops_coords_top_left (
tuple[int, int], opcional, padrão(0, 0)) — As coordenadas do canto superior esquerdo do recorte. Usado para calcular os ids de tempo. - use_resolution_binning (
bool, opcional, padrãoTrue) — Se deve usar binning de resolução ou não. SeTrue, a resolução de entrada será mapeada para a resolução padrão mais próxima. As resoluções suportadas são 1024x1024, 1280x1280, 1024x768, 1152x864, 1280x960, 768x1024, 864x1152, 960x1280, 1280x768 e 768x1280. Recomenda-se definir este parâmetro comoTrue.
Retorna
StableDiffusionPipelineOutput ou tuple
Se return_dict for True, StableDiffusionPipelineOutput é retornado,
caso contrário, uma tuple é retornada, em que o primeiro elemento é uma lista com as imagens geradas e o
segundo elemento é uma lista de bools indicando se a imagem gerada correspondente contém
conteúdo “not-safe-for-work” (nsfw).
A função de chamada do pipeline para geração com HunyuanDiT.
Exemplos:
>>> 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 (
stroulist[str], opcional) — prompt a ser codificado - device — (
torch.device): dispositivo torch - dtype (
torch.dtype) — dtype do torch - num_images_per_prompt (
int) — número de imagens que devem ser geradas por prompt - do_classifier_free_guidance (
bool) — se deve usar classifier free guidance ou não - negative_prompt (
stroulist[str], opcional) — O prompt ou os prompts que não devem orientar a geração da imagem. Se não for definido, é necessário passarnegative_prompt_embedsem vez disso. Ignorado quando não se usa orientação (ou seja, ignorado seguidance_scalefor menor que1). - prompt_embeds (
torch.Tensor, opcional) — Incorporações de texto pré-geradas. Podem ser usadas para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompts. Se não forem fornecidas, as incorporações de texto serão geradas a partir do argumento de entradaprompt. - negative_prompt_embeds (
torch.Tensor, opcional) — Incorporações de texto negativas pré-geradas. Pode ser usado para ajustar facilmente as entradas de texto, por exemplo, ponderação de prompts. Se não for fornecido, negative_prompt_embeds será gerado a partir do argumento de entradanegative_prompt. - prompt_attention_mask (
torch.Tensor, opcional) — Máscara de atenção para o prompt. Obrigatória quandoprompt_embedsé passado diretamente. - negative_prompt_attention_mask (
torch.Tensor, opcional) — Máscara de atenção para o prompt negativo. Obrigatória quandonegative_prompt_embedsé passado diretamente. - max_sequence_length (
int, opcional) — comprimento máximo da sequência a ser usado para o prompt. - text_encoder_index (
int, opcional) — Índice do codificador de texto a ser usado.0para clip e1para T5.
Codifica o prompt em estados ocultos do codificador de texto.