• [sd_scripts]之fine_tune


    https://github.com/kohya-ss/sd-scripts/blob/main/docs/fine_tune_README_ja.mdicon-default.png?t=N7T8https://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.

    9.训练

    1. accelerate launch --num_cpu_threads_per_process 1 fine_tune.py
    2. --pretrained_model_name_or_path=model.safetensors
    3. --output_dir=
    4. --output_name=
    5. --dataset_config=
    6. --save_model_as=safetensors
    7. --learning_rate=5e-6
    8. --max_train_steps=10000
    9. --use_8bit_adam
    10. --xformers
    11. --gradient_checkpointing
    12. --mixed_precision=fp16

    --num_cpu_threads_per_process:

    --pretrained_model_name_or_path:指定训练的模型,.ckpt或者.safetensors,hf格式均可。

    --output_dir:指定保存的模型文件夹。

    --output_name:指定不带扩展名的文件夹。

    --save_model_as:保存的格式

    --dataset_config:指定.toml文件。

    --max_train_steps:学习的步数10000

    --learning_rate:5e-6

  • 相关阅读:
    [剑指 Offer 53 - I]在排序数组中查找数字 I
    jQuery 效果- 隐藏和显示
    ​怎么保留硬盘数据合并分区 ,如何才能合并且不丢失数据
    全网最硬核 JVM TLAB 分析 4. TLAB 基本流程全分析
    四个BY的区别 HIVE中
    【Linux数据库注意问题】java.sql.SQLSyntaxErrorException: Table ‘e.USER‘ doesn‘t exist
    hel-micro
    [学习记录] Redis 3. Key 操作和常用数据类型
    hiredis笔记
    C++前缀和算法的应用:向下取整数对和 原理源码测试用例
  • 原文地址:https://blog.csdn.net/u012193416/article/details/134318786