news 2026/9/28 13:03:03

Lens 模型推理指南:在 stable-diffusion.cpp 中运行 Lens 与 Lens Turbo 文生图

作者头像

张小明

前端开发工程师

1.2k 24
文章封面图
Lens 模型推理指南:在 stable-diffusion.cpp 中运行 Lens 与 Lens Turbo 文生图
  • 人工智能
  • 大模型
  • 本地部署
  • 推理引擎
  • 媒体生成

【免费下载链接】stable-diffusion.cpp

Diffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C++

项目地址:https://gitcode.com/GitHub_Trending/st/stable-diffusion.cpp
点击查看免费下载

Lens 是 stable-diffusion.cpp 中一类以Lens 扩散 Transformer + FLUX.2 VAE + GPT-OSS-20B 文本编码器组合而成的新型文生图模型。本文以仓库 docs/lens.md 为主线,完整介绍权重下载、GPT-OSS 外部 tokenizer 配置、CLI 实战命令与关键参数,并结合 src/model/diffusion/lens.hpp 的源码剖析其网络结构与推理实现,帮助你在一套纯 C/C++ 推理框架中稳定跑通 Lens 和蒸馏版 Lens Turbo。

模型架构总览

Lens 的组成非常明确,文档给出了三块核心组件:

组件用途说明
Lens 扩散 Transformer去噪主干网络采用类似 Flux 的双流(图像/文本联合注意力)DiT 结构
FLUX.2 VAE图像自编码器负责 latent 与像素空间的相互转换,与 FLUX.2 共用flux2_ae权重
GPT-OSS-20BLLM 文本编码器以大型语言模型取代传统 CLIP/T5,语义理解能力更强

从源码看,Lens 的扩散主干被完整实现在 src/model/diffusion/lens.hpp 的Lens::LensModel与Lens::LensRunner中,并在 src/pipeline/model_builders.cpp 中通过sd_version_is_lens(version)判定后,以LLMEmbedder(文本编码侧)+Lens::LensRunner(扩散侧)的组合构建管线,与文档所述的三段式架构完全吻合。

权重下载清单

Lens 推理共需要 4 类权重文件,请按下列清单逐一准备:

  1. Lens 扩散模型(safetensors)
    • 从 Comfy-Org/Lens 仓库的diffusion_models目录下载lens_bf16.safetensors(普通版)与lens_turbo_bf16.safetensors(Turbo 蒸馏版)。
  2. FLUX.2 VAE(safetensors)
    • 从 black-forest-labs/FLUX.2-dev 目录下载flux2_ae.safetensors,即 docs/flux2.md 中使用的同一 VAE。
  3. GPT-OSS-20B 文本编码器(gguf)
    • 从 unsloth/gpt-oss-20b-GGUF 下载 GGUF 量化版,例如gpt-oss-20b-UD-Q8_K_XL.gguf。
  4. GPT-OSS-20B 的tokenizer.json
    • 从 openai/gpt-oss-20b 目录下载,保存为tokenizer_gpt_oss.json,必须与所选 GPT-OSS 检查点匹配。

推荐将文件按以下目录结构组织,便于命令行引用:

models/ ├── diffusion_models/ │ ├── lens_bf16.safetensors │ └── lens_turbo_bf16.safetensors ├── text_encoders/ │ └── gpt-oss-20b-UD-Q8_K_XL.gguf ├── vae/ │ └── flux2_ae.safetensors └── tokenizers/ └── tokenizer_gpt_oss.json

为什么 Lens 必须使用外部 tokenizer.json

与大多数自带 tokenizer 的模型不同,Lens 和 Lens Turbo 的 GPT-OSS tokenizer 并未内嵌在 sd.cpp 中。文档明确指出:保存为tokenizer_gpt_oss.json后必须通过--tokenizer显式传入,初始化时若缺少主 tokenizer 会直接失败。

