Diffusers 文档

混元-DiT

Hugging Face's logo
加入 Hugging Face 社区

并获得增强型文档体验

开始使用

Hunyuan-DiT

chinese elements understanding

Hunyuan-DiT : 基于细粒度中文理解的强大多尺度扩散Transformer 来自腾讯混元。

论文摘要如下:

我们推出了 Hunyuan-DiT,这是一种文本到图像的扩散 Transformer,对英语和中文都有细粒度的理解。为了构建 Hunyuan-DiT,我们精心设计了 Transformer 结构、文本编码器和位置编码。我们还从头开始构建了一个完整的数据管道来更新和评估数据,以进行迭代模型优化。为了进行细粒度的语言理解,我们训练了一个多模态大型语言模型来细化图像的标题。最后,Hunyuan-DiT 可以与用户进行多轮多模态对话,根据上下文生成和细化图像。通过我们全面的、由 50 多名专业人工评估人员参与的人工评估协议,Hunyuan-DiT 在中文到图像的生成方面与其他开源模型相比,取得了新的最先进水平。

您可以在 Tencent/HunyuanDiT 找到原始代码库,并在 Tencent-Hunyuan 找到所有可用的检查点。

亮点:HunyuanDiT 支持中文/英文到图像,多分辨率生成。

HunyuanDiT 包含以下组件

  • 它使用扩散 Transformer 作为主干
  • 它结合了两种文本编码器,一种是双语 CLIP,另一种是多语言 T5 编码器

请务必查看 Schedulers 指南,了解如何探索调度器速度和质量之间的权衡,并查看 在多个管道之间重用组件 部分,了解如何有效地将相同的组件加载到多个管道中。

您可以通过将生成的图像从 HungyuanDiTPipeline 传递到 SDXL 精炼器 模型,进一步提高生成质量。

优化

您可以使用 torch.compile 和前馈分块来优化管道的运行时间和内存消耗。要了解其他优化方法,请查看 加速推理减少内存使用 指南。

推理

使用 torch.compile 来减少推理延迟。

首先,加载管道

from diffusers import HunyuanDiTPipeline
import torch

pipeline = HunyuanDiTPipeline.from_pretrained(
	"Tencent-Hunyuan/HunyuanDiT-Diffusers", torch_dtype=torch.float16
).to("cuda")

然后将管道的 transformervae 组件的内存布局更改为 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]

在 80GB A100 机器上的 基准测试 结果是

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

内存优化

通过以 8 位加载 T5 文本编码器,您可以在不到 6 GB 的 GPU VRAM 中运行管道。有关详细信息,请参考 此脚本

此外,您可以使用 enable_forward_chunking() 方法来减少内存使用。前馈分块以循环方式运行 Transformer 块中的前馈层,而不是一次运行所有层。这使您可以在内存消耗和推理运行时间之间进行权衡。

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

HunyuanDiTPipeline

class diffusers.HunyuanDiTPipeline

< >

( vae: AutoencoderKL text_encoder: BertModel tokenizer: BertTokenizer transformer: HunyuanDiT2DModel scheduler: DDPMScheduler safety_checker: StableDiffusionSafetyChecker feature_extractor: CLIPImageProcessor requires_safety_checker: bool = True text_encoder_2 = <class 'transformers.models.t5.modeling_t5.T5EncoderModel'> tokenizer_2 = <class 'transformers.models.t5.tokenization_t5.T5Tokenizer'> )

参数

  • vae (AutoencoderKL) — 变分自动编码器 (VAE) 模型,用于将图像编码和解码到潜在表示中,并从潜在表示中解码。我们使用 sdxl-vae-fp16-fix
  • text_encoder (Optional[~transformers.BertModel, ~transformers.CLIPTextModel]) — 冻结的文本编码器 (clip-vit-large-patch14)。HunyuanDiT 使用经过微调的 [双语 CLIP]。
  • tokenizer (Optional[~transformers.BertTokenizer, ~transformers.CLIPTokenizer]) — 用于对文本进行标记化的 BertTokenizerCLIPTokenizer
  • transformer (HunyuanDiT2DModel) — 由腾讯混元设计的混元DiT模型。
  • =1> text_encoder_2 (T5EncoderModel) — mT5 嵌入器。 具体来说,它是 't5-v1_1-xxl'。
  • tokenizer_2 (MT5Tokenizer) — mT5 嵌入器的标记器。
  • scheduler (DDPMScheduler) — 与混元DiT结合使用的调度器,用于对编码后的图像潜在特征进行去噪。

使用混元DiT进行英语/中文到图像生成的管道。

此模型继承自 DiffusionPipeline。 检查超类文档以了解库为所有管道实现的通用方法(例如下载或保存、在特定设备上运行等)。

混元DiT 使用两个文本编码器:mT5 和 [双语 CLIP](我们自己微调)

__call__

< >

