【内容摘要】本文在同一台 统一大内存工作站上,对五款本地文生图方案做横向实测对比。除耗时外,引入拉普拉斯方差、局部对比度、饱和度三项客观指标,揭示三个反直觉结论:参数量大不等于质量好、锐度高不等于观感好、色彩发灰是完整版模型通病。文末附可直接套用的评估清单。
【编写目的】帮助读者用数据而非跑分截图做本地文生图引擎选型,降低试错成本。
一、为什么要做这次实测
本地跑文生图,最常被问的问题是:到底该选哪个模型、哪个引擎。网上答案大多是跑分截图,缺少同一台机器上的横向对比。
我用一台工作站(31.6GB 系统内存加 96GB 统一显存池)做了完整实测。把五个候选方案放在同一提示词、同一分辨率下跑了一遍,数据全部来自本机实测,不是推算。
二、实测环境与方法
硬件:96GB 统一显存池。
软件:stable-diffusion.cpp(Vulkan 后端)加 ncnn,分辨率统一 1024 乘 1024。
提示词统一为:a cute corgi dog running on green grass, sunny day。
评价指标除了耗时,还加了三个客观量:拉普拉斯方差(衡量边缘锐度)、局部对比度(衡量细节层次)、饱和度(衡量色彩丰富度)。
三、五个候选方案实测数据
方案一,SDXL-Turbo,2.6B 参数,q8_0 量化,6 步,dpm++2m 采样器。耗时 13 到 15 秒,拉普拉斯 2119,局部对比度 43.3,饱和度 55%。
方案二,SDXL-Turbo 加写实风格词,8 步。耗时 20 秒,拉普拉斯 788,局部对比度 46.4,饱和度 64%。
方案三,Flux.1-schnell,12B 参数,Q4_K_S 量化,4 步。耗时 41 秒,拉普拉斯 195,局部对比度 4.9,饱和度 42%。
方案四,SDXL Base 1.0 完整版,25 步,cfg 5.0。耗时 54 秒,拉普拉斯 1292,饱和度 42%。
方案五,Qwen-Image-2.1,20B 参数,ncnn 引擎,8 步。理论耗时 712 秒,实测三次全部在第 3 到 4 步崩溃。
四、数据背后的三个反直觉结论
结论一,参数量大不等于质量好。
Flux 是 12B,SDXL-Turbo 是 2.6B,参数量差 4.6 倍。但 Flux 的拉普拉斯只有 195,是 SDXL-Turbo 的十一分之一,局部对比度 4.9 对 43.3,差近 9 倍。原因在于 Q4_K_S 是激进量化,对 DiT 架构的细节损伤很大。
结论二,锐度高不等于观感好。
漫画风出图拉普拉斯 2119 很漂亮,但实际观感是扁平色块加粗线条。写实风拉普拉斯只有 788,但饱和度 64%,有真实毛发纹理和光影层次,反而更符合照片质感预期。拉普拉斯方差衡量的是边缘锐利程度,不是画面质感。选型时必须结合饱和度、局部对比度和人眼观感一起看。
结论三,色彩发灰是完整版模型的通病。
SDXL Base 完整版 25 步出图,拉普拉斯 1292 看着不错,但饱和度只有 42%,画面明显发灰。这是不带 refiner 时的固有特性。试过把 cfg 从 5.0 提到 7.0 增强对比度,结果拉普拉斯反而掉到 178,说明 Base 的甜点就在 cfg 5.0 附近,硬调没用。
五、速度与显存的关系实测
同一个 Flux 模型,LLM 驻留时耗时 161 秒,卸载 LLM 独占显存后 70.5 秒,快 2.3 倍。
更极端的例子是批量出图。四格连续出图,LLM 驻留时耗时呈 29.7、52.9、125.5、205.5 秒逐格劣化,最后一格慢 7 倍。改成显存独占后变成 21.7、30.0、20.2、20.0 秒,基本持平。
这个数据说明:生图前清空 LLM 不是优化项,是必选项。红线判断只能防分配失败,防不了性能劣化。
六、长期运行的碎片化问题
连续跑了几十次生图后,出现了一个稳定复现的现象:生图从 13.4 秒劣化到 42.5 秒,三轮数据高度一致。
排查过程:残留进程 0 个,系统内存 23GB 充足,LLM 驻留 0 个,裸跑引擎同样 45 秒。最后重启 LM Studio 服务,立刻恢复到 13.2 秒。
结论是 Vulkan 分配器碎片累积。虽然账本显示显存已释放,但实际分配效率下降。解法是加自愈规则:连续 3 次生图超基准 2 倍,自动重启服务。
七、最终选型清单
如果您的需求是批量草稿、漫剧分镜、快速迭代,选 SDXL-Turbo 漫画风,13 到 15 秒一张,锐度足够。
如果您的需求是成品图、真实质感、照片风格,选 SDXL-Turbo 写实风,20 秒一张,饱和度 64%。
如果您的需求是极致质量且能接受 12 分钟等待,理论上 Qwen-Image 20B 最优,但当前 ncnn 引擎在本机不稳定,实测三次全崩,暂不推荐。
如果您的需求是 Flux 系列,建议用 Q8_0 或 FP8 量化,Q4_K_S 在当前环境画质不可用。
八、评估清单(可直接套用)
1. 先测引擎是否支持量化。不支持量化的引擎,大模型必然慢到不可用。
2. 再测显存独占与共享的耗时差。差 2 倍以上说明必须做独占。
3. 用同一提示词横向对比至少 3 个候选,记录耗时、锐度、对比度、饱和度四项。
4. 单独验证提示词风格词的影响。同一模型换风格后缀,锐度可能差 6 倍以上。
5. 连续跑 20 次以上,观察是否出现逐次劣化。出现即判定碎片化,需加自愈。
6. 批量出图必须测逐格耗时,不能只测单张。逐格劣化是最容易被忽略的坑。
九、几个容易踩的坑
参数误用:sd-cli 的 -t 是 threads 不是 steps,我最初误以为 -t 4 是 4 步出图,实际一直跑默认 20 步,掩盖了 Turbo 模型的真实性能。
加载方式:Flux 必须用 --diffusion-model 参数,-m 不识别 GGUF 格式。
参数叠加负收益:试过 flash attention 加 vae tiling,从 70.5 秒变成 100.9 秒,反而慢 42%。参数不是越多越好,每个都要单独验证。
十、结语
本地文生图没有万能方案,只有匹配场景的方案。把耗时、锐度、对比度、饱和度四项指标和实际观感放在一起看,才能选出真正合适的配置。希望这份清单能帮您少走弯路。
十一、补充:不同分辨率下的表现差异
除了 1024 乘 1024,还测了 512 乘 512 和 768 乘 768 两个档位。
512 乘 512 下,SDXL-Turbo 耗时约 5 到 7 秒,拉普拉斯 1083,局部对比度 28.5。适合快速试稿,但细节明显不足,放大后模糊。
768 乘 768 下,SDXL-Turbo 耗时约 9 到 11 秒,拉普拉斯 1650,局部对比度 36.2。这是性价比甜点,速度和细节平衡得最好。
1024 乘 1024 下,耗时 13 到 15 秒,拉普拉斯 2119,局部对比度 43.3。适合成品输出。
结论:如果只是看构图,512 够用;如果要出成品,必须 1024。中间档 768 适合批量预览。
十二、补充:采样器对质量的影响
同一模型同一提示词,只换采样器,实测数据如下。
euler 采样器:耗时 19.5 秒,拉普拉斯 103.9。速度最快,但锐度最低。
euler 加风格后缀:耗时 20.4 秒,拉普拉斯 1221.8。风格词带来的提升远超采样器本身。
dpm++2m:耗时 24.3 秒,拉普拉斯 1949.3。比 euler 慢 4.8 秒,锐度提升近 19 倍。
dpm++2s_a:耗时 26.1 秒,拉普拉斯 1780.5。略慢于 dpm++2m,锐度反而低。
结论:dpm++2m 是当前模型的最优采样器,多花 5 秒换 19 倍锐度提升,非常划算。
十三、补充:CFG 参数的边界
CFG 是提示词引导强度,调高会增强对提示词的服从度,但过高会导致画面过饱和、细节崩坏。
SDXL-Turbo 实测:CFG 1.0 是甜点,拉普拉斯 2119。CFG 1.5 时拉普拉斯降到 1780,画面开始发硬。CFG 2.0 时拉普拉斯 1239,明显过曝。
SDXL Base 实测:CFG 5.0 是甜点,拉普拉斯 1292。CFG 7.0 时拉普拉斯暴跌到 178,画面完全崩坏。
结论:蒸馏模型必须低 CFG,完整版模型必须中等 CFG,两者不能混用参数。
十四、补充:批量出图的显存管理
批量出图最容易踩的坑是逐张卸载恢复。第一版实现是每张图出完就恢复 LLM,结果四格出图光卸载加载就白烧 100 秒。
正确做法是批量会话模式:整批只卸载一次,批次内不恢复,批次结束统一恢复。
def begin_imagegen_batch(reason):
global _BATCH_MODE
_BATCH_MODE = True
return evict_all_llm(reason=reason)
def end_imagegen_batch():
global _BATCH_MODE
_BATCH_MODE = False
restore_llm()
改造后四格出图从 458.9 秒压到 132.4 秒,提速 71%。
十五、补充:档位切换的冷却机制
连续出图切换档位时,出现过 quality 档偶发失败。排查发现是 fast 档刚跑完,显存还没完全释放,quality 立刻启动就撞车。
解法是加 3 秒冷却:
IMG_COOLDOWN_S = 3.0
_elapsed = time.time() - _LAST_IMG_END[0]
if 0 < _elapsed < IMG_COOLDOWN_S:
time.sleep(IMG_COOLDOWN_S - _elapsed)
加冷却后连续出图 100% 成功。这个坑很小但很致命,批量任务里尤其容易踩。
原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。
如有侵权,请联系 cloudcommunity@tencent.com 删除。