SD使用和Lora模型训练

最近一直没有更新博客,一方面因为自己在准备实习需要的东西时间很赶,另一方面就是因为AI绘画玩具啦。

Stable Diffusion

  1. 首先运行启动器依赖

  2. 解压sd-webui-aki-v4.zip

  3. 进入sd-webui-aki-v4文件夹打开启动器后一键启动等待控制台输出完毕弹出Web Ui界面就可以开始绘图啦

  4. 整合包已经安装好汉化,这里的正向提示词就是输入你想要让AI画出人物的描述啦,例如masterpiece,1 girl, very detailed CG, beautiful eyes, very detailed, Blackboard painting, complex details_ 1.2, 8k wallpaper, jk等等,默认使用英文,用逗号分割词语,而负面提示词则是反着来了,例如写入worst quality,bad hands,malformed hands,worst quality,low quality,((((ugly)))),(((duplicate))),(((trans))),((trannsexual)),(out of frame),extra fingers,mutated hands,out of frame,extra limbs,(bad anatomy),grossproportions,(malformed limbs),((missing arms)),((missinglegs)),(((extra arms))),(((extra legs)))

  5. 等等

    • 这里推荐使用我的TAG生成器
  6. 实际生成一张吧,因为我的破烂电脑显卡不行,显存不够所以这里等上个把分钟都是不奇怪的,具体还是看你与显卡之间的羁绊吧🤣

    ​ 这里看可能会有点模糊?我还经过了压缩才上传显示在此网页中的原因吧,可以看到AI可以很好的绘画出我们满意的图片

    • 而且在Stable Diffusion中也有图片放大的运行,图片放大其实是在已知像素点的位置上估算新的像素点的值。这可以通过计算原图像中的相邻像素点的平均值或加权平均值来实现。这样,我们就可以在原图像中的每个像素点之间估算出新的像素点的值,从而来增加图像的分辨率和清晰度
    • Stable Diffusion非常强大,甚至还支持文件夹中图片批量处理输出

    在这里上传你需要放大处理的图片,我一般都是使用BSRGAN算法来放大处理的,缩放比例也是常用的3,最高可以到8,分辨率调到太高的时候图片的线条会过分明显我并不喜欢。

    以下是使用3倍的缩放比例和BSRGAN算法处理后的图片

    可以看出3倍的缩放比例便已经可以达到非常好的效果了,我的建议是使用3-4之间

Lora的训练

准备条件和素材

