
在 diffusers 中高效运行 Sana线性 DiT 文生图管线 SanaPipeline 全解析【免费下载链接】diffusers Diffusers: State-of-the-art diffusion models for image, video, and audio generation in PyTorch.项目地址: https://gitcode.com/GitHub_Trending/di/diffusersSana 是由 NVIDIA 与 MIT HAN Lab 联合提出的高效文生图框架其目标是以远小于主流大模型的参数量生成最高 4096×4096 分辨率的图像。本文以 diffusers 仓库中 SanaPipeline 文档 为骨架结合 pipeline_sana.py、sana_transformer.py 等源码与 集成测试完整讲解 SanaPipeline 的模型选型、加载精度、推理参数、提示词增强与量化部署让你能在本地 GPU 上以极低显存成本跑通高质量文生图。Sana 是什么四项核心设计Sana 论文《SANA: Efficient High-Resolution Image Synthesis with Linear Diffusion Transformers》提出了一个可在笔记本 GPU 上部署的文生图框架其四大核心设计在官方文档摘要中明确列出深度压缩自编码器Deep Compression Autoencoder传统自编码器通常只做 8 倍压缩Sana 训练了可压缩 32 倍的 AE显著减少 latent token 数量从而降低 DiT 在高分辨率下的计算量。这一点在源码中得到印证SanaPipeline.__init__中vae_scale_factor默认按2 ** (len(self.vae.config.encoder_block_out_channels) - 1)计算缺省值为 32见 pipeline_sana.py。线性 DiTLinear DiT将 DiT 中所有 vanilla attention 替换为线性注意力在高分辨率下更高效且不牺牲质量。对应实现位于 sana_transformer.py 中的SanaLinearAttnProcessor2_0。Decoder-only 文本编码器用现代 decoder-only 小 LLMGemma2替换 T5并通过 in-context learning 设计复杂人工指令Complex Human Instruction来增强图文对齐。源码中SanaPipeline的text_encoder类型即为Gemma2PreTrainedModeltokenizer 为GemmaTokenizer。高效训练与采样提出 Flow-DPM-Solver 减少采样步数并配合高效 caption 标注与筛选加速收敛。据论文所述Sana-0.6B 的吞吐量相比同代巨型扩散模型快百倍以上可在 16GB 显存笔记本 GPU 上不到 1 秒生成 1024×1024 图像。这些属于论文主张的公开结论实际表现请以自己环境的实测为准。前置依赖与安装在 diffusers 中使用SanaPipeline需要以下基础组件torch建议 PyTorch 2.0线性注意力处理器依赖torch.nn.functional.scaled_dot_product_attentiondiffusers本仓库即其源码transformers提供 Gemma2 文本编码器与 tokenizeraccelerate用于enable_model_cpu_offload等特性可选beautifulsoup4、ftfy启用clean_captionTrue的 caption 清洗时必需缺失时管线会自动降级并给出警告见源码_text_preprocessing中的BACKENDS_MAPPING检查从源码安装本仓库即可cd diffusers pip install -e .可用模型与推荐精度官方文档给出以下 Sana 预训练模型权重托管在 Efficient-Large-Model 组织下模型 ID 形如Efficient-Large-Model/nameModelRecommended dtype指 transformer 权重Efficient-Large-Model/Sana_1600M_1024px_BF16_diffuserstorch.bfloat16Efficient-Large-Model/Sana_1600M_1024px_diffuserstorch.float16Efficient-Large-Model/Sana_1600M_1024px_MultiLing_diffuserstorch.float16Efficient-Large-Model/Sana_1600M_512px_diffuserstorch.float16Efficient-Large-Model/Sana_1600M_512px_MultiLing_diffuserstorch.float16Efficient-Large-Model/Sana_600M_1024px_diffuserstorch.float16Efficient-Large-Model/Sana_600M_512px_diffuserstorch.float16这里有几个必须注意的精度约束表中推荐的 dtype仅针对 transformer 权重text encoder 与 VAE 权重必须保持torch.bfloat16或torch.float32否则模型无法正常工作。下载 checkpoint 时建议传variant参数以节省磁盘空间推荐 dtype 为torch.float16的模型设variantfp16推荐torch.bfloat16的模型设variantbf16。默认会下载torch.float32权重占用约两倍磁盘空间同时也可以不传 variant仅通过torch_dtype参数在加载时进行 on-the-fly 下转换。基础推理从加载到出图结合源码中EXAMPLE_DOC_STRINGpipeline_sana.py给出的官方示例一次完整的推理如下import torch from diffusers import SanaPipeline pipe SanaPipeline.from_pretrained( Efficient-Large-Model/Sana_1600M_1024px_BF16_diffusers, torch_dtypetorch.float32, variantbf16, # 推荐按推荐 dtype 选择 bf16/fp16 以节省磁盘 ) pipe.to(cuda) # 关键text encoder 与 transformer 显式转换到 bf16 pipe.text_encoder.to(torch.bfloat16) pipe.transformer pipe.transformer.to(torch.bfloat16) image pipe(prompta cyberpunk cat with a neon sign that says Sana)[0] image[0].save(output.png)注意与 Stable Diffusion 系列管线不同Sana 的 VAE 是AutoencoderDCDC 即 Deep Compression32 倍压缩其权重同样应保持在 bf16/fp32。pipe(...)返回的是SanaPipelineOutput或元组首个元素是 PIL 图像列表索引[0]即取第一张图return_dictFalse时返回(image,)元组[0]得到图像列表再[0]取单张。底层组件构成从 pipeline_sana.py 的SanaPipeline.__init__可以看到管线由五个模块注册而成tokenizerGemmaTokenizer | GemmaTokenizerFasttext_encoderGemma2PreTrainedModeldecoder-only 小 LLM替代 T5vaeAutoencoderDC32 倍深度压缩自编码器transformerSanaTransformer2DModel线性注意力 DiTschedulerDPMSolverMultistepSchedulerFlow-DPM-Solver 的高效多步采样器此外管线还提供了model_cpu_offload_seq text_encoder-transformer-vae即enable_model_cpu_offload()时按此顺序卸载显存紧张时可优先使用pipe.enable_model_cpu_offload()核心调用参数详解SanaPipeline.__call__的完整签名位于 pipeline_sana.py以下是与实践最相关的参数及其默认值参数默认值说明promptNone提示词str或list[str]也可直接传入预编码的prompt_embeds二者不能同时传negative_prompt负向提示词Sana 官方推荐为未开启 CFG 时guidance_scale 1被忽略num_inference_steps20去噪步数更多步数通常质量更高但更慢guidance_scale4.5CFG 引导强度w见 Imagen 论文公式 2 1时启用 CFG越大越贴合文本但过大可能损害画质num_images_per_prompt1每个 prompt 生成的图片数height/width1024/1024输出分辨率必须能被 32 整除源码check_inputs会校验并抛错eta0.0DDIM 论文中的 η仅对支持该参数的 scheduler 生效generatorNonetorch.Generator或列表用于可复现生成latentsNone预生成噪声 latent可做 seed 复用/图生图变体output_typepil输出格式可选pil、np或latent直接返回 latent跳过 VAE 解码return_dictTrue为True返回SanaPipelineOutput否则返回元组clean_captionFalse是否在编码前清洗 caption需要beautifulsoup4与ftfyuse_resolution_binningTrue是否先把请求分辨率映射到最近的宽高比 bin解码后再缩放回原分辨率利于生成非正方形图max_sequence_length300提示词最大序列长度complex_human_instruction内置增强指令复杂人工指令列表非空时拼接在 prompt 前做提示增强callback_on_step_end/callback_on_step_end_tensor_inputsNone/[latents]每步结束回调可选张量输入集合限于_callback_tensor_inputs [latents, prompt_embeds, negative_prompt_embeds]分辨率 binning 机制开启use_resolution_binning后管线会根据transformer.config.sample_size选择对应的宽高比表sample_size 128→ASPECT_RATIO_4096_BIN支持最高 8192×2048 / 2048×8192 等极端比例sample_size 64→ASPECT_RATIO_2048_BIN来自 PixArt-Sigmasample_size 32→ASPECT_RATIO_1024_BINsample_size 16→ASPECT_RATIO_512_BIN以ASPECT_RATIO_4096_BIN为例定义于 pipeline_sana.py表中0.25: [2048.0, 8192.0]表示宽高比 0.25 对应 2048×81921.0: [4096.0, 4096.0]为正方形直至4.0: [8192.0, 2048.0]共覆盖 34 档比例。最终生成的图像会先按 bin 分辨率出图再通过image_processor.resize_and_crop_tensor缩放到你请求的原始尺寸。提示词增强Complex Human Instruction 与 caption 清洗Sana 用 decoder-only 小 LLM 做文本编码其提示词增强分为两级1.complex_human_instruction默认开启源码中该参数默认值是一段完整的英文增强提示指令示意模型将简单 prompt 扩写为包含色彩、形状、材质、空间关系等细节的描述例如用户输入A cat sleeping→ 增强为A small, fluffy white cat curled up in a round shape, sleeping peacefully on a warm sunny windowsill, surrounded by pots of blooming red flowers.该指令列表会在_get_gemma_prompt_embeds中被\n.join(...)拼接后前置到每个 prompt 上并相应调整max_lengthnum_chi_prompt_tokens max_sequence_length - 2。传入空列表[]可关闭该增强仅使用原始 prompt。2.clean_captionTrue的 caption 清洗启用后会执行一整套基于正则的文本清洗_clean_caption包括去除 URL、HTML 标签、昵称、CJK 字符、多余标点与 emoji 类符号、规范化引号与破折号、修复乱码ftfy.fix_text等可显著改善脏数据来源的 caption 质量。注意清洗逻辑会移除中文等 CJK 字符因此中文 prompt 应谨慎开启该选项。显存优化与量化部署bitsandbytes 8-bit 量化量化通过把权重存储为更低精度数据类型来降低大模型的显存需求。官方文档给出了 text encoder 与 transformer 分别量化的完整示例量化概览见 量化文档import torch from diffusers import BitsAndBytesConfig as DiffusersBitsAndBytesConfig, SanaTransformer2DModel, SanaPipeline from transformers import BitsAndBytesConfig as BitsAndBytesConfig, AutoModel quant_config BitsAndBytesConfig(load_in_8bitTrue) text_encoder_8bit AutoModel.from_pretrained( Efficient-Large-Model/Sana_1600M_1024px_diffusers, subfoldertext_encoder, quantization_configquant_config, dtypetorch.float16, ) quant_config DiffusersBitsAndBytesConfig(load_in_8bitTrue) transformer_8bit SanaTransformer2DModel.from_pretrained( Efficient-Large-Model/Sana_1600M_1024px_diffusers, subfoldertransformer, quantization_configquant_config, dtypetorch.float16, ) pipeline SanaPipeline.from_pretrained( Efficient-Large-Model/Sana_1600M_1024px_diffusers, text_encodertext_encoder_8bit, transformertransformer_8bit, dtypetorch.float16, device_mapbalanced, ) prompt a tiny astronaut hatching from an egg on the moon image pipeline(prompt).images[0] image.save(sana.png)关键点text encoder 用transformers的BitsAndBytesConfig从text_encodersubfolder 加载transformer 用diffusers的BitsAndBytesConfig从transformersubfolder 加载两者再作为已加载组件注入SanaPipeline.from_pretrained。CPU offload 与 VAE tiling显存不足时优先使用pipe.enable_model_cpu_offload()管线会按text_encoder - transformer - vae的顺序逐模块卸载到 CPU源码model_cpu_offload_seq。大图解码若触发 OOM源码在vae.decode的except OutOfMemoryError分支中会提示启用 VAE tilingpipe.vae.enable_tiling(tile_sample_min_width512, tile_sample_min_height512)。该行为在 test_sana.py 的test_vae_tiling中有对应测试覆盖。其他 Sana 系列管线除SanaPipeline外本仓库还提供了同一论文系列的其他管线见 pipelines/sana/init.pySanaControlNetPipelineSana ControlNet 的结构可控生成pipeline_sana_controlnet.py。SanaSprintPipeline/SanaSprintImg2ImgPipelineSprint稀疏训练版本的文生图与图生图管线。SanaPAGPipelinePerturbed Attention GuidancePAG增强的 Sana 管线实现位于 pipelines/pag/pipeline_pag_sana.py。SanaPipelineOutputpipeline_output.py是它们的统一输出类字段images为list[PIL.Image.Image]或np.ndarray形状(batch_size, height, width, channels)。测试验证与复现仓库中的集成测试可以帮你验证环境与结果一致性tests/pipelines/sana/test_sana.pytest_sana_1024加载Efficient-Large-Model/Sana_1600M_1024px_diffuserstorch.float16启用enable_model_cpu_offload以固定 seed 0、num_inference_steps20、1024×1024 出图并断言输出像素切片与期望值一致atol1e-4。test_sana_512同样的流程在 512px 模型上验证。如果你拿到的是不同 checkpoint可以用同样的固定generator与步数配置做自校验。调度器速度与质量的权衡、跨管线复用组件的方法可进一步阅读 Schedulers 指南 与 加载与复用组件。小结SanaPipeline 把深度压缩 VAE 线性注意力 DiT Gemma2 文本编码器 Flow-DPM-Solver四条设计落成一条可直接调用的 diffusers 管线。实践中记住三条纪律即可稳定出图text encoder 与 VAE 保持 bf16/fp32、transformer 按模型推荐 dtype 加载并配合variant参数省磁盘、显存吃紧时依次尝试 CPU offload、8-bit 量化与 VAE tiling。配合默认开启的 Complex Human Instruction 提示增强Sana 能在消费级 GPU 上以很少的采样步数产出高分辨率、强图文对齐的图像。【免费下载链接】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),仅供参考