使用 Diffusers 中的 AnimaModularPipeline 进行 Anima 文生图与图生图推理 📅 发布时间:2026/9/11 23:00:12 👁 浏览次数: 使用 Diffusers 中的 AnimaModularPipeline 进行 Anima 文生图与图生图推理【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers导读Anima 是 Diffusers 中一个基于模块化流水线Modular Pipeline架构实现的文生图模型它将CosmosTransformer3DModel与 Qwen3 文本编码器、基于 T5 token 的AnimaTextConditioner以及AutoencoderKLQwenImageVAE 组合在一起。本文以 api/pipelines/anima.md 为主线结合仓库中src/diffusers/modular_pipelines/anima/下的模块化实现与测试用例完整讲解 Anima 的架构组成、文生图/图生图两种工作流、核心参数语义以及底层去噪调用链使读者能够直接上手运行并深入理解其内部原理。Anima 的模型架构总览从文档的定义与 AnimaAutoBlocks 的组件声明 可以看出Anima 是一条混合编码链路由五个核心组件组成组件类型职责text_encoderQwen3Model搭配Qwen2Tokenizer将 prompt 编码为语义向量qwen_prompt_embedst5_tokenizerT5TokenizerFast将 prompt 分词为t5_input_ids供文本条件器使用text_conditionerAnimaTextConditioner把 Qwen 语义与 T5 token 映射为 Cosmos 需要的prompt_embedstransformerCosmosTransformer3DModel核心去噪主干在 latent 空间预测噪声vaeAutoencoderKLQwenImage图像与 latent 之间的编解码压缩倍率 8此外还有两个配套模块guiderClassifierFreeGuidance默认guidance_scale4.0用于无分类器引导schedulerFlowMatchEulerDiscreteScheduler负责 timestep 调度与单步去噪更新。从源码看AnimaTextConditioner的实现位于 condition_embedder_anima.py它内部包含基于 RoPE旋转位置编码的交叉注意力层将 Qwen 的source_hidden_states作为 Key/Value、T5 token 序列作为目标输入最终输出供 transformer 消费的条件向量。测试 test_conditioner_output_shape_and_padding 验证了它会把输出 pad 到min_sequence_length并保持非目标位置为 0。快速上手最小文生图示例文档给出的示例是使用通用的ModularPipeline类加载 Anima 权重这也是模块化流水线家族的统一入口import torch from diffusers import ModularPipeline pipe ModularPipeline.from_pretrained(circlestone-labs/Anima-Base-v1.0-Diffusers) pipe.load_components(dtypetorch.bfloat16) pipe.to(cuda) # or mps, xpu, cpu image pipe(promptmasterpiece, best quality, 1girl, solo, city lights).images[0]其中包含三个关键步骤from_pretrained加载配置ModularPipeline会读取仓库中的模块化配置并通过default_blocks_name自动确定块结构Anima 对应AnimaAutoBlocks见 modular_pipeline.py。load_components(dtypetorch.bfloat16)惰性加载组件按需实例化 text encoder、conditioner、transformer、vae、scheduler 等组件并统一指定bfloat16精度显著降低显存占用。dtype 也可根据硬件改为float16或float32。pipe(prompt...)执行推理返回标准的DiffusionPipelineOutput通过.images[0]取出首张 PIL 图像。设备支持cuda、mps、xpu、cpu在denoise.py的去噪循环中还针对 Apple MPS 做了 dtype 回退处理AnimaLoopAfterDenoiser。如果你更希望使用类型明确的类也可以直接从 diffusers 导入等价的AnimaModularPipeline已在 src/diffusers/init.py 中导出from diffusers import AnimaModularPipeline pipe AnimaModularPipeline.from_pretrained(circlestone-labs/Anima-Base-v1.0-Diffusers) pipe.load_components(dtypetorch.bfloat16) pipe.to(cuda)两种工作流text2image 与 img2imgAnimaAutoBlocks通过_workflow_map声明了两种受支持的工作流modular_blocks_anima.py_workflow_map { text2image: {prompt: True}, img2img: {image: True, prompt: True}, }即只要传入prompt就走文生图同时传入image和prompt则自动切换为图生图。这种按输入自动路由的能力来自AnimaAutoCoreDenoiseStep与AnimaAutoVaeImageEncoderStep两个 Auto 块AnimaAutoVaeImageEncoderStep的block_trigger_inputs [image]当 state 中存在image时才执行 VAE 编码纯文生图时该步骤被跳过modular_blocks_anima.pyAnimaAutoCoreDenoiseStep的block_trigger_inputs [image_latents, None]根据是否存在image_latents在 img2img 与 text2image 两套去噪链之间选择modular_blocks_anima.py。图生图示例import torch from PIL import Image from diffusers import ModularPipeline pipe ModularPipeline.from_pretrained(circlestone-labs/Anima-Base-v1.0-Diffusers) pipe.load_components(dtypetorch.bfloat16) pipe.to(cuda) init_image Image.open(city.jpg).convert(RGB) image pipe( prompta futuristic city at night, neon lights, imageinit_image, strength0.8, # 0~1越大改动越多默认 0.9 num_inference_steps50, ).images[0]模块化流水线的执行链从 prompt 到图像测试文件 test_modular_pipeline_anima.py 精确记录了两种工作流的块执行顺序与源码一一对应可以作为理解执行链的权威索引。text2image 执行链text_encoder (AnimaTextEncoderStep) → denoise.text_conditioning (AnimaTextConditioningStep) → denoise.input (AnimaTextInputStep) → denoise.prepare_latents (AnimaPrepareLatentsStep) → denoise.set_timesteps (AnimaSetTimestepsStep) → denoise.denoise (AnimaDenoiseStep) → decode.decode (AnimaVaeDecoderStep) → decode.postprocess (AnimaProcessImagesOutputStep)img2img 执行链text_encoder (AnimaTextEncoderStep) → vae_encoder (AnimaImg2ImgVaeEncoderStep) → denoise.text_conditioning (AnimaTextConditioningStep) → denoise.input (AnimaTextInputStep) → denoise.image_input (AnimaImageInputStep) → denoise.set_timesteps (AnimaImg2ImgSetTimestepsStep) → denoise.prepare_latents (AnimaImg2ImgPrepareLatentsStep) → denoise.denoise (AnimaDenoiseStep) → decode.decode (AnimaVaeDecoderStep) → decode.postprocess (AnimaProcessImagesOutputStep)各步骤底层原理AnimaTextEncoderStep编码见 encoders.py。内部通过_get_qwen_prompt_embeds用Qwen2Tokenizer编码 prompt 得到qwen_prompt_embeds并对 attention mask 做加权通过_get_t5_prompt_ids用T5TokenizerFast得到t5_input_ids。若提供negative_prompt会同时编码负向条件prepare_unconditional_embeds由guider.num_conditions 1决定。AnimaTextConditioningStep条件映射见 before_denoise.py。调用AnimaTextConditioner(source_hidden_statesqwen..., target_input_idst5...)把 Qwen 语义与 T5 token 融合成 transformer 可消费的prompt_embeds与negative_prompt_embeds。AnimaPrepareLatentsStep初始化噪声latent 形状为(batch, num_channels_latents, 1, H/8, W/8)其中时间维为 12D 图像padding_mask初始化为全 0供 Cosmos 主干使用before_denoise.py。AnimaSetTimestepsStep调度默认 sigma 序列为np.linspace(1.0, 1/num_inference_steps, num_inference_steps)img2img 版本额外通过get_timesteps(scheduler, num_inference_steps, strength)按strength截取 timestep 子序列before_denoise.py。AnimaDenoiseStep去噪循环见 denoise.py。每次迭代包含三块AnimaLoopBeforeDenoiser将 timestep 归一化为t / num_train_timestepsAnimaLoopDenoiser通过ClassifierFreeGuidance组合条件/无条件输入调用CosmosTransformer3DModel(hidden_states, timestep, padding_mask, encoder_hidden_statesprompt_embeds)预测噪声AnimaLoopAfterDenoiser用FlowMatchEulerDiscreteScheduler.step()更新 latents并带进度条。AnimaVaeDecoderStep解码先做latents / latents_std latents_mean逆归一化再经 VAE 解码取出 2D 图像张量decoders.py。AnimaProcessImagesOutputStep后处理根据output_typepil/np/pt用VaeImageProcessor.postprocess输出对应格式decoders.py。关键参数详解以下参数均来自AnimaAutoBlocks与各步骤的输入声明modular_blocks_anima.py参数默认值说明prompt必填引导生成的提示词str或list[str]negative_prompt可选负向提示词须与prompt类型一致且 batch 大小相同max_sequence_length512prompt 编码最大序列长度上限 4096超过会报错见 encoders.pyimage可选图生图参考图PIL.Image或图片列表height/width默认 1024由default_sample_size128 × vae_scale_factor8推出输出分辨率必须能被 16 整除vae_scale_factor × 2见 before_denoise.pynum_inference_steps50去噪步数strength0.9img2img 变换强度0~1越大对原图改动越多guidance_scale4.0无分类器引导强度在 guider 组件配置中声明num_images_per_prompt1每个 prompt 生成的图像数量generator可选用于可复现生成的torch.Generator支持传入与 batch 等长的 listlatents可选预先生成的噪声 latent传入则跳过随机初始化sigmas可选自定义 sigma 调度与timesteps二选一output_typepil输出格式pil、np、pt其中height/width的 16 整除约束值得特别说明Anima 的 VAE 压缩倍率为 8vae_scale_factor 2 ** len(vae.temperal_downsample)见 modular_pipeline.py而AnimaPrepareLatentsStep.check_inputs要求分辨率能被 16 整除否则抛出ValueError。加载、保存与 LoRA 微调支持AnimaModularPipeline继承自ModularPipeline与AnimaLoraLoaderMixinmodular_pipeline.py因此天然具备组件级保存/加载测试 test_save_load_components 验证了pipe.save_pretrained(tmpdir, safe_serializationTrue)后重新from_pretrained并load_components()的完整闭环且加载后text_conditioner与transformer类型正确。LoRA 权重加载测试 test_lora_state_dict_conversion 展示了lora_state_dict()会把外部命名如diffusion_model.blocks.0.self_attn.q_proj.lora_A.weight转换为transformer与text_conditioner内部的 PEFT 键名说明 LoRA 可以同时作用于 transformer 主干与文本条件器适合在 Anima 上做轻量定制。测试覆盖与可复现性仓库为 Anima 提供了完整的测试矩阵tests/modular_pipelines/anima/可作为验证环境是否正确的参照确定性enable_full_determinism()开启全确定模式配合 seed 固定 generatortext2image 与 img2img 双测试套件分别覆盖基础推理输出形状(1, 3, H, W)、无 NaN、空负向提示、低/高strength0.3/0.8/0.95、单批一致性expected_max_diff5e-4等场景通用 Mixin 基类ModularLoadingTesterMixin、ModularWorkflowTesterMixin、ModularMemoryTesterMixin、ModularGuiderTesterMixin从模块化流水线公共测试层继承验证加载、工作流路由、显存与引导器行为。测试使用的微型权重仓库为hf-internal-testing/tiny-anima-modular-pipe便于在 CI 或本地快速跑通全链路实际生产推理则使用circlestone-labs/Anima-Base-v1.0-Diffusers这类完整权重。小结Anima 是 Diffusers 模块化流水线家族中双编码器 Cosmos 主干的代表作Qwen3 负责语义理解T5 token 通过AnimaTextConditioner提供细粒度条件CosmosTransformer3DModel与FlowMatchEulerDiscreteScheduler完成流匹配去噪。通过ModularPipeline统一入口你只需几行代码即可完成文生图并在传入image时自动切换到图生图。若需深入源码建议从 modular_blocks_anima.py 的块编排入手结合 test_modular_pipeline_anima.py 中的工作流清单逐块跟踪状态流转。【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusers创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考