​ 有些画质也是经过一传再传被各种社交软件一再压缩,到手的图片也总是感觉清晰度不高,而就算你把所有关于你想要生成的人物的各种细节都描述出来,AI绘图也无法将人物的样式完整的复现出来,一般对于专要产出图片的角色就要用到Lora或者embedding了,这里主要讲的是如何训练一个专有人物的Lora模型。

  • 一般的Lora模型文件是以safetensors为后缀的训练模型文件,存放在SD_ROOT/models/Lora中。

  • 训练的要求

    1. 显存,需要最少为8G的电脑显存才能进行最低的本地运行训练(我的破烂电脑哪里会有8G显存,所以这里写的便是白嫖云端运行训练Lora模型)

    2. 图片,需要至少10张以上的较高清晰度,较无杂物的人物图片(也就是最好少点背景物品什么的,多为人物的单独展示图最好),而且需要经过处理把所有的图片的分辨率都调为一致(分辨率要是64的倍数且都不能超过1920),这里一般可以使用SD中的后期处理进行图片的分辨率放大,然后使用SD训练中的图片预处理进行对图片自动面部焦点剪裁的分辨率裁剪(我的推荐是不要超过1280,1280的(这里我使用的差不多30左右张的1280,1280的图片训练的epoches数为20的时候都要训练到差不多4个小时多),除非家里有条件是用的自己电脑训练的可以把分辨率提高,让训练达到最佳的效果(这里我感觉不是epoches训练数越多越好,而且支持叠加训练的方式训练我在上次叠加训练了8个小时全部白搭了,图片的生成直接整个崩坏,推荐就是一次性练完)

    3. google账号,这里是使用谷歌的Colab来进行云端训练,google每周会刷新一次账号的试用Jupyter Notebook笔记本的时长,官网说是一周有12小时的时间,但是实际上为使用的伤害一个账号最多就6个小时左右的时间(之前训练到6个多小时的模型被中断了) (这里会用挂载把谷歌硬盘挂载到Jupyter Notebook笔记本上而且设置模型的输出目录为挂载的路径,这样就可以避免打水漂,因为我都是两个steps就保存一次模型,那么就算训练被中断了也可以在谷歌硬盘中下载最新的中断模型,也是可以正常使用的)

    4. 给你的图片打标签,这里直接使用SD中的Tagger插件,如果是使用上面的整合包的话是有包含在内的,想要使用这个插件对图片进行批处理都打上标签保存在相同路径下相同名字的txt文件中然后后面要上传到Jupyter Notebook笔记本中

    这里的阀值是定义AI的标签词语强度范围,我自己一般都是使用5.5

    附加提示词则可以理解为给每个图片都加上一个属于自己的标记吧,不懂的话忽略即可,然后点击反推提示词便可以了,默认的输出也是以图片文件名字为前缀以txt为后缀,没有指定目录也是默认的图片路径下输出的

    1. 具有科学上网的能力(因为访问Colab需要)

开始训练

说明:这里的每一小步骤都要新添加一个代码单元格

  1. 首先进入到Colab 创建新的笔记本

  2. 更改运行类型为GPU并保存

    查看GPU和挂载磁盘

    在代码框输入然后点击左上角启动

    1
    2
    3
    4
    !nvidia-smi
    from google.colab import drive
    drive.mount('/content/drive/')
    !echo "硬盘挂载完成."

    这里会弹出让你允许笔记本访问并授权到谷歌磁盘,直接允许然后看到输出硬盘挂载完成就可以了

  3. 运行一系列配置

    • 点击添加代码框然后输入后执行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    130
    131
    132
    %cd /content/
    git_https = "https://github.com/Akegarasu/lora-scripts"
    !git clone --recurse-submodules {git_https} /content/lora-scripts/
    !cd lora-scripts && git pull && git submodule update --init --recursive
    print(f"克隆完成 你可以在安装依赖时去配置train.sh文件")

    import re
    #########
    #设置train.sh文件路径,这个在函数中会被使用
    train_sh_path = r'/content/lora-scripts/train.sh'
    #########
    #定义函数,编辑train_sh_path路径的文件,为search的参数赋予值input
    #search为字符串,input可以为数值和字符串
    def search_input(search, input):
    # 使用正则表达式进行替换
    #匹配标志: 1匹配search="" , 2匹配search=5 , 3专门专门匹配extArgs=()
    search_type_flag = 0

    #search不是字符串就报错
    if not( isinstance(search, str) ):
    return "非字符串的'search'参数"

    #如果search输入的是"",则专门匹配extArgs=()
    if search == "":
    search = "extArgs"
    pattern = rf'^{search}=(\(.*?\))'
    replace = rf'{search}=({input})'
    search_type_flag = 3
    else:
    # 如果input是字符串类型,匹配search=""
    if isinstance(input, str):
    #pattern = rf'{search}=(".*?")'
    #replace = f"{search}=\"{input}\""
    pattern = rf'^{search}=(".*?")'
    replace = rf'{search}="{input}"'
    search_type_flag = 1
    # 如果input是数值类型,匹配search= (可以匹配小数、整数、科学计数)
    elif isinstance(input, (int, float)):
    pattern = rf'^{search}=([+-]?(?:\d+(?:\.\d*)?|\.\d+)(?:[eE][+-]?\d+)?)'
    replace = rf'{search}={input}'
    search_type_flag = 2
    else: # 其他情况,就返回错误信息
    return "错误的匹配input"

    #使用with语句打开文件,并读取内容
    with open(train_sh_path, 'r', encoding='utf-8') as f:
    content = f.read()
    re_get = re.findall(pattern, content, flags=re.MULTILINE|re.DOTALL)
    #检查是否匹配到,匹配不到则报错并退出
    if not(re_get):
    print(f"警告!!!对于'{search}'的正则表达式并未匹配,请手动设置该参数,并私信我更新!")
    return
    #如果匹配到了执行接下来操作
    #使用re.sub函数进行替换,并加上re.MULTILINE标志
    new_content = re.sub(pattern, replace, content, flags=re.MULTILINE|re.DOTALL, count=1)
    #如果内容未更改,提示未改变以及值
    if new_content == content:
    print(f"{search}={re_get[0]}")
    return
    #如果改变则写入,输出改变信息
    else:
    with open(train_sh_path, 'w', encoding='utf-8') as f:
    f.write(new_content)
    if search_type_flag == 1: right = left = "\""
    elif search_type_flag == 2: right = left = ""
    elif search_type_flag == 3: right = ")" ; left = "("
    else: print("输入参数错误")
    print(f"发生修改,{search}={re_get[0]}现在为{left}{input}{right}")

    #模型输出地址被更改至"/content/drive/MyDrive/Lora/output/"
    output_dir = "/content/drive/MyDrive/Lora/output/"
    search_input(" --output_dir", output_dir)
    print(f"模型输出地址默认被更改至谷歌硬盘:{output_dir}")

    #初始化log输出路径
    logging_dir = output_dir + "/logs"
    search_input(" --logging_dir", logging_dir)
    print(f"log日志默认输出至谷歌硬盘:{logging_dir}")

    #初始化sample_prompt.txt路径
    sample_prompt_txt_path = "/content/lora-scripts/sample_prompt.txt"
    print(f"sample_prompt.txt默认路径为:{sample_prompt_txt_path}")

    #初始化训练集路径
    train_data_dir = "/content/lora-scripts/train/aki/"
    search_input("train_data_dir", train_data_dir)
    print(f"训练集将拷贝至:{train_data_dir}")

    #初始化正则化集路径
    reg_data_dir = "/content/lora-scripts/train/reg/"
    print(f"正则化集将拷贝至:{reg_data_dir}")

    #弃用代码
    #!sed -i 's/--output_dir=".\/output"/--output_dir="/content/drive/MyDrive/Lora/output/"/' /content/lora-scripts/train.sh


    #################################################################
    #声明extArgs_Content类,用于在不同代码块中更新extArgs的内容
    class ExtArgsContent(object):
    def __init__(self):
    self.base_model = ""
    self.vae = ""
    self.common_parameter = ""
    self.sample_parameter = ""
    self.plus_parameter = ""
    #合并全部类属性字符串
    def all(self):
    result = ""
    attributes = self.__dict__.values()
    for attribute in attributes:
    result += attribute
    return result
    #将在(六、七)中被使用
    extArgs_content = ExtArgsContent()

    #################################################################
    #用于读取 --output_dir=""和 --logging_dir=""的值,来修改8.2中保存路径
    def search_get(search):
    # 如果input是字符串类型,匹配search=""
    #pattern = rf'{search}=(".*?")'
    pattern = rf'^{search}=(".*?")'
    #使用with语句打开文件,并读取内容
    with open(train_sh_path, 'r', encoding='utf-8') as f:
    content = f.read()
    re_get = re.findall(pattern, content, flags=re.MULTILINE|re.DOTALL)
    return re_get[0]

    #################################################################
    #初始化,在(八)中执行判断
    enable_sample = False
    use_train_sh_self = False
    use_sample_prompt_txt_self = False
    • 创建训练时的文件夹

      这里我要输出的模型为TLailin,所以就直接写上了,如果你要更改的话,后面对应的TLailin也都要更改上,输入后启动运行,然后可以在这里上传之前的已准备好的图片和Tagger文件到这里

    1
    !mkdir -pv /content/lora-scripts/train/TLailin/6_TLailin

    • 安装依赖环境(这里等待的时间会比较长)
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    !sudo apt-get update -y > /dev/null 2>&1
    !sudo apt-get install python3.10 > /dev/null 2>&1
    #change alternatives 首选py3.9
    !sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.9 1 > /dev/null 2>&1
    !sudo update-alternatives --install /usr/bin/python3 python3 /usr/bin/python3.10 2 > /dev/null 2>&1
    #check python version 查看版本 #3.10
    !python --version
    print("python升级中")
    # install pip for new python 为py3.10安装pip
    !sudo apt-get install python3.10-distutils > /dev/null 2>&1
    !wget https://bootstrap.pypa.io/get-pip.py > /dev/null 2>&1
    !python get-pip.py > /dev/null 2>&1
    #install colab's dependencies 安装colab依赖
    !python -m pip install ipython ipython_genutils ipykernel jupyter_console prompt_toolkit httplib2 astor > /dev/null 2>&1
    # link to the old google package 将py3.9的谷歌依赖连接至3.10
    !ln -s /usr/local/lib/python3.9/dist-packages/google \
    /usr/local/lib/python3.10/dist-packages/google > /dev/null 2>&1
    print("python升级完成 1/6")

    #这是一个备份更新python3.10.6的方式
    #切换到python3.10
    #!wget https://github.com/korakot/kora/releases/download/v0.10/py310.sh
    #!bash ./py310.sh -b -f -p /usr/local
    #!python -m ipykernel install --name "py310" --user


    ###################################################################################
    #安装相关环境

    pip_all_number = 7
    pip_count = 2
    #安装aria2
    !apt -qq install liblz4-tool aria2 > /dev/null 2>&1
    #安装其他依赖
    print(f"其他依赖安装中,此步耗时较长,请耐心等待")
    %cd /content/lora-scripts/sd-scripts/
    !pip -q install --upgrade -r requirements.txt > /dev/null 2>&1
    print(f"其他依赖安装完成 {pip_count}/{pip_all_number}")
    pip_count+=1
    #安装兼容torch1.14.1的torchvision0.14.1
    print(f"torchvision安装中")
    !pip -q install torchvision==0.14.1 > /dev/null 2>&1
    print(f"torchvision-0.14.1安装完成 {pip_count}/{pip_all_number}")
    pip_count+=1
    #安装xformers 0.0.16版本
    print(f"xformers安装中")
    !pip -q install xformers==0.0.16 > /dev/null 2>&1
    print(f"xformers-0.0.16安装完成 {pip_count}/{pip_all_number}")
    pip_count+=1
    #安装Triton
    print(f"triton安装中")
    !pip -q install triton==2.0.0.dev20221202 > /dev/null 2>&1
    print(f"Triton安装完成 {pip_count}/{pip_all_number}")
    pip_count+=1
    #安装lion优化器、lycoris
    print(f"lion优化器、lycoris安装中")
    !pip -q install --upgrade lion-pytorch lycoris-lora > /dev/null 2>&1
    print(f"lion优化器、lycoris安装完成 {pip_count}/{pip_all_number}")
    pip_count+=1
    #安装Dadaption优化器
    print(f"Dadaption优化器安装中")
    !pip -q install dadaptation > /dev/null 2>&1
    print(f"Dadaption优化器安装完成 {pip_count}/{pip_all_number}")
    pip_count+=1

    #############################
    #开启tensorboard
    %load_ext tensorboard
    • 下载训练底模,点击选择就可以了,不是很了解的话直接运行就可以
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    46
    47
    48
    49
    50
    51
    52
    53
    54
    55
    56
    57
    58
    59
    60
    61
    62
    63
    64
    65
    66
    67
    68
    69
    70
    71
    72
    73
    74
    75
    76
    77
    78
    79
    80
    81
    82
    83
    84
    85
    86
    87
    88
    89
    90
    91
    92
    93
    94
    95
    96
    97
    98
    99
    100
    101
    102
    103
    104
    105
    106
    107
    108
    109
    110
    111
    112
    113
    114
    115
    116
    117
    118
    119
    120
    121
    122
    123
    124
    125
    126
    127
    128
    129
    #@title ### 6.1 下载模型
    installModels = []
    installv2Models = []

    #@markdown ####**选择优先级从上到下,比如说你想自定义链接,则需要保持两个预设模型为空**

    #@markdown **预设剪枝模型(`Animefull-final-pruned`即NovelAI官模 , `Stable-Diffusion-v1-5`即SD1.5)**

    #@markdown SD1.x model
    modelName = "Animefull-final-pruned" # @param ["", "Animefull-final-pruned", "Stable-Diffusion-v1-5", "Anything-v3-1", "AnyLoRA", "AnimePastelDream", "Chillout-mix", "OpenJourney-v4"]
    #@markdown SD2.x model
    v2ModelName = "" # @param ["", "stable-diffusion-2-1-base", "stable-diffusion-2-1-768v", "plat-diffusion-v1-3-1", "replicant-v1", "illuminati-diffusion-v1-0", "illuminati-diffusion-v1-1", "waifu-diffusion-1-4-anime-e2", "waifu-diffusion-1-5-e2", "waifu-diffusion-1-5-e2-aesthetic"]

    #@markdown **自定义模型链接例如`https://huggingface.co/a1079602570/animefull-final-pruned/resolve/main/novelailatest-pruned.ckpt`)**

    #@markdown **或者自定义模型路径例如`/content/drive/MyDrive/Lora/model/your_model.ckpt`**

    #@markdown **如果连接或者路径中包含模型的扩展名(比如我给出的两个例如的末尾都有扩展名),则会自动指定,否则你需要手动选择**

    #@markdown - **注意,Colab普通用户仅能选择5G以下的模型**

    base_model_url = "https://civitai.com/api/download/models/37521" #@param {type:"string"}

    base_model_self_dir = "" #@param {type:"string"}

    base_model_extension = "ckpt" #@param ["ckpt", "safetensors", "pt"]


    modelUrl = [
    "",
    "https://huggingface.co/Linaqruf/personal-backup/resolve/main/models/animefull-final-pruned.ckpt",
    "https://huggingface.co/cag/anything-v3-1/resolve/main/anything-v3-1.safetensors",
    "https://huggingface.co/Lykon/AnyLoRA/resolve/main/AnyLoRA_noVae_fp16.safetensors",
    "https://huggingface.co/Lykon/AnimePastelDream/resolve/main/AnimePastelDream_Soft_noVae_fp16.safetensors",
    "https://huggingface.co/Linaqruf/stolen/resolve/main/pruned-models/chillout_mix-pruned.safetensors",
    "https://huggingface.co/prompthero/openjourney-v4/resolve/main/openjourney-v4.ckpt",
    "https://huggingface.co/Linaqruf/stolen/resolve/main/pruned-models/stable_diffusion_1_5-pruned.safetensors",
    ]
    modelList = [
    "",
    "Animefull-final-pruned",
    "Anything-v3-1",
    "AnyLoRA",
    "AnimePastelDream",
    "Chillout-mix",
    "OpenJourney-v4",
    "Stable-Diffusion-v1-5",
    ]
    v2ModelUrl = [
    "",
    "https://huggingface.co/stabilityai/stable-diffusion-2-1-base/resolve/main/v2-1_512-ema-pruned.safetensors",
    "https://huggingface.co/stabilityai/stable-diffusion-2-1/resolve/main/v2-1_768-ema-pruned.safetensors",
    "https://huggingface.co/p1atdev/pd-archive/resolve/main/plat-v1-3-1.safetensors",
    "https://huggingface.co/gsdf/Replicant-V1.0/resolve/main/Replicant-V1.0.safetensors",
    "https://huggingface.co/IlluminatiAI/Illuminati_Diffusion_v1.0/resolve/main/illuminati_diffusion_v1.0.safetensors",
    "https://huggingface.co/4eJIoBek/Illuminati-Diffusion-v1-1/resolve/main/illuminatiDiffusionV1_v11.safetensors",
    "https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/wd-1-4-anime_e2.ckpt",
    "https://huggingface.co/waifu-diffusion/wd-1-5-beta2/resolve/main/checkpoints/wd-1-5-beta2-fp32.safetensors",
    "https://huggingface.co/waifu-diffusion/wd-1-5-beta2/resolve/main/checkpoints/wd-1-5-beta2-aesthetic-fp32.safetensors",
    ]
    v2ModelList = [
    "",
    "stable-diffusion-2-1-base",
    "stable-diffusion-2-1-768v",
    "plat-diffusion-v1-3-1",
    "replicant-v1",
    "illuminati-diffusion-v1-0",
    "illuminati-diffusion-v1-1",
    "waifu-diffusion-1-4-anime-e2",
    "waifu-diffusion-1-5-e2",
    "waifu-diffusion-1-5-e2-aesthetic",
    ]
    if modelName:
    installModels.append((modelName, modelUrl[modelList.index(modelName)]))
    if v2ModelName:
    installv2Models.append((v2ModelName, v2ModelUrl[v2ModelList.index(v2ModelName)]))


    #下载路径
    base_model_dir = "/content/lora-scripts/sd-models/"

    #检查连接是否含有扩展名信息,不含有则由用户指定
    def check_ext(url):
    if url.endswith(".ckpt"):
    return "ckpt"
    elif url.endswith(".safetensors"):
    return "safetensors"
    else:
    return base_model_extension
    #下载模型
    def install(checkpoint_name, url):
    ext = check_ext(url)
    hf_token = "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"
    user_header = f'"Authorization: Bearer {hf_token}"'
    !aria2c --console-log-level=error --summary-interval=10 --header={user_header} -c -x 16 -k 1M -s 16 -d {base_model_dir} -o {checkpoint_name}.{ext} {url}
    return f"{checkpoint_name}.{ext}" #返回模型名称
    def install_checkpoint():
    for model in installModels:
    return install(model[0], model[1])
    for v2model in installv2Models:
    return install(v2model[0], v2model[1])

    #尝试下载预设模型
    base_model_name = install_checkpoint()
    #预设下载成功,则完成路径修改
    if base_model_name:
    pretrained_model = base_model_dir + base_model_name
    #下载失败,base_model_name为non
    else:
    #不留空,则尝试用连接下载
    if base_model_url:
    base_model_name = "download." + check_ext(base_model_url)
    pretrained_model = base_model_dir + base_model_name
    !aria2c --console-log-level=error --summary-interval=10 -c -x 16 -k 1M -s 16 -d {base_model_dir} -o {base_model_name} --allow-overwrite {base_model_url}
    #留空,将考虑从自定义路径中拷贝
    else:
    if base_model_self_dir:
    base_model_name = "self." + check_ext(base_model_self_dir)
    pretrained_model = base_model_dir + base_model_name
    !cp {base_model_self_dir} {pretrained_model}
    else:
    print("你根本没选择任何模型!")


    #修改train.sh的底模路径,并输出信息
    search_input("pretrained_model", pretrained_model)

    #输出模型信息
    print(f"你选择的是: {base_model_name} 模型")
    • 指定使用的外挂Vae,还是一样,不了解的话直接选我推荐的anime然后直接运行即可
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    44
    45
    # @title ## 6.2 下载vae(可选)

    #储存下载信息参数
    installVae = []
    #@markdown 选择 `none` 意味着不使用vae

    #@markdown 选择一个Vae下载并使用`"animevae.pt", "kl-f8-anime.ckpt", "vae-ft-mse-840000-ema-pruned.ckpt"`

    vaeUrl = [
    "",
    "https://huggingface.co/Linaqruf/personal-backup/resolve/main/vae/animevae.pt",
    "https://huggingface.co/hakurei/waifu-diffusion-v1-4/resolve/main/vae/kl-f8-anime.ckpt",
    "https://huggingface.co/stabilityai/sd-vae-ft-mse-original/resolve/main/vae-ft-mse-840000-ema-pruned.ckpt",
    ]
    vaeList = ["none", "anime.vae.pt", "waifudiffusion.vae.pt", "stablediffusion.vae.pt"]
    vaeName = "anime.vae.pt" # @param ["none", "anime.vae.pt", "waifudiffusion.vae.pt", "stablediffusion.vae.pt"]

    installVae.append((vaeName, vaeUrl[vaeList.index(vaeName)]))

    #开始下载
    vae_dir = "/content/lora-scripts/vae/"
    def install(vae_name, url):
    hf_token = "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"
    user_header = f'"Authorization: Bearer {hf_token}"'
    !aria2c --console-log-level=error --allow-overwrite --summary-interval=10 --header={user_header} -c -x 16 -k 1M -s 16 -d {vae_dir} -o "vae.pt" "{url}"

    def install_vae():
    if vaeName != "none":
    for vae in installVae:
    install(vae[0], vae[1])
    else:
    pass
    install_vae()


    extArgs_content.vae = ""
    #修改train.sh中参数
    if vaeName == "none":
    print("不使用vae")
    else:
    print(f"使用{vaeName}")
    #写入采样地址f"--vae={vae_dir}"
    extArgs_content.vae += f"\"--vae={vae_dir}vae.pt\" "

    search_input("", extArgs_content.all() )
    • 修改脚本运行参数

    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    # 下面是要修改的配置,没有注释的话就直接跟着我复制更改进去就可以
    train_data_dir="/content/lora-scripts/train/TLailin/" #这里改成刚才创建文件夹的名字
    resolution="512,512" # 这里改成你准备的图片的分辨率
    batch_size=1
    max_train_epoches=20
    output_name="TLailin" # 想要输出的模型名

    min_bucket_reso=256
    max_bucket_reso=1920
    # 这两个参数是要根据你准备的图片的分辨率来调的,max的可以直接拉到最高1920,但是min是要在你的最低分辨率往下或者一样,比如说我现在准备的图片分辨率是1280,1408,那么这里我的min_bucket_reso最高就只能填1280
    • 输入启动开始运行
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
    19
    20
    21
    22
    23
    24
    25
    26
    27
    28
    29
    30
    31
    32
    33
    34
    35
    36
    37
    38
    39
    40
    41
    42
    43
    #@title  ### 8.2开始训练
    #@markdown 若正确运行,训练完成后,模型会自动保存至你的谷歌硬盘中`我的云端硬盘/Lora/output/`

    #@markdown 如果不到1分钟就运行完了,多半是出错了,把输出信息复制到ChatGPT问下罢! :(

    #@markdown - Q:输出代码的最后出现(kill:9)字样

    #@markdown - A:爆ram了,更换小的底模

    #@markdown ---
    #@markdown 是否保存本次训练的train.sh和采样配置(如果你启用采样功能的话)

    #@markdown 保存路径: `留空则保存至当前train.sh中指定的输出路径`
    save_files = True #@param {type:"boolean"}
    save_files_dir_self = "" #@param {type:"string"}


    if save_files:
    #指定保存路径
    if save_files_dir_self:
    save_files_dir = save_files_dir_self
    print(f"你指定了自定义的配置保存路径:{save_files_dir}")
    else:
    save_files_dir = search_get(" --output_dir")
    print(f"采用trian.sh中指定的输出路径:{save_files_dir}")
    #保存训练参数文件至谷歌硬盘
    !mkdir -p {save_files_dir}
    !cp {train_sh_path} {save_files_dir}
    print(f"训练参数被保存至{save_files_dir}")
    #保存采样参数文件至谷歌硬盘
    if enable_sample or use_sample_prompt_txt_self:
    !cp {sample_prompt_txt_path} {save_files_dir}
    print(f"采样参数被保存至{save_files_dir}")
    else:
    print(f"未启用采样功能,不保存采样配置")
    else:
    print(f"不保存配置文件")

    #开始训练!
    %cd /content/lora-scripts/
    !bash train.sh

    !echo "完成了 XXXD."

    后面就是漫长的等待啦

    • 这里要注意的是Colab一旦关闭就很大概率会连不上,连不上的话会重置笔记本,也就会前功尽弃,所以在运行的时候你要时刻保持着科学上网,而且要在控制台输入刷新代码防止中途给你卡出个验证

    • 按F12开启控制台,选择Console,然后在最下面粘贴下面给出的代码并回车就可以了

      1
      2
      3
      4
      5
      6
      7
      8
      9
      10
      11
      12
      13
      14
      15
      16
      function getElementByXpath(path) {
      return document.evaluate(path, document, null,
      XPathResult.FIRST_ORDERED_NODE_TYPE, null).singleNodeValue;
      }

      function reconnect(){
      console.log('working')
      getElementByXpath("//div[@id='top-toolbar']/colab-connect-button").click()
      }
      var a = setInterval(reconnect, 1*60*1000);
      function stop(){
      clearInterval(a)
      }
      function start(){
      a = setInterval(reconnect, 1*60*1000);
      }

Lora的使用

把输出到google磁盘中的训练好的模型下载下来然后放在SD_ROOT/models/Lora目录下然后刷新Web UI界面就,Lora的使用只需要你点击


然后点击自己的Lora模型,就会自动写入到正向提示词啦,其他的按平时的SD操作来就可以了。
这里我有上传自己的模型到C站中,分别是轻小说里的角色艾琳和沙季

此作品博主暂未作出评价 查看详情
轻小说
不时轻声地以俄语遮羞的邻座艾莉同学
此作品博主暂未作出评价 查看详情
轻小说
义妹生活

PS: 重要的事情说三遍!不要使用此模型画18+的图片!!!不要使用此模型画18+的图片!!!不要使用此模型画18+的图片!!

本模型仅限于个人学习和非商业用途。作者提供的模型没有任何明示或暗示的保证和担保,作者不对任何由于使用本模型所引起的直接、间接、偶然、特殊及后果性损失或其他任何类型的损失承担责任。使用者应对使用本模型所引起的风险承担完全责任,作者不承担任何法律义务和赔偿责任