stable-diffusion.cpp 的 FLUX.2 Klein 9B 分步
核心理念2026/7/7每次仅加载一个模型中间结果暂存于系统内存最终输出才写入磁盘。与 ComfyUI / sd-cli 一次性加载所有模型的策略不同分步管线确保每一步骤可独占全部资源尤其是显存。架构图textStep 1 Step 2 Step 3 ┌──────────────┐ ┌──────────────┐ ┌──────────────┐ │ 加载 Qwen3 │ │ 加载 DiT │ │ 加载 VAE │ │ text encoder│ │ diffusion │ │ decode │ │ │ │ │ │ │ │ prompt ─────→│ cond │ cond ───────→│ latent │ latent ─────→│ img │ (CPU 5GB) │ float[] │ (GPU 3-4GB) │ float[] │ (GPU 0.5GB) │ png │ │ │ │ │ │ │ ↓ 释放 Qwen3 │ │ ↓ 释放 DiT │ │ ↓ 释放 VAE │ │ VRAM: 0 │ │ VRAM: 0 │ │ 写磁盘完成 │ └──────────────┘ └──────────────┘ └──────────────┘ 内存中传递: cond (float array) → latent (float array) → image (sd_image_t)具体改动给 DLL 加三个导出函数1. sd_encode_condition — 只跑文本编码将 prompt 编码为 conditioning tensor并以平铺的 float 数组返回。cSD_API bool sd_encode_condition( sd_ctx_t* sd_ctx, const char* prompt, const char* negative_prompt, const sd_lora_t* loras, int lora_count, float** cond_data, // 输出condition float 数组调用者 free int64_t* cond_size // 输出数组元素个数 );需要暴露StableDiffusionGGML::get_learned_condition()原私有方法。cond_data包含c_crossattnc_vectorc_concat的序列化拼接。返回后调用者需调用free_sd_ctx()释放 Qwen3 模型。2. sd_sample — 只跑采样输入 condition输出 latent。cSD_API bool sd_sample( sd_ctx_t* sd_ctx, const float* cond_data, int64_t cond_size, int width, int height, int steps, float cfg_scale, int64_t seed, float** latent_data, // 输出latent float 数组 int64_t* latent_size );需要暴露StableDiffusionGGML::sample()原私有方法。内部反序列化cond_data还原为SDCondition结构。latent_data为采样结果例如 FLUX.2 的 latent 尺寸为 64×64×16。可通过--backend diffusionvulkan1指定后端。3. sd_decode_latent — 只跑 VAE 解码输入 latent输出最终图像。cSD_API sd_image_t sd_decode_latent( sd_ctx_t* sd_ctx, const float* latent_data, int64_t latent_size );需要暴露StableDiffusionGGML::decode_first_stage()原私有方法。可通过--backend vaevulkan1让 VAE 在 GPU 上运行模型仅 164 MB。调用方主程序逻辑text1. 创建 sd_ctx仅传入 --llmQwen3其余路径置空 sd_ctx_params.llm_path flux2-klein-9b-uncensored-q4_k_m.gguf sd_ctx_params.diffusion_model_path NULL sd_ctx_params.vae_path NULL ctx new_sd_ctx(params) 2. sd_encode_condition(ctx, prompt, loras, cond_data, cond_size) 此时 cond_data 为内存中的 float 数组 3. free_sd_ctx(ctx) // Qwen3 完全释放显存归零 4. 新建 sd_ctx仅传入 --diffusion-modelDiT sd_ctx_params.diffusion_model_path flux-2-klein-9b-Q4_0.gguf sd_ctx_params.llm_path NULL sd_ctx_params.backend diffusionvulkan1 ctx new_sd_ctx(params) 5. sd_sample(ctx, cond_data, cond_size, 512, 512, 4, 1.0, 42, latent_data, latent_size) 此时 latent_data 存于内存中 6. free(cond_data) // 释放 condition free_sd_ctx(ctx) // DiT 完全释放显存归零 7. 新建 sd_ctx仅传入 --vae sd_ctx_params.vae_path flux2-vae.safetensors sd_ctx_params.backend vaevulkan1 ctx new_sd_ctx(params) 8. img sd_decode_latent(ctx, latent_data, latent_size) stbi_write_png(output.png, img) 9. free(latent_data) free_sd_images(img, 1) free_sd_ctx(ctx) // VAE 释放每步内存占用步骤加载模型大小VRAMRAM备注1Qwen3 文本编码器5.0 GB0 GB5.0 GBCPU 推理不占显存释放——0 GB0 GB回归零2DiT (Q4_0)5.3 GB~3 GB0 GB权重 offload 至 GPU释放——0 GB0 GB回归零3VAE164 MB0.5 GB0 GB全量置于 GPU总 VRAM 峰值~3 GB远低于 RX 580 的 8 GB 上限对 img2img / inpainting 的支持在 Step 1 与 Step 2 之间插入一步即可textStep 1.5: VAE 编码原图 加载 VAE可复用 Step 3 逻辑 原图 → VAE encode → init_latent内存 float[] 随后 Step 2 的 sd_sample 接收 init_latent cond 作为输入此额外步骤耗时约 3~5 秒VAE 编码走 GPU。编译方法bashgit clone https://github.com/leejet/stable-diffusion.cpp cd stable-diffusion.cpp mkdir build cd build cmake .. -DGGML_VULKANON -DCMAKE_BUILD_TYPERelease cmake --build . --config Release编译产出build/bin/Release/stable-diffusion.dll→ 替换D:\files\FLUX.2\自行编译调用方 exe链接该 DLL需要修改的源文件文件改动include/stable-diffusion.h增加 3 个SD_API函数声明src/stable-diffusion.cpp实现这 3 个函数调用内部私有方法src/stable-diffusion.h内部将encode_first_stage()、sample()、decode_first_stage()设为 public 或添加 public wrapper与 ComfyUI / sd-cli 对比ComfyUIsd-cli 一次加载本方案模型加载方式全加载全加载分步加载中间结果显存常驻显存常驻内存 float arrayVRAM 峰值高~6-7 GB中~3 GB低~3 GBimg2img 额外开销小均在显存小均在显存略大多一次 VAE 加载跨 prompt 复用 condition节点缓存不支持代码层手动缓存控制粒度节点级CLI 参数级函数调用级

相关新闻

机器学习核心术语实战指南:从数据到模型,避坑与评估全解析

机器学习核心术语实战指南:从数据到模型,避坑与评估全解析

1. 从零开始:为什么我们需要先搞懂术语? 干了这么多年技术,带过不少新人,也看过很多项目从起步到翻车。我发现一个特别普遍的现象:很多朋友一上来就想跑通某个酷炫的模型,或者复现一篇论文的代码&#xff0…

2026/10/17 2:56:57 阅读更多 →
Linux之线程(二)

Linux之线程(二)

线程所独有的虽然线程共享进程绝大部分数据,但为了实现独立调度执行,每条线程都有独属于自己的私有资源:线程唯一标识 ID 内核层面的 LWP、用户态 pthread_t 线程 ID,用来区分同进程下不同执行流;寄存器上下文 程序运行…

2026/10/20 2:41:10 阅读更多 →
Matt Pocock skills 仓库全解析:35 个 AI 编码技能的安装方式与常用推荐

Matt Pocock skills 仓库全解析:35 个 AI 编码技能的安装方式与常用推荐

Matt Pocock skills 仓库全解析:35 个 AI 编码技能的安装方式与常用推荐 一、安装方式 仓库是给 AI 编码工具(Claude Code、Codex 等)用的技能包,不是普通浏览器插件。 # Claude Code 插件(只读、自动更新)…

2026/10/18 15:14:09 阅读更多 →

最新新闻

2028年AI智能体靠技能库与反复练习学会复杂工作

2028年AI智能体靠技能库与反复练习学会复杂工作

1. 从“堆参数”到“攒技能”:AI进化路线的拐点1.1 数据墙后面,模型遇上了“聪明但笨拙”的瓶颈过去几年,AI想变强靠的是一条非常简单的路线:做大模型、喂更多数据、堆更多算力。这条路成就斐然,但走到今天&#xff0c…

2026/10/20 13:41:59 阅读更多 →
AI智能健身镜开发实战:实时动作纠正与评分系统全解析

AI智能健身镜开发实战:实时动作纠正与评分系统全解析

去年有段时间我下定决心在家规律练深蹲和硬拉,结果不到两周腰就不太舒服。倒不是重量上出了问题,是动作模式从一开始就走偏了——录视频回看才发现自己下蹲时膝盖内扣、下背松散,而这些坏习惯在没有教练盯着的情况下,练得越勤&…

2026/10/20 13:41:59 阅读更多 →
AI制作治愈系动画短片全流程:从脚本到成片实操指南

AI制作治愈系动画短片全流程:从脚本到成片实操指南

你有没有想过,用AI做一条治愈系动画短片?不是那种需要动画师一张张手绘的严肃项目,而是从脚本、画面、动态、配音到成片,一个人在两三天内就能完成的那种。我最近完整跑了一遍这个流程,从零做了几条两分钟以内的治愈系…

2026/10/20 13:41:59 阅读更多 →
OpenJDK 11.0.10 aarch64 Linux 兼容性避坑指南

OpenJDK 11.0.10 aarch64 Linux 兼容性避坑指南

简介:本资源是面向ARM64架构Linux服务器与嵌入式开发者的OpenJDK 11.0.10官方构建版,专为aarch64平台深度适配,解决Java开发者在国产化服务器、树莓派4/5、鲲鹏等ARM生态中缺乏稳定、开箱即用JDK环境的痛点。压缩包共508个文件,涵…

2026/10/20 13:41:59 阅读更多 →
JSP+SSM网上购物商城系统实战:从架构设计到部署上线

JSP+SSM网上购物商城系统实战:从架构设计到部署上线

如果让我挑一个最适合初学 JavaWeb 的完整案例,网上购物商城系统绝对能排进前三。这个基于 JSP 和 SSM(Spring、SpringMVC、MyBatis)的商城项目,覆盖了用户从注册、浏览商品、加购、下单到后台管理的完整链路,既有前端…

2026/10/20 13:41:59 阅读更多 →
从日榜看技术趋势:Rust崛起与AI应用层霸榜的深度拆解

从日榜看技术趋势:Rust崛起与AI应用层霸榜的深度拆解

1. 日榜项目的整体观察与拆解思路每天早上刷一遍热榜,已经成了我这些年做技术选型和趋势判断的固定动作。2026年10月8日这一期的日榜,整体看下来有一个很明显的特征:工具类项目占比超过六成,AI 应用层项目继续霸榜,但底…

2026/10/20 13:40:50 阅读更多 →

日新闻

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

CLRC663芯片Pin-to-Pin替代实战:从评估到量产全记录

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
ESP32舵机控制指南:原理、多路驱动与避坑实战

ESP32舵机控制指南:原理、多路驱动与避坑实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →
位移法实现一阶低通滤波:单片机ADC采样降噪实战

位移法实现一阶低通滤波:单片机ADC采样降噪实战

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 1:01:30 阅读更多 →

周新闻

基于GMM的语音识别系统原理与MATLAB实现详解

基于GMM的语音识别系统原理与MATLAB实现详解

说到基于高斯混合模型(GMM)的语音识别系统,很多人第一反应就是一堆数学公式,觉得门槛很高。但如果你真的在MATLAB里把它落地跑通,会发现核心其实就是三件事:把声音变成特征向量,用GMM给每个类别…

2026/10/20 10:02:13 阅读更多 →
数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理入门:反白、灰度化、调色板修改与导出txt实践

数字图像处理这四个字听起来挺唬人,但落到具体操作上,无非就是让计算机按你的想法“摆弄”像素。我在一个模拟项目X里用了一套特别经典的基础处理流程:对图像做反白、改调色板、彩色转灰度,最后把像素数据导出成txt文件。单看每一…

2026/10/19 17:32:41 阅读更多 →
机器人大脑技术盘点:具身智能的感知、决策与数据闭环

机器人大脑技术盘点:具身智能的感知、决策与数据闭环

如果你的信息流最近也天天刷到“机器人大脑”这个词,你会发现一个很有意思的现象:每个人说的“大脑”根本不是同一个东西。有人指的是大语言模型,有人指的是运动控制系统,还有人指的是能理解物理世界的端到端模型。在2026年这个时…

2026/10/20 2:50:50 阅读更多 →

月新闻

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

我发现了一个新思路:用 Remotion + Claude Code 像写代码一样自动化生成短视频

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 10:02:08 阅读更多 →
Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

Windows下 Codex 中 Chrome 和 Computer Use 插件不可用问题排查及解决参考方式:TaoToken 统一 Key 配置与验证

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:17 阅读更多 →
黑夜航拍船只数据集训练YOLOV5模型全流程解析

黑夜航拍船只数据集训练YOLOV5模型全流程解析

/* MD / 富文本中的 .toc(含博客园搬家等嵌套结构);.toc-box 在侧栏,不受影响 */#content_views .toc,/* 编辑器常在目录前后插入空 p(:empty 仍占 20px),一并去掉避免顶空隙 */#content_views.markdown_views > p:empty:has(+ .toc),#content_views.markdown_views …

2026/10/20 9:50:45 阅读更多 →