https://github.com/kohya-ss/sd-scripts/blob/main/docs/fine_tune_README_ja.mdhttps://github.com/kohya-ss/sd-scripts/blob/main/docs/fine_tune_README_ja.md
fine-tune微调是指使用图像和文本对来训练模型,不包括lora、textual inversion和hypernetwork。
对stable diffusion的unet进行微调,对应NovelAI的改进:
1.使用clip文本编码器倒数第二层的输出,而不是最后一层。
clip将文本转换为特征,sd中使用clip最后一层输出,但可以更改为使用倒数第二层的输出,NovelAI称这将更准确的反应提示,在sd2.0中,默认使用倒数第二层,不要指定clip_skip。
2.非正方形分辨率训练(Aspect Ratio Bucking)。
sd采用了512×512的分辨率进行训练,同时也会在256×1024、384×640等分辨率下进行训练。这样可以减少被裁剪的部分,更准确地学习提示和图像之间的关系。训练分辨率将根据给定分辨率进行64像素的垂直和水平调整,确保不超出范围。通常情况下,统一输入大小是常见的做法,只要在同一batch内保持一致即可。NovelAI所说的bucketing(分桶)是指根据长宽比对训练数据分类,并通过每个bucket内的图像创建batch来统一batch的图像大小。
3.token长度从75扩展到225。
sd中,token最多75(77个,包括起始和结束符),将其扩展到225,clip接受的最大长度是75个token,因此在225的情况下,需要将其分成三段,调用clip,然后连接结果。在webui中是根据逗号进行分割的。
4.使用blip、DeepDanbooru、WD14Tagger自动生成标题。
5.bs,因为学习整个模型,所以和lora等相比,fine-tune消耗更多的内存。
6.一般学习率,1e-6到5e-6很常见,从llm那边的经验,可能微调包括lora等,lr还是低一些好。
7.train_text_encoder,内存会增加,在正常微调中,text encoder不是学习目标,但是当训练数据较少时,text encoder像dreambooth那样训练也有效。默认情况不执行text encoder的训练,通常对模型训练时,只训练unet。
8.使用diffusers_xformers.