bigASP 🐍
详情
下载文件
关于此版本
模型描述
bigASP 🐍 v2.0
一个写实风格的SDXL微调模型,基于超过600万张高质量照片、共4000万个训练样本,在基础SDXL上微调而成。每张照片均使用JoyCaption生成描述,并用JoyTag进行标签标注。这使得 bigASP 🐍 能够理解从简短简单到冗长细致的各种提示与概念,同时生成高质量的摄影作品。
这是 bigASP 🐍 的第二个版本。我很期待看到社区如何使用这个模型,并了解它的优势与不足。请分享你的生成结果和反馈!
特性
支持自然语言与标签双模式提示:版本2不仅理解 booru 风格的标签,还支持自然语言提示,或两者的任意组合!
SFW 与 NSFW 支持:本版 bigASP 🐍 包含200万张SFW图像与400万张NSFW图像。是穿得体面?还是脱得惊艳?由你决定。
多样性:bigASP 🐍 在经过精心设计的多样化数据集上训练,使其能够生成我们美丽人类种族的各种肤色、体型与形态。告别“千篇一律的脸”!
长宽比分桶支持:横屏、正方形、竖屏,bigASP 🐍 全部ready。
高质量训练数据:大部分训练数据为专业级高清照片,分辨率远超SDXL原生分辨率,均以原始质量下载,无额外压缩。bigASP 🐍 不会错过任何像素。
长提示支持:训练时支持最多225个token的提示词。毕竟,它是“BIG”asp。
(可选)美感/质量评分:与版本1一样,本模型理解质量评分以提升生成效果,例如在提示词开头添加
score_7_up可引导生成质量。更多细节见下文。
版本2新增内容
新增自然语言提示功能:大幅增强对模型的控制能力,解决大量关于v1的反馈,并使模型能理解更多概念。
图像数量增加3倍以上:版本2包含670万张图像,而版本1仅150万张。
新增SFW支持:在数据集中加入了200万张SFW图像,以提升模型实用性并扩展其理解范围。在我的测试中,bigASP 在自然摄影方面表现极佳。
更长训练时间:版本1感觉训练不足,版本2训练了4000万个样本,而版本1为3000万。这显著提升了模型的稳定性。
评分标签现为可选:训练中评分标签被随机丢弃,因此即使不指定评分标签,模型也能正常工作。
更新质量评分模型:我更新了用于图像评分的模型,以略微提升性能并适应新数据范围。在我经验中,“优质”图像的范围现在更广,起始于 score_5。因此,你无需过于苛求评分词,就能获得比以往更丰富的输出。
增加男性相关数据:可能令许多人惊讶,但全球近50%的人口是男性!在我们的模型中他们长期被严重低估!版本2加入了大量聚焦男性形象的图像。虽然仍有改进空间,但已优于v1。
推荐设置
采样器:DPM++ 2M SDE 或 DPM++ 3M SDE
调度器:Kerras 或 指数调度。⚠️ 警告 ⚠️ 使用“正常”调度器会导致输出质量极差。
步数:40
CFG:2.0 或 3.0
扰动注意力引导(ComfyUI等至少支持)有时能提升效果,建议尝试。它对人脸和复杂场景尤其有效,但容易过曝,使用PAG时请降低CFG值。
⚠️ 警告 ⚠️ 如果你从版本1升级,本版本推荐的CFG值低得多。
支持的分辨率(附参考图像数量):
832x1216: 2229287
1216x832: 2179902
832x1152: 762149
1152x896: 430643
896x1152: 198820
1344x768: 185089
768x1344: 145989
1024x1024: 102374
1152x832: 70110
1280x768: 58728
768x1280: 42345
896x1088: 40613
1344x704: 31708
704x1344: 31163
704x1472: 27365
960x1088: 26303
1088x896: 24592
1472x704: 17991
960x1024: 17886
1088x960: 17229
1536x640: 16485
1024x960: 15745
704x1408: 14188
1408x704: 12204
1600x640: 4835
1728x576: 4718
1664x576: 2999
640x1536: 1827
640x1600: 635
576x1664: 456
576x1728: 335
提示词撰写
bigASP 🐍 版本2训练时支持详细自然语言提示与 booru 标签提示。这意味着以下所有提示风格都有效:
一张可爱的小狗在开满鲜花的田野中奔跑,阳光明媚地洒在背景中的照片。通过景深增强主体聚焦。
照片:一只可爱的狗在花田中奔跑,背景阳光灿烂,景深效果
photo (medium), cute puppy, running, field of flowers, bright sun, sun in background, depth_of_field
如果你曾使用过 bigASP v1,这些标签仍然有效!但现在你可以用自然语言更丰富地描述你想要的内容。
如果你需要一些提示词写作灵感,可尝试将你最喜欢的照片输入 JoyCaption:https://huggingface.co/spaces/fancyfeast/joy-caption-alpha-two bigASP v2 使用 JoyCaption(Alpha Two)生成短、中、长等描述性标题,因此所有 JoyCaption 设置都能很好地辅助你。
我还建议查看画廊中任一图片的元数据以获取灵感。我尽可能在上传图像时附上 ComfyUI 工作流。
最后是评分。bigASP 🐍 v2 与 v1 一样,受 PonyDiffusion 的杰出工作启发,训练时使用了“评分标签”。这意味着它理解诸如 score_8_up 这样的提示,用于指定你希望生成图像的质量等级。bigASP 数据集中所有图像均被评分0到9,0被完全排除,9为最佳。因此,当你在提示词开头写入 score_7_up,你是在告诉 bigASP:“我希望生成一张质量至少为7的图像。”
与版本1不同,本版本不需要在提示词中指定评分标签。若不指定,bigASP 将自由生成从低到高各种质量的图像,因此你会看到好与坏并存!但我强烈建议在提示词开头加入某种评分标签,以引导模型。我通常使用 score_7_up,它能引导生成普遍高质量图像,同时保留一定自由度。若你只想要最佳,用 score_9;若你想要更多样化,用 score_5_up。希望这能说得明白!你可以叠加多个评分标签,但通常一个就足够。你也可以在负面提示中加入较低评分,例如 score_1, score_2, score_3,以观察效果。
注意:如果你使用评分标签,它必须放在提示词开头。
注意:如果你想在提示中使用 booru 风格标签,请记住部分标签包含括号,例如 photo (medium)。许多UI使用括号进行提示权重调整!因此,如果你使用 ComfyUI 或 Auto1111,请务必转义括号,如 photo \(medium\)。
示例提示词
SFW,宁静湖面映照夕阳,远处群山,薄云飘浮,一叶孤舟。
score_7_up, 照片:金发女性,红唇,黑色项链,坐在床上自慰,水印
score_8, 一张色彩鲜艳的热带海滩照片,拍摄于阳光明媚的日子。前景是木制栏杆和茂盛的绿草,中央偏右是一棵高大扭曲的棕榈树。背景是沙质海滩、碧绿海水与清澈蓝天。棕榈树长满尖锐叶片,与光滑弯曲的树干形成对比。整体氛围宁静而诱人,充满温暖与放松感。
score_8_up, 一张迷人而超现实的咖啡馆照片,霓虹灯光洒在柜台后一位英俊男子身上。他系着围裙,对着镜头温暖微笑。光线温暖柔和,阴影增添细节与深度。皮肤纹理极其细腻,肌肉健美,手持一杯咖啡,中近景,用佳能EOS拍摄。
score_7_up, photo \(medium\), 1girl, 分开双腿, 小乳房, 肿胀乳头, 射精, 惊讶
score_7_up, photo (medium), 长发, 站立, 长筒袜, reddit, 1girl, r/asstastic, 厨房, 深色皮肤
score_8_up, photo \(medium\), 黑色上衣, 阴部, 长发, 分开双腿, 长筒袜, 超短裙, 户外
照片:一辆蓝色1960年代梅赛德斯-奔驰汽车,特写,大灯,镀铬装饰,车牌上阿拉伯文字,低质量
高级提示词技巧
与版本1一样,bigASP 理解 JoyTag 使用的所有标签。你可能会发现参考此训练中出现的标签列表(含出现次数)很有帮助:https://gist.github.com/fpgaminer/0243de0d232a90dcae5e2f47d844f9bb
当然,得益于 JoyCaption,版本2现在能理解更多自然语言提示。这意味着本版 bigASP 🐍 能理解大量新概念。许多人发现v1的标签列表有助于探索模型能力;对于自然语言,类似的方法是对模型训练时看到的标题语料库进行“n-gram”分析。简而言之,就是寻找常见词语组合。这里提供了该列表,含每段文本的出现次数:https://gist.github.com/fpgaminer/26f4da885cc61bede13b3779b81ba300
n-gram 列表第一列是考虑的词数,从1到7;第二列是文本;第三列是该词组在语料中出现的次数(可能高于图像数量,因单条标题内可多次出现)。请注意,本分析中“名词短语”被视为一个词,例如 “her right side”、“his body”、“water droplets” 均被视为单个词,因它们代表一个整合概念。因此,别惊讶为何 “tattoo on her right side” 在列表中被计为3个词。另外,部分标点在文本提取中可能缺失,因分析时对文本进行了特定处理。
可提及多种来源,如 reddit、flickr、unsplash、instagram 等,以及特定子版块(类似v1)。
标签如 NSFW、SFW 和 Suggestive 可引导生成内容。
总体而言,bigASP 🐍 不会生成水印,除非明确提及。触发词恰巧是 watermark。在负面提示中加入 watermark 可进一步避免水印——虽然在我的测试中,大多数提示下水印已罕见。
bigASP 🐍 能 生成你指定的文本,例如:“The person is holding a sign with the text 'Happy Halloween' on it.” 你可以用多种方式提示文本,但请务必用引号括住你希望出现在图像中的文字。不过,这是SDXL,所以别指望能轻易生成好文本——你可能需要尝试大量生成才能获得理想效果。图像越复杂,SDXL处理文本效果越差,但这对这位老伙计来说仍是个有趣的把戏!
模型理解部分相机品牌、型号,以及焦距、光圈等参数,但其具体影响尚不明确。你可以使用 DSLR 标签更一般地引导模型生成“专业”照片,但请注意,它也可能导致图像中出现相机实体……
如特性列表所述,bigASP 🐍 训练时支持长提示。它采用了 NovelAI 发明并慷慨记录的技术,也是大多数生成UI在提示超过CLIP最大75个token时所用技术。数据集中包含多种长度的标题,因此从几个token到225个token的提示都应能良好工作,但需注意此技术的常见局限。
局限性
无偏移噪声:抱歉,或许下个版本。
无动漫风格:这完全是照片风格模型。未来版本或许会加入动漫以扩展概念。
面部/手部/脚部:你懂的。
VAE问题:SDXL的VAE太差了,我们都知道。但这个问题在照片中尤为明显。而bigASP生成的细节如此丰富,更暴露了VAE的弱点。对此我无能为力。
没有奇迹:这是SDXL,所以请做好心理准备。好图与平庸图的比例为1:24,身体恐怖元素不少,等等。有些提示词莫名其妙地效果很好,而有些无论怎么调整都会生成噩梦般的图像。与v1相比,这个版本的大ASP在多角色生成上表现更好,但依然粗糙。这正是旧架构的常态。我认为bigASP现在差不多已达到此处所能实现的极限。
训练细节(版本2)
版本2的所有训练细节均记录于此:https://civitai.com/articles/8423
训练细节(版本1)
关于big SDXL微调的训练细节,公开资料少之又少。因此,我在此分享所有细节,以帮助社区。
bigASP在约1,440,000张图片上进行训练,所有图片的分辨率均大于其对应长宽比桶的尺寸。每张图片在磁盘上约1MB,因此每百万张图片的数据库大小约为1TB。
每张图片都会经过以下处理:使用质量模型评分(0至9分);使用JoyTag打标签;使用OWLv2配合提示词“a watermark”检测图片中的水印。我发现OWLv2的表现优于任何微调过的视觉模型,且它还能提供水印的边界框,这一点非常有用。准确率约为92%。虽然本版本未使用,但未来有可能利用这些边界框在训练中进行“损失掩码”处理,即让SD模型忽略水印区域。目前,若检测到水印,训练提示词中会包含“watermark”标签。
得分为0的图片会被完全丢弃。我专门训练了评分模型,使其能将特定图片归入这个低分区间。你可能会惊讶于数据集中出现了多少垃圾内容,哪怕一点点都会严重干扰训练——缩略图、视频预览图、广告等。
bigASP采用与SDXL论文中定义相同的长宽比桶。所有图片会被分配到最匹配的桶中,但缩放后不能小于该桶的任一维度。缩放后,图片会被随机裁剪。原始分辨率和裁剪信息会与VAE编码后的图像一起保存在磁盘上,用于SDXL的条件输入,最后将潜在变量用gzip压缩。我发现gzip能节省约30%的空间,这使训练数据集降至每百万张图片约100GB。
训练使用基于diffusers库的自定义训练脚本完成。我使用自定义脚本是为了完全理解其内部机制,并能自由实施任何调整。此外,我之前已有SD1.5的训练脚本,因此并不算巨大跨越。缺点是,我不得不花费大量时间调试几次错误运行后出现的细微问题——这些错误代价极高。但对我而言,错误是学习的代价。
我认为训练提示词对最终模型在实际使用中的表现至关重要。自定义的Dataset类在生成训练提示词时承担了大量工作。人们使用的提示词五花八门:从简短提示到冗长提示,包含各种逗号、下划线、拼写错误等。
我抽取了大量包含提示词的AI图像,用于分析典型用户提示词的统计特征。提示词分布基本呈正态分布,平均值为32个标签,标准差为19.8。因此,我的Dataset类也反映了这一分布。对于每个训练样本,它会从中随机选取一个整数,决定当前样本应使用多少个标签,然后打乱图片标签并截断至该数量。
这意味着在训练过程中,模型会看到从仅“1girl”到长达224个token的庞大提示词!从而有望学会为用户补全细节。
某些标签(如watermark)具有优先权,只要存在就一定会包含,以确保模型能强学习这些标签。
我们使用Danbooru的标签别名列表,随机将标签替换为同义词,以便bigASP理解人们可能用各种方式表达同一概念,希望如此。
当然,还有评分标签。与Pony XL一样,bigASP将训练样本的评分编码为“score_X”和“score_X_up”形式的标签范围。但为了避免Pony XL遇到的问题,训练提示词中仅随机包含一定数量的评分标签。这样模型就不会“必须”在提示词中包含“score_8, score_7, score_6”等才能正常工作,它已习惯只看到一个或少数几个评分标签。
10%的时间,提示词会被完全丢弃,设为空字符串。UCG,你懂的。注意!!!我注意到Stability的训练脚本,甚至HuggingFace的脚本,都是将提示词设为“zero”而非空字符串嵌入空间。这与SD1.5的训练方式不同,也与大多数SD前端进行推理的方式不同。我认为,如果SDXL训练时采用“zero”丢弃而非空提示丢弃,这可能是一个大问题。这意味着在推理时,如果你使用空提示,你是在告诉模型远离的不是“平均图像”,而是仅仅那些在训练时未带任何描述的图像——这听起来不对。因此,对于bigASP,我选择使用空提示丢弃进行训练。
此外,Stability的训练脚本中还包含了丢弃SDXL的其他条件信息:original_size、crop和target_size。我没有在kohya的脚本中看到这种行为,因此未采用。我不太确定这样做的好处是什么。
我确保在训练过程中,模型能看到各种批量提示词长度。我的意思是,每个训练样本的提示词长度确实不同,但所有提示词都必须填充至批次中最长的那个。因此,必须保证即使在分批后,模型仍能接触到多样化的长度,否则它可能过拟合,只在特定长度范围内有效。我用一个简单的Python Notebook扫描训练批次,验证了良好的分布:25%的批次为225个token,66%为150个,9%为75个。不过在未来的训练中,我可能会尝试更均衡地分布这些长度。
其余的训练过程相当标准。在我的实验中,min-snr损失效果最佳。纯fp16训练对我无效,因此我不得不使用混合精度,模型保持在fp32。由于潜在变量已预先编码,无需加载VAE,从而节省了宝贵内存。在训练期间生成样本图像时,我使用另一台独立机器,它会获取已保存的检查点并生成样本图像。这同样节省了训练机器的内存与算力。
最终训练使用2048的有效批次大小,无EMA,无偏移噪声,PyTorch的AMP仅使用float16(非bfloat16),学习率为1e-4,优化器为AdamW,min-snr损失,权重衰减0.1,使用10万训练样本的线性预热+余弦退火,UCG率10%,启用text encoder 1训练,冻结text encoder 2,min_snr_gamma=5,PyTorch GradScaler初始缩放值为65,000,beta1=0.9,beta2=0.999,eps=1e-8。所有参数均从SDXL 1.0初始化。
使用2048张图片作为验证数据集。每5万样本进行一次验证,以确保模型未过拟合,并辅助超参数选择。为了便于比较不同损失函数的训练结果,验证始终使用基本损失函数进行,即使训练时使用的是min-snr等其他损失。每50万样本保存一次检查点。我发现每百万步查看一次样本图像就足够了,因此仅在每第二个检查点上执行此操作。
我还记录了稳定的训练损失(我使用Wandb监控训练)。稳定训练损失与验证损失同时计算(连续进行)。它本质上是一次验证过程,只是不使用验证数据集,而是使用训练集的前2048张图片,并使用固定随机种子。这提供了一个“稳定”的训练损失指标。SD的训练损失极其嘈杂,因此该指标能更准确地反映损失的进展。
我使用的批次规模与网上看到的少数微调实验相比非常大。但这基于我训练其他模型的经验。大批次在长期训练中优势明显,但短期内表现较差,因此在小规模基准测试中难以衡量其效果。希望这次它确实带来了优势。SDXL的完整训练成本极高,难以进行大量实验。但大批次的一个直接好处是迭代速度更快,因为优化和梯度同步频率更低。
训练在云端租用的8x H100 SXM5机器上进行。该机器的迭代速度约为每秒70张图片,整轮训练耗时约5天。对于我这样的爱好者来说,这真是个惊人的数字。请给我一个拥抱吧,我快累垮了。
在云端进行训练促使我大量使用预计算的潜在变量。将数据传输到机器上需要约一小时才能开始训练。理论上,代码可以设置为立即开始训练,因为训练数据在第一次遍历时是流式加载的。即便在8x H100上,处理一百万张图片也需要四小时,因此数据流速远超训练速度,这样机器就不会空闲浪费金钱。
预计算潜在变量的一个缺点,当然是在不同epoch中缺少潜在变量的多样性带来的正则化效果。模型在不同epoch间仍能看到大量不同的提示词,但不会看到图片的不同裁剪或VAE采样变化。未来训练中,我可能会让本地GPU持续重新编码潜在变量,并将更新后的潜在变量流式传送到云端机器,这样每几个epoch潜在变量就会变化。本次训练未检测到过拟合,因此无论是否这样做,可能影响都不大。
最后是损失曲线。我注意到不同数据集之间的验证损失差异相当大,因此其他人很难直接比较,但仅供参考:





