这背后的实现约束可以从源码得到印证:src/model/te/llm.hpp 中明确抛出异常——"GPT-OSS, Gemma 2 and LLaDA2 require an external tokenizer.json in the main tokenizer slot",且GPT_OSS_20B被列入LLMArch架构枚举(见 src/model/te/llm.hpp)。

详细的 CLI 与 C API 用法请参阅 docs/tokenizers.md,要点如下:

  • --tokenizer FILE作用于"主 LLM/BPE 编码器"槽位(Gemma 2/3、Qwen 2/3、Mistral、GPT-OSS 等),普通路径等价于main=FILE;
  • 可以多槽位组合,如--tokenizer main=main.json,clip-l=clip_l.json;
  • JSON 文件的 vocabulary/merges/added tokens 必须与文本编码器检查点匹配,仅凭"ID 不超出 embedding 表"无法证明词汇表语义一致;
  • 文件加载发生在文本编码器创建时,此时不会加载内嵌词表。

CLI 实战:运行 Lens

文档给出的 Lens 完整命令(Windows 路径)如下:

.\bin\Release\sd-cli.exe --diffusion-model ..\models\diffusion_models\lens_bf16.safetensors --llm "..\models\text_encoders\gpt-oss-20b-UD-Q8_K_XL.gguf" --tokenizer ..\models\tokenizers\tokenizer_gpt_oss.json --vae ..\models\vae\flux2_ae.safetensors --cfg-scale 5.0 -p "A crystal dragon soaring through an aurora borealis sky, its entire body made of transparent faceted crystal refracting the green and purple aurora light into rainbow spectra, ice particles trailing from its wings, high fantasy digital art" --diffusion-fa -v

在 Linux/macOS 上等价写法为(按上文目录结构,且bin/sd-cli为编译产物所在目录):

./bin/sd-cli --diffusion-model models/diffusion_models/lens_bf16.safetensors \ --llm models/text_encoders/gpt-oss-20b-UD-Q8_K_XL.gguf \ --tokenizer models/tokenizers/tokenizer_gpt_oss.json \ --vae models/vae/flux2_ae.safetensors \ --cfg-scale 5.0 \ -p "A crystal dragon soaring through an aurora borealis sky, its entire body made of transparent faceted crystal refracting the green and purple aurora light into rainbow spectra, ice particles trailing from its wings, high fantasy digital art" \ --diffusion-fa -v

CLI 实战:运行 Lens Turbo

Lens Turbo 是蒸馏加速版本,核心差异是--cfg-scale必须降到 1.0,并配合--steps 4使用极少的去噪步数:

.\bin\Release\sd-cli.exe --diffusion-model ..\models\diffusion_models\lens_turbo_bf16.safetensors --llm "..\models\text_encoders\gpt-oss-20b-UD-Q8_K_XL.gguf" --tokenizer ..\models\tokenizers\tokenizer_gpt_oss.json --vae ..\models\vae\flux2_ae.safetensors --cfg-scale 1.0 -p "A crystal dragon soaring through an aurora borealis sky, its entire body made of transparent faceted crystal refracting the green and purple aurora light into rainbow spectra, ice particles trailing from its wings, high fantasy digital art" --diffusion-fa -v --steps 4

关键参数详解

参数取值示例作用与建议
--diffusion-modellens_bf16.safetensors/lens_turbo_bf16.safetensors指定 Lens/Lens Turbo 扩散模型权重
--llmgpt-oss-20b-UD-Q8_K_XL.gguf指定 GPT-OSS-20B 文本编码器 GGUF
--tokenizertokenizer_gpt_oss.json指定外部 GPT-OSS tokenizer,必填
--vaeflux2_ae.safetensors指定 FLUX.2 VAE 权重
--cfg-scaleLens 用5.0,Lens Turbo 用1.0无分类器引导强度;Turbo 蒸馏模型必须为 1.0
--stepsTurbo 用4采样步数,蒸馏版建议极少步数
--diffusion-fa-为扩散模型启用 Flash Attention,降低显存/内存压力
-v-输出详细日志,便于观察加载与推理过程

