近几天忙别的事情,这个刚开头的Build In Public项目停滞了十几天。
也不算是一点进展都没有吧。
核心功能已经可用,但是效果不够好。
不过还是要先做个demo出来,不要再死扣细节了,没必要。(必须时刻想着这一点!总是被困在局部里!)
进度总结
1. 故事生成
模型从qwen2.5:7b切换到qwen2.5:3b,生成故事更快。但是需要更多约束,暂时没有过多调整。
4分钟后开始流式输出,2分钟后结束。比起之前的12分钟已经提升了一倍。
生成的故事也是一言难尽,但先保持这样吧,人工审核和修改的情况下还算可以接受。
2. 图像生成
想要在这么旧的硬件上跑图像生成服务本身就非常困难。
经过多次尝试:
试图调用仅有的4G显存,结果不成功,最终还是使用全CPU在计算,风扇转到起飞,电脑仍然快要能煎蛋。
增加线程成功了。
找模型就用了很长时间,总算找到两个能够在我的电脑上运行起来的初始版本模型。stable-diffusion-v1-5-pruned-emaonly-Q4_1.gguf,stable-diffusion-v1-5-pruned-emaonly-Q8_0.gguf,但是要20-30步扩散,太慢,半小时一张图,这调试难度可以和NASA的火星车有的一拼。
经过对比,我现在选择了dreamshaper_8LCM-iq4_nl-imv2.gguf。
生成一张图片的时候直接从半小时以上下降到2分钟之内,相当惊喜了。
增加参数设置和负向提示词,效果有明显提升。
效果明显不如原版,粗糙很多,但对于儿童绘本来说还凑合,后续会再通过提示词和参数做调整,或者更换其它模型。
现在主要的故事生成和图片生成算是可以用了,接下来开始处理工作流的整合开发。
学习到的内容
原本对Stable Diffusion不是很熟悉,直到亲自动手,迟了这么久,才了解了一些基本概念。
Stable Diffusion本身
Stable Diffusion.cpp本质上是一个专注于“执行”的轻量级推理引擎,它的优势在于占用资源少,并且提供了CLI能力,可以集成在工作流和软件调用中。
基础模型与生成原理
Stable Diffusion要运行,需要基于“潜在扩散模型”(Latent Diffusion Model, LDM)训练出来的模型。我前面用的两个就是这种模型。
它是基于一张全是噪声的图片出发,根据提示词的内容,逐渐减少噪声,最终得到生成的图片。每一步都是在减少噪声,所以如果步数不够,生成的图片就不够好;步数太多,是对计算资源和时间的浪费。
像我所需要的水彩画,需要的步数就少一些;但如果训练接近真实的场景,比如服装或者肌肤纹理,需要的步数就会更多。
基础的模型是用大量文本-图片数据训练出来的。针对不同情况的微调,实际上就是增加或者修改一些数据集再增加一个训练步骤。
这样大模型就可以有指定倾向的图片风格。
也可以训练另外一个小模型,和原始模型串联起来用,概念上相当于是一个插件。
最主流的轻量级微调技术是 LoRA (Low-Rank Adaptation),它不修改原模型,而是训练一个很小的附加模块(仅几MB到几十MB),使用时可插拔。
但到这里,还属于基础模型的范畴。
加速
在基础模型之外,可以通过知识蒸馏,来减少生成高质量图像所需的步数。以图片质量的略微下降作为交换,把生成过程减少到4-5步,以提高效率。
有两种做法。
一是LCM(潜在一致性模型):通过一种新的训练方式,将一个需要20-50步的标准模型“蒸馏”成一个仅需4-8步就能完成去噪过程的快速模型。蒸馏后的产物 LCM-LoRA 可作为通用加速模块直接用于各种微调模型。
二是SD-Turbo:采用了一种更激进的训练方法,名为 对抗扩散蒸馏(Adversarial Diffusion Distillation, ADD)。在蒸馏过程中引入一个“判别器”网络,迫使学生模型生成足以“以假乱真”的细节图,从而实现在仅需1-4步的极端情况下依然保持高质量输出。
Stable Diffusion的社区很活跃,资源丰富,像这些内容,都有人做好了一体化的整合模型,只要下载就可以用。