( prompt: Union = None height: Optional = None width: Optional = None num_inference_steps: Optional = 50 guidance_scale: Optional = 5.0 negative_prompt: Union = None num_images_per_prompt: Optional = 1 eta: Optional = 0.0 generator: Union = None latents: Optional = None prompt_embeds: Optional = None prompt_embeds_2: Optional = None negative_prompt_embeds: Optional = None negative_prompt_embeds_2: Optional = None prompt_attention_mask: Optional = None prompt_attention_mask_2: Optional = None negative_prompt_attention_mask: Optional = None negative_prompt_attention_mask_2: Optional = None output_type: Optional = 'pil' return_dict: bool = True callback_on_step_end: Union = None callback_on_step_end_tensor_inputs: List = ['latents'] guidance_rescale: float = 0.0 original_size: Optional = (1024, 1024) target_size: Optional = None crops_coords_top_left: Tuple = (0, 0) use_resolution_binning: bool = True ) StableDiffusionPipelineOutputtuple

参数

  • prompt (strList[str], 可选) — 指导图像生成的提示或提示。 如果未定义,您需要传递 prompt_embeds
  • height (int) — 生成的图像的高度(以像素为单位)。
  • width (int) — 生成的图像的宽度(以像素为单位)。
  • num_inference_steps (int, 可选, 默认为 50) — 降噪步骤数。更多降噪步骤通常会导致更高质量的图像,但推理速度会更慢。此参数受strength调节。
  • guidance_scale (float, 可选, 默认为 7.5) — 更高的引导尺度值会鼓励模型生成与文本prompt密切相关的图像,但会降低图像质量。当guidance_scale > 1时,引导尺度将被启用。
  • negative_prompt (strList[str], 可选) — 指导图像生成中不应包含的内容的提示或提示。如果没有定义,您需要传递negative_prompt_embeds。当不使用引导(guidance_scale < 1)时被忽略。
  • num_images_per_prompt (int, 可选, 默认为 1) — 每个提示要生成的图像数量。
  • eta (float, 可选, 默认为 0.0) — 对应于DDIM论文中的参数 eta (η)。仅适用于DDIMScheduler,在其他调度器中被忽略。
  • generator (torch.GeneratorList[torch.Generator], 可选) — 一个torch.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.Imagenp.array
  • return_dict (bool, 可选, 默认值为 True) — 是否返回一个StableDiffusionPipelineOutput,而不是一个简单的元组。
  • callback_on_step_end (Callable[[int, int, Dict], None], PipelineCallback, MultiPipelineCallbacks, 可选) — 在每个去噪步骤结束时调用的回调函数或回调函数列表。
  • callback_on_step_end_tensor_inputs (List[str], 可选) — 应该传递给回调函数的张量输入列表。如果没有定义,将传递所有张量输入。
  • guidance_rescale (float, 可选, 默认值为 0.0) — 根据guidance_rescale重新调整noise_cfg的比例。基于Common Diffusion Noise Schedules and Sample Steps are Flawed的发现。参见第 3.4 节
  • original_size (Tuple[int, int], 可选, 默认值为 (1024, 1024)) — 图像的原始大小。用于计算时间 ID。
  • crops_coords_top_left (Tuple[int, int], 可选, 默认值 (0, 0)) — 裁剪的左上角坐标。用于计算时间 ID。
  • use_resolution_binning (bool, 可选, 默认值 True) — 是否使用分辨率分箱。如果 True,则输入分辨率将映射到最接近的标准分辨率。支持的分辨率为 1024x1024、1280x1280、1024x768、1152x864、1280x960、768x1024、864x1152、960x1280、1280x768 和 768x1280。建议将其设置为 True

返回

StableDiffusionPipelineOutputtuple

如果 return_dictTrue,则返回 StableDiffusionPipelineOutput,否则返回一个 tuple,其中第一个元素是包含生成的图像的列表,第二个元素是 bool 的列表,指示相应的生成图像是否包含“不适合工作”(nsfw)内容。

使用 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: str device: device = None dtype: dtype = None num_images_per_prompt: int = 1 do_classifier_free_guidance: bool = True negative_prompt: Optional = None prompt_embeds: Optional = None negative_prompt_embeds: Optional = None prompt_attention_mask: Optional = None negative_prompt_attention_mask: Optional = None max_sequence_length: Optional = None text_encoder_index: int = 0 )

参数

  • prompt (strList[str], 可选) — 要编码的提示 device — (torch.device): torch 设备
  • dtype (torch.dtype) — torch 数据类型
  • num_images_per_prompt (int) — 每个提示应该生成的图像数量
  • do_classifier_free_guidance (bool) — 是否使用分类器免费引导
  • negative_prompt (strList[str], 可选) — 不引导图像生成的提示或提示。如果未定义,则必须传递 negative_prompt_embeds。在不使用引导时忽略(即,如果 guidance_scale 小于 1,则忽略)。
  • prompt_embeds (torch.Tensor, 可选) — 预生成的文本嵌入。可用于轻松调整文本输入,例如 提示加权。如果未提供,则将从 prompt 输入参数生成文本嵌入。
  • negative_prompt_embeds (torch.Tensor, 可选) — 预生成的负文本嵌入。可用于轻松调整文本输入,例如提示权重。如果未提供,则将从negative_prompt输入参数生成negative_prompt_embeds
  • 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。

将提示编码为文本编码器隐藏状态。

< > 在 GitHub 上更新