补充说明:

  • GPT-OSS-20B 是约 200 亿参数级别的 MoE 语言模型,建议使用 Q8_K 等高保真量化 GGUF;若显存不足,可参考其他文档中常见的--offload-to-cpu选项将部分权重驻留 CPU;
  • --cfg-scale与--steps的取值直接影响生成质量:Lens 普通版用 5.0 保持提示词遵循度,Lens Turbo 则必须用 1.0 才能与蒸馏权重匹配,切勿混用。

源码级实现剖析

配置自动探测

Lens::LensConfig::detect_from_weights(src/model/diffusion/lens.hpp)会在加载权重时自动推导超参数:由img_in.weight得到in_channels(默认 128),由proj_out.weight与 patch size 推导out_channels(默认 32),由transformer_blocks.0.attn.norm_q.weight得到attention_head_dim(默认 64),并按txt_in.weight与joint_attention_dim(2880)之比得到selected_layer_count(默认 4)。其默认配置为 48 层 Transformer、24 个注意力头、axes_dim = {8, 28, 28}、RoPEtheta = 10000。

双流联合注意力 Transformer

LensTransformerBlock(src/model/diffusion/lens.hpp)与LensJointAttention(src/model/diffusion/lens.hpp)展示了核心结构:图像序列与文本序列各自投影出 Q/K/V,经 RMSNorm 归一化后拼接在一起做联合注意力,再按图像/文本视图拆开分别输出;块内以 AdaLN 调制(img_mod.1/txt_mod.1输出 6 组调制系数)与 Gated MLP(LensGateMLP,即 SwiGLU 变体)完成特征变换。这解释了为什么 Lens 需要 LLM 级别的文本编码——txt_in的输入维度是joint_attention_dim * selected_layer_count(2880×4),即拼接了 GPT-OSS 多个层的隐状态来驱动条件注入。

图构建与位置编码

LensRunner::build_graph(src/model/diffusion/lens.hpp)以LENS_GRAPH_SIZE = 40960开辟计算图,调用Rope::gen_lens_pe依据图像分辨率与文本长度生成轴向位置编码,并将x、timesteps、context三路输入送入LensModel::forward,经过 patch 化(patch size 2)、img_in/txt_in投影、48 层联合注意力与 AdaLN 归一化后由proj_out还原为 latent。get_desc()返回"lens",供日志与调试区分。

管线注册

在 src/pipeline/model_builders.cpp 中,Lens 分支使用LLMEmbedder作为 conditioner(负责调用 GPT-OSS 编码提示词),配合Lens::LensRunner完成去噪;模型版本VERSION_LENS与判定函数sd_version_is_lens定义于 src/model.h 与 src/model.h。

C API 使用提示

如果你通过 C API 集成 Lens,需要把外部 tokenizer 路径写入sd_ctx_params_t::tokenizer。该字段接受与 CLI--tokenizer相同的字符串(如main=tokenizer_gpt_oss.json),TokenizerConfig会在文本编码器初始化时解析并校验;对 Lens/PiD 这类模型,主 tokenizer 路径必须非空,否则初始化失败(详见 docs/tokenizers.md)。

sd_ctx_params_t params; sd_ctx_params_init(&params); params.tokenizer = "main=tokenizer_gpt_oss.json";

常见问题与注意事项

  • 缺少 tokenizer 导致初始化失败:必须下载 openai/gpt-oss-20b 的tokenizer.json并重命名为tokenizer_gpt_oss.json,用--tokenizer传入主槽位;这是 Lens 与 PiD 等模型的内嵌约束,无法省略。
  • Turbo 版输出异常:确认--cfg-scale 1.0与--steps 4均已设置;蒸馏模型对这两项参数有严格要求。
  • 文本编码器与 tokenizer 不匹配:请从同一来源下载配套的 GPT-OSS 检查点与词表,避免 ID 映射错位导致生成内容漂移。
  • VRAM 限制:GPT-OSS-20B 体量较大,可在命令中加入--offload-to-cpu并配合--diffusion-fa降低显存占用,具体以你机器实际可用显存为准。

