ARTICLE DETAIL

资讯详情

深耕郑州网站建设与运营推广的一线实战洞察。

PiD(Pixel Diffusion Decoder)在 stable-diffusion.cpp 中的部署与像素扩散超分实战

PiD(Pixel Diffusion Decoder)在 stable-diffusion.cpp 中的部署与像素扩散超分实战 人工智能大模型本地部署推理引擎媒体生成【免费下载链接】stable-diffusion.cppDiffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C项目地址https://gitcode.com/GitHub_Trending/st/stable-diffusion.cpp点击查看免费下载PiD 是 NVIDIA 提出的 Pixel Diffusion Decoder它用像素空间的扩散解码器替代传统 VAE 解码或先解码再放大的流程以源图像 latent 与文本提示为条件直接扩散生成高分辨率 RGB 像素。本文基于 stable-diffusion.cpp 仓库中的 docs/pid.md 官方文档结合仓库内src/model/diffusion/pid.hpp、src/pipeline/diffusion_engine.cpp等源码实现完整讲解 PiD含 PiD 1.5的权重准备、命令行配置、核心参数语义与底层工作原理帮助读者在纯 C/C 推理环境中把一张低分辨率图像端到端放大为高分辨率结果。PiD 是什么一条替代 VAE 解码的超分路径在常规扩散模型管线中去噪完成后通常由 VAE 的 decoder 把 latent 解码回像素若要高清还需再接一个独立 upscaler如 ESRGAN。PiD 的思路不同它本身就是一个以扩散方式工作的解码器直接以源 latent 和文本提示为条件在像素空间逐步去噪生成高分辨率 RGB 图像从而把解码与放大合并进同一条扩散路径。两个版本均受支持原版 PiDPiD 1.5带 pit/LQ 注入增强的版本。在 stable-diffusion.cpp 中PiD 目前以图像编辑image edit管线的形式运行通过-r/--ref-image提供一张参考图像用与该 PiD 检查点骨干网络匹配的 VAE 将该图编码为 latent随后 PiD 扩散模型直接以这些 latent 为条件解码/放大到 RGB。权重准备四类文件缺一不可PiD 的推理链路由扩散模型、文本编码器、tokenizer、VAE 四部分组成需要分别下载共五步。PiD 扩散模型safetensors 格式从 Hugging Face 上 Comfy-Org 的 PixelDiT 仓库diffusion_models目录获取例如pid_flux1_512_to_2048_4step_bf16.safetensors。Gemma 2 2B 文本编码器safetensors 格式同样来自 Comfy-Org 的 PixelDiT 仓库text_encoders目录。Gemma 2 2B 的tokenizer.json来自 Gemma 2 2B 的官方模型仓库。与 PiD 检查点骨干网络匹配的 VAEsafetensors 格式来自 nvidia/PiD 官方检查点仓库。第 4 步的 VAE 必须与 PiD 的骨干网络严格对应具体对应关系如下PiD 骨干网络使用的 VAE命令行参数Flux / Z-Image PiDFlux VAE--vae-format fluxSD3 PiDSD3 VAE--vae-format sd3Flux.2 PiDFlux.2 VAE--vae-format flux2Qwen-Image PiDQwen-Image 2D VAE--vae-format wan许可证提醒官方 PiD 模型卡应在使用前确认。在 PiD 首次发布时官方权重使用 NSCLv1 非商业许可证请据此评估使用场景。Gemma 2 tokenizer必须外置PiD 与 PiD 1.5 都需要一个与文本编码器检查点匹配的外部 Gemma 2tokenizer.json。tokenizer 并未内嵌在 stable-diffusion.cpp 中需要将其保存为tokenizer_gemma2.json并通过--tokenizer参数传入。这一点在 docs/tokenizers.md 中有更完整的说明PiD含 1.5和 Lens含 Lens Turbo必须外置 JSON tokenizer主 tokenizer 缺失时初始化会直接失败而其他模型在省略该选项时会继续使用内嵌 tokenizer。C API 用法与 CLI 一致把同样的字符串填入sd_ctx_params_t::tokenizer该值不能为空CLI 原样透传由TokenizerConfig在文本编码器初始化时解析与校验。端到端命令行示例以下命令取自 docs/pid.mdWindows 路径写法Linux/macOS 下把sd-cli.exe换成对应构建产物的可执行文件路径即可.\bin\Release\sd-cli.exe --diffusion-model ..\models\diffusion_models\pid_flux1_512_to_2048_4step_bf16.safetensors --llm ..\models\text_encoders\gemma_2_2b_it_elm_bf16.safetensors --tokenizer ..\models\tokenizers\tokenizer_gemma2.json --vae ..\models\vae\ae.sft --vae-format flux --cfg-scale 1.0 -p a lovely cat -r ..\assets\ernie_image\turbo_example.png --diffusion-fa -v --steps 4 -H 2048 -W 2048 --rng cpu这条命令完成了完整的参考图 → 512×512 → 2048×2048超分放大。下面是仓库中对应的实际运行效果输入参考图与输出结果对比可见输出在保留原图构图与色调的基础上毛发、面部细节与地毯纤维纹理的清晰度显著提升——这正是像素空间扩散解码而非简单插值放大带来的效果。核心参数逐项解析参数作用备注--diffusion-model FILEPiD 扩散模型 safetensors对应源码中的Pid::PiDRunner权重前缀为model.diffusion_model.net见 src/pipeline/model_builders.cpp--llm FILEGemma 2 2B 文本编码器PiD 的条件器使用LLMEmbedder加载该文本编码器--tokenizer FILE外置 Gemma 2tokenizer.json必须与文本编码器检查点匹配保存为tokenizer_gemma2.json后传入--vae FILE独立 VAE 文件需要与 PiD 骨干网络匹配见上表--vae-format FORMATVAE latent 布局覆盖auto、flux、sd3、flux2、wan默认auto使用独立 VAE 文件时必须显式指定因为 PiD 扩散检查点本身不携带 VAE 格式信息见 examples/common/common.cpp-r/--ref-image FILE参考图像路径可多次使用必填。PiD 使用第一张参考图编码得到的 latent 作为源条件见 docs/pid.md 与 src/pipeline/image.cpp-p TEXT提示词作为文本条件与源 latent 一起驱动像素空间扩散--cfg-scale 1.0CFG 引导强度官方 4 步示例使用 1.0无分类器引导结合 PiD 的 flow 调度使用--steps 4扩散步数PiD 官方 4 步检查点源码中 PiD 的默认采样方法为 LCM见 src/pipeline/request.cpp与低步数采样适配-H/-W输出高度/宽度示例为 2048×2048实际请依据硬件显存调整--diffusion-fa仅在扩散模型中使用 flash attention降低大分辨率下的注意力显存开销见 examples/common/common.cpp-v输出 verbose 日志便于观察 PiD 版本检测与各阶段耗时--rng cpu使用 CPU 端 RNG示例中用于保证可复现的随机性--vae-format为什么如此关键从源码看PiD 在构建 VAE 时有一个专门的逻辑当检测到版本为 PiD 且vae_format不是auto时会用 VAE 格式反推 VAE 对应的模型版本来构建 VAE见 src/pipeline/model_builders.cpp 与 src/pipeline/model_builders.cppflux→VERSION_FLUXsd3→VERSION_SD3flux2→VERSION_FLUX2wan→VERSION_WAN2Qwen-Image 2D VAE 采用 Wan 系列 VAE 布局。因为 PiD 扩散检查点本身不携带 VAE 格式信息若--vae-format与 VAE 实际 latent 布局不匹配会导致参考图编码出的 latent 与扩散模型的输入预期不一致产生错误结果——这也是官方文档将其列为最重要注意事项的原因。源码级原理PixelDiT 是如何工作的配置自动检测PiD 与 PiD 1.5Pid::PixelDiTConfig::detect_from_weights会在加载权重时自动识别版本若权重中存在lq_proj.pit_head.weight则判定为PiD 1.5pit_lq_inject true否则为原版PiD并在日志中打印pid: version 1.5或pid: version 1见 src/model/diffusion/pid.hpp。同时它还从权重张量形状推导patch_depth、pixel_depth、patch_mlp_hidden_dim、LQ 通道数等关键结构参数PiD 1.5 的 LQ 注入路径中latent_proj_in_channels 16时使用 16 通道、down factor 8 的 LQ 配置为 32 时使用 128 通道、down factor 16、unpatchify factor 2 的配置并将 RoPE 参考网格扩展为 128×128开启replicate_paddinglq_gate_per_token通过gate_modules.0.content_proj.weight的最后一维是否为 1 判定。双分支架构patch 分支 pixel 分支从 src/model/diffusion/pid.hpp 的PixelDiT::forward可以看到模型由两大处理流组成patch 分支高维语义输入像素图先patchify为 16×16 patch token经s_embedder嵌入文本 token 经y_embedder嵌入并叠加可学习的位置嵌入后在patch_depth默认 14个MMDiTBlockT2I中与图像 token 做联合注意力MMDiTJointAttention图像/文本各自使用 RMSNorm 与 adaLN 调制MLP 为 SiLU 门控的FeedForward。pixel 分支像素精修pixel_depth默认 2个PiTBlock在完整像素网格上工作通过compress_to_attn/expand_from_attn把 patch 内像素压缩到注意力维度做自注意力再展开回像素最后由FinalLayer输出 RGB 并通过unpatchify还原为像素图。值得注意的是默认配置in_channels 3、hidden_size 1536、pixel_hidden_size 16、patch_size 16、txt_embed_dim 2304、txt_max_length 300等见 src/model/diffusion/pid.hpp表明该模型直接处理 3 通道像素空间——这与像素空间扩散解码器的定位一致。LQ 潜空间注入与 sigma-aware gatePiD 1.5 的核心增强是LQProjection2D参考图像编码得到的 latent 经过卷积下采样与残差块PiDResBlock提取 LQ低质量特征在patch_depth层中每隔lq_interval默认 2层通过SigmaAwareGate注入扩散主干见 src/model/diffusion/pid.hpp 与 src/model/diffusion/pid.hpp。SigmaAwareGate的开关信号是content_logit减去alpha * sigma后过 sigmoid——即注入强度随噪声水平动态调节噪底高时门控减弱、噪底低时加强使参考信息在去噪后期发挥更大作用。四类位置编码PiDRunner::build_graph见 src/model/diffusion/pid.hpp在构图时预生成四组位置编码pos_img图像 token 的二维交错 RoPEtheta10000scale16参考网格来自配置PiD 1.5 为 128×128pos_txt文本 token 的一维 RoPEtheta10000pixel_pos_full完整像素网格的绝对位置x/y 各半维度的 timestep embeddingpixel_pos_comp压缩后像素注意力的二维 RoPE。采样流程中的特殊处理在 src/pipeline/diffusion_engine.cpp 中PiD 还享有多处专门适配预测类型为flow 预测FLOW_PRED默认 flow shift 为 1.5见 src/pipeline/diffusion_engine.cpp配合--cfg-scale 1.0的官方 4 步用法get_vae_scale_factor()对 PiD 返回1见 src/pipeline/diffusion_engine.cpp——解码直接在像素空间完成不再有 VAE 8 倍下采样概念get_latent_channel()对 PiD 返回3见 src/pipeline/diffusion_engine.cpp即 RGB 三通道参考图编码阶段PiD跳过参考图预缩放resize_before_vae对 PiD 不生效见 src/pipeline/image.cpp直接以原始参考图编码 latent若未提供任何参考图则报错PiD requires a reference image并中止见 src/pipeline/image.cpp。使用注意事项-r/--ref-image为必填项。PiD 使用第一张参考图像编码出的 latent 作为源条件若传多张则取第一张源码中compute()使用diffusion_params.ref_latents-front()见 src/model/diffusion/pid.hpp。--vae-format必须与 PiD 检查点所用 VAE 的 latent 布局匹配Flux→flux、SD3→sd3、Flux.2→flux2、Qwen-Image→wan。使用独立 VAE 文件时尤其重要因为 PiD 扩散检查点本身不携带 VAE 格式信息。tokenizer 必须外置将 Gemma 2 2B 的tokenizer.json保存为tokenizer_gemma2.json并传入--tokenizer缺失时初始化失败不会回退到内嵌 tokenizer。输出分辨率与显存直接相关官方示例为 2048×20484 步实际部署请结合自身硬件调整-H/-W必要时使用--diffusion-fa降低注意力显存占用。使用前请核对官方模型卡首次发布时的官方权重为 NSCLv1 非商业许可。延伸阅读docs/pid.mdPiD 官方使用文档本文依据docs/tokenizers.md外部 JSON tokenizer 的 CLI 与 C API 用法、支持组件清单src/model/diffusion/pid.hppPixelDiT 完整实现配置检测、双分支架构、LQ 注入、位置编码src/pipeline/diffusion_engine.cppPiD 的 flow 调度、VAE scale、latent 通道与参考图管线适配src/pipeline/model_builders.cppPiD 条件器/扩散模型/VAE 的构建与--vae-format映射examples/common/common.cpp--vae-format、--diffusion-fa、-r/--ref-image等 CLI 参数定义。赞分享人工智能大模型本地部署推理引擎媒体生成【免费下载链接】stable-diffusion.cppDiffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C项目地址https://gitcode.com/GitHub_Trending/st/stable-diffusion.cpp点击查看免费下载相关推荐探索未来图像生成稳定扩散stable-diffusion.cpp探索未来图像生成稳定扩散stable diffusion.cpp 在不断发展的AI世界里创新的技术正在改变我们对艺术和创造力的理解。今天让我们一起深入人工智能大模型本地部署推理引擎媒体生成PaddleHub Stable Diffusion 文生图模块实战CLIPUNetVAE 潜在扩散模型安装、API 调用与服务部署PaddleHub Stable Diffusion 文生图模块实战CLIPUNetVAE 潜在扩散模型安装、API 调用与服务部署 本文是一篇面向 Pa人工智能大模型微调模型推理服务高效纯粹的C实现稳定扩散模型——stable-diffusion.cpp高效纯粹的C实现稳定扩散模型——stable diffusion.cpp ! 项目Logo ./assets/cat_with_sd_cpp_42.png人工智能大模型本地部署推理引擎媒体生成上一篇3分钟快速上手用ChromeKeePass告别密码记忆烦恼下一篇字节跳动重磅发布M3-Agent-Control大模型328亿参数开启AI普惠新纪元创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考
返回列表