至此,你已经掌握了 Lens / Lens Turbo 在 stable-diffusion.cpp 中的完整推理方案:从四类权重准备、外部 tokenizer 配置,到两条可直接运行的 CLI 命令与背后 DiT 架构的源码印证,足以基于仓库源码进一步定制与调试。

  • 人工智能
  • 大模型
  • 本地部署
  • 推理引擎
  • 媒体生成

【免费下载链接】stable-diffusion.cpp

Diffusion model(SD,Flux,Wan,Qwen Image,Z-Image,...) inference in pure C/C++

项目地址:https://gitcode.com/GitHub_Trending/st/stable-diffusion.cpp
点击查看免费下载
上一篇:MAA 明日方舟一键长草完整指南:5 分钟装好并跑通自动日常
下一篇:nltk_data最佳实践:10个技巧提升你的NLP项目效率

创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考

版权声明: 本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若内容造成侵权/违法违规/事实不符,请联系邮箱:809451989@qq.com进行投诉反馈,一经查实,立即删除!
网站建设 2026/9/28 13:02:50

Navicat实现MySQL自动备份的完整实践指南

搞MySQL的,早晚得面对备份这件事。我见过不少开发和运维朋友,平时靠着Navicat手动导出SQL文件,觉得数据库不大、出不了事。可真到了凌晨两点线上库被误删、磁盘突然损坏、或者版本升级把数据搞坏的那一天,你就会发现手里能用的备份…

作者头像 李华
网站建设 2026/9/28 13:01:57

Go2机器人图像处理:ROS2通信与OpenCV适配实战指南

1. 为什么Go2不是“换个摄像头就能跑OpenCV”的玩具——从ROS2底层重新理解机器狗图像处理的起点很多人第一次拿到宇树Go2,第一反应是:“这不就是个带腿的树莓派?装上OpenCV,写个颜色识别,让它追个红球不就完事了&…

作者头像 李华
网站建设 2026/9/28 13:01:41

PostgreSQL动态分区裁剪:原理、执行计划与实战调优

做数据库这一行,跟分区表打交道几乎是躲不开的。业务量一上来,单表动辄几亿行,就算索引建得再好,查询响应时间也会被拖到让人坐不住。而在PostgreSQL里,衡量一张分区表设计得好不好,往往不是看它分了多少个…

作者头像 李华
网站建设 2026/9/28 13:01:39

Python三维点云激光分类源码:KNN邻域与PCA特征提取及SVM实战

简介:这是一份面向计算机、通信、人工智能、自动化等专业学生与从业者的三维点云激光分类项目源码,基于Python实现,可识别建筑、树木等地物类别,适合作为毕业设计、课程大作业或进阶练手素材。压缩包共15个文件,约5.84…

作者头像 李华
网站建设 2026/9/28 13:01:07

Java在企业级AI落地中的实战价值与框架选型指南

把“人工智能”和“Java”这两个词放一块儿,不少人第一反应是“不对味”。毕竟翻开任何一本AI入门教材,满屏都是Python;打开招聘网站,算法岗也清一色写着“熟悉PyTorch/TensorFlow”。但你只要在企业里真正做过AI落地,…

作者头像 李华
网站建设 2026/9/28 13:00:42

npm ERESOLVE 错误排查:从依赖冲突原理到三种解决方案

一个晴朗的下午,我在一个新项目里敲下npm install,结果屏幕瞬间被一大段红色刷屏。开头那句npm ERR! code ERESOLVE格外扎眼,后面跟着一长串While resolving:、Found:、Could not resolve dependency:的内容。说实话,这玩意儿在 n…

作者头像 李华