目录

Lora/DB模型云端训练(适配Kaggle云平台) - Training GUI 秋叶版

创建时间:2023年11月11日 上次更新:2024年1月5日

本项目旨在降低模型训练的门槛,帮助更多人不花钱就能炼出自己的模型

使用教程见专栏:https://www.bilibili.com/read/cv28372468/?jump_opus=1

  • Lora训练GUI使用了秋叶发布的保姆式LoRA模型一键包文件,对新人友好

  • Kaggle为世界最大的数据平台,提供了免费显卡资源。

  • 经测试,此项目可在Android手机上Edge浏览器运行,但上传训练集步骤可能存在困难,建议PC端运行。

  • 新版训练GUI现在支持训练DB大模型了,经过测试可训练

    作者 BY bilibili NYAN9。此源码为免费公开,分享。若发现有人倒卖,请立即向作者举报

第一步: 填写你的训练集路径(右侧Add Data上传,将图片或者训练集传上去)

https://wd-jishu.oss-cn-hangzhou.aliyuncs.com/img/image-20240206235931917.png@!full

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
import os
import shutil
import socket
import threading
训练集路径 = ['/kaggle/input/wei-111/']  # 包含图片的训练集,可多个,注意路径最前面和最后面要加上/斜线才能复制图片,否则复制的会是目录
目标路径 = '/kaggle/lora-scripts/train/aki/10_boy'  # 5为循环次数,girl为触发词

#下面不要改
def copy():
    try:
        !rm -rf /kaggle/lora-scripts/train/* 

        for 路径 in 训练集路径:
            shutil.copytree(路径, os.path.join(目标路径, os.path.basename(路径)))

            print(f"成功将训练集复制到 '{目标路径}'")
    except Exception as e:
        print(f"没检测到数据集路径,请确保数据集路径是否正确{e}")
        print(f"Datasets path not found, please check if the path correct")
        raise SystemExit
 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
#查看是什么GPU
import asyncio
import torch
import subprocess
import os
import concurrent.futures
import subprocess
print('正在安装训练脚本,请等待600秒左右')
print("现在使用多线程安装,只需150秒即可")
!cd /kaggle && git clone https://github.com/KaggleSD/lora-scripts
def prepare():
    !apt-get update & pip3 install imjoy-elfinder
    # 安装 aria2 和 python3pip
    !echo 安装aria2下载器
    !apt install -y aria2 && 完成
   

    # 定义一个空文件路径
    devnull = open(os.devnull, 'w')

    # 设置标准输出和标准错误流都重定向到空文件
    command = "imjoy-elfinder --root-dir=/kaggle --port=8076"
    process = subprocess.Popen(command, shell=True, stdout=devnull, stderr=subprocess.STDOUT)
    devnull.close()
    print('显卡信息如下:')
    !nvidia-smi
    # 检查显卡
    print('CUDA版本:',torch.version.cuda)
    print('Pytorch版本:',torch.__version__)
    print('显卡是否可用:','可用' if(torch.cuda.is_available()) else '不可用')
    print('显卡数量:',torch.cuda.device_count())
    print('是否支持BF16数字格式:','支持' if (torch.cuda.is_bf16_supported()) else '不支持')
    print('当前显卡型号:',torch.cuda.get_device_name())
    print('当前显卡的CUDA算力:',torch.cuda.get_device_capability())
    print('当前显卡的总显存:',torch.cuda.get_device_properties(0).total_memory/1024/1024/1024,'GB')
    print('是否支持TensorCore:','支持' if (torch.cuda.get_device_properties(0).major >= 7) else '不支持')
    print('当前显卡的显存使用率:',torch.cuda.memory_allocated(0)/torch.cuda.get_device_properties(0).total_memory*100,'%')
    #安装解压软件和下载存储工具
## 一、基础依赖和训练包拉取 (不用改这里)
## 训练包版本为2023年10月份1.7.0最新版,不定期同步最新版
def install1():
    #!sudo rm -r /kaggle/lora-scripts/
    %cd  /kaggle/
    #!git clone https://gitee.com/nyan9/lora-scripts_1.git
    #!mv lora-scripts_1 lora-scripts
    
    print('下载预训练模型,大小1.2G')
    #!mkdir -p /kaggle/lora-scripts/huggingface/
    #!cd /kaggle/lora-scripts/huggingface/ && aria2c -x 16 -s 16 -k 1M -c https://liblibai-online.vibrou.com/web/model/c52a9848ee316e16b59a0fe17e17edc4c767f97f652b439d9da758d6077160ae.ckpt  -o 1.zip
    #!unzip -o /kaggle/lora-scripts/huggingface/1.zip -d /kaggle/lora-scripts/huggingface/ && echo 解压成功
    #!sudo rm -r /kaggle/lora-scripts/huggingface/1.zip && echo 删除压缩包成功
    #!mkdir -p /kaggle/lora-scripts/train/aki
    #!mkdir -p /kaggle/lora-scripts/train/reg
    !echo 训练包拉取成功
 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
'''
### 说明:
# 由于Kaggle没有自带内网穿透,无法访问GUI和文件管理浏览器,所以这里使用了本人的公益Frp内网穿透。才得以访问训练GUI
'''
import subprocess
import shutil
import os
import time
import random

use_frpc = True
frpconfigfile = '/kaggle/input/aihua-5000/frpc_10669839.ini'
random_number = random.randint(1000, 9999)
config = """
[common]
server_addr = frp.freefrp.net
server_port = 7000
token = freefrp.net

[28000loratrainUI]
type = tcp
local_ip = 127.0.0.1
local_port = 28000
# remote_port = 17861

"""
config_with_random_number = config.replace('[28000loratrainUI]', f'[28000loratrainUI_{random_number}]')
# 定义保存路径
file_path = '/kaggle/working/cyanfrp.ini'

# 将配置内容写入文件
with open(file_path, 'w') as config_file:
    config_file.write(config_with_random_number)



def install_Frpc(port, frpconfigfile, use_frpc):
    if use_frpc:
        #!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.sukaka.top/datasets/ACCA225/LoCyanfrp/resolve/main/frpc -d ./frpc -o frpc
        !cp /kaggle/input/net-tools/frpc /kaggle
        subprocess.run(['chmod', '+x', '/kaggle/frpc'], check=True)
        print(f'正在启动frp,端口{port}')
        # 将frp的输出重定向到文件
        with open('/kaggle/frp.log', 'w') as frp_output_file:
            subprocess.Popen(['/kaggle/frpc', '-c', '/kaggle/working/cyanfrp.ini'], stdout=frp_output_file, stderr=subprocess.STDOUT)
        !sleep 5
        !cat /kaggle/frp.log
 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

def extract_ip_with_port_from_log(log_file):
    print('测试')
    with open(log_file, 'r') as file:
        log_content = file.read()
        
        ip_port_pattern = re.compile(r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]+\b')
        
        ip_addresses_with_port = re.findall(ip_port_pattern, log_content)
        return ip_addresses_with_port

def iframe_thread_1(port):
    ip_addresses_with_port = extract_ip_with_port_from_log('/kaggle/frp.log')  # Replace with your actual log file
    while True:
        time.sleep(0.5)
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = sock.connect_ex(('127.0.0.1', port))
        if result == 0:
            break
        sock.close()
        !sleep 18
        copy()
        print("Lora训练GUI的IP地址:", ip_addresses_with_port)


def extract_ip_with_port_from_log2(log_file):
    with open(log_file, 'r') as file:
        log_content2 = file.read()
        
        ip_port_pattern2 = re.compile(r'\b(?:[0-9]{1,3}\.){3}[0-9]{1,3}:[0-9]+\b')
        
        ip_addresses_with_port2 = re.findall(ip_port_pattern2, log_content2)
        return ip_addresses_with_port2

def iframe_thread_2(port):
    ip_addresses_with_port2 = extract_ip_with_port_from_log('/kaggle/frp2.log')  # Replace with your actual log file
    while True:
        time.sleep(0.5)
        sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
        result = sock.connect_ex(('127.0.0.1', port))
        if result == 0:
            break
        sock.close()
        !sleep 22
        print("文件管理器地址:", ip_addresses_with_port2)
 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
'''
### 说明:
# 由于Kaggle没有自带内网穿透,无法访问GUI和文件管理浏览器,所以这里使用了本人的公益Frp内网穿透。才得以访问文件浏览器
'''


# 关闭文件描述符

import subprocess
import shutil
import os
import time

use_frpc1 = True
frpconfigfile1 = '/kaggle/input/aihua-5000/frpc_10669839.ini'
import random

# 生成四位随机数,防止端口冲突
random_number = random.randint(1000, 9999)

config1 = """
[common]
server_addr = frp.freefrp.net
server_port = 7000
token = freefrp.net

[28000fileUI]
type = tcp
local_ip = 127.0.0.1
local_port = 8076
# remote_port = 17861
"""

config1_with_random_number = config1.replace('[28000fileUI]', f'[28000fileUI_{random_number}]')

file_path = '/kaggle/working/nyanfrp.ini'

# 将配置内容写入文件
with open(file_path, 'w') as config_file:
    config_file.write(config1_with_random_number)


def install_Frpc1(port, frpconfigfile1, use_frpc1):
    if use_frpc1:
        #!aria2c --console-log-level=error -c -x 16 -s 16 -k 1M https://huggingface.sukaka.top/datasets/ACCA225/LoCyanfrp/resolve/main/frpc -d ./frpc -o frpc
        !cp /kaggle/input/net-tools/frpc /kaggle
        subprocess.run(['chmod', '+x', '/kaggle/frpc'], check=True)
        print(f'正在启动frp,端口{port}')
        # 将frp的输出重定向到文件
        with open('/kaggle/frp2.log', 'w') as frp_output_file:
            subprocess.Popen(['/kaggle/frpc', '-c', '/kaggle/working/nyanfrp.ini'], stdout=frp_output_file, stderr=subprocess.STDOUT)
        !sleep 5
        !cat /kaggle/frp2.log

#install_Frpc1('8076', frpconfigfile1, use_frpc1)

第二步:训练底模下载

 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
def model():
    !mkdir -p /kaggle/lora-scripts/sd-models/
    模型链接 = "https://huggingface.co/Lykon/AnyLoRA/resolve/main/AnyLoRA_noVae_fp16-pruned.safetensors" #双引号内填模型下载地址
    模型命名及后缀="model.safetensors" #双引号内填模型命名及后缀
    下载路径 = "/kaggle/lora-scripts/sd-models/"  #双引号内填模型的下载路径
    print(f'下载训练底模 {模型命名及后缀}')
    !cd "{下载路径}" && aria2c --console-log-level=error -x 16 -s 16 -k 1M -c "{模型链接}" -o "{模型命名及后缀}" && echo 下载成功
#-----------------------------------------------下面别改-----------------------------------
install_path2 = '/kaggle/opt/conda/envs/'
Venvpath = '/kaggle/input/lolidreambooth/kaggle/working/venv.tar.bak' 
def venv_install():
    if os.path.exists(Venvpath):
        if os.path.exists('/kaggle/working/opt'):
            !source /kaggle/working/opt/conda/envs/venv/bin/activate venv
            print('环境安装完毕')
        else:
            os.makedirs(install_path2, exist_ok=True)
            %cd {install_path2}
            !mkdir venv
            print('安装VENV环境')
            !tar -xf {Venvpath} -C {install_path2}venv
                #!source /kaggle/working/opt/conda/envs/venv/bin/activate venv
            print('环境安装完毕')
                    #安装依赖
    

训练VAE下载

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
# 下载 VAE (SDXL训练需要用到)
是否下载sdxl_vae = False
def vae():
    if 是否下载sdxl_vae:
        !mkdir -p /kaggle/lora-scripts/sd-models/vae
        模型链接2 = "https://huggingface.co/madebyollin/sdxl-vae-fp16-fix/resolve/main/sdxl_vae.safetensors" #双引号内填模型下载地址
        模型命名及后缀2="sdxl_vae.safetensors" #双引号内填模型命名及后缀
        下载路径2 = "/kaggle/lora-scripts/sd-models/vae"  #双引号内填模型的下载路径
        print(f'下载训练底模 {模型命名及后缀2}')
        !cd "{下载路径2}" && aria2c --console-log-level=error -x 16 -s 16 -k 1M -c "{模型链接2}" -o "{模型命名及后缀2}" && echo 下载成功
        #安装依赖

[ ]:

 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
import concurrent.futures
'''
执行函数
'''
import time
def install():
    try:
        start_time = time.time()
        # 启动一个线程执行venv_install()
        venv_install_thread = threading.Thread(target=venv_install)
        venv_install_thread.start()
        prepare_thread = threading.Thread(target=prepare)
        prepare_thread.start()
        prepare_thread.join()
        install1_thread = threading.Thread(target=install1)
        install1_thread.start()
        vae()
        model()
        install_Frpc('28000', frpconfigfile, use_frpc)
        install_Frpc1('8076', frpconfigfile, use_frpc)
        !apt-get install -y python3-pip
        !apt-get install -y libfuse-dev
        print("等待Python环境安装完成")
        venv_install_thread.join()
        # 计算总耗时
        end_time = time.time()
        elapsed_time = end_time - start_time
        print(f"加载耗时: {elapsed_time} 秒")
    except Exception as e:
        print('ERROR!!由于你自身迷惑操作导致发生未知错误')

自动上传模型到Huggingface (可选)

防止Kaggle存储不够导致训练失败。Huggingface有无限存储。

  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
## 启动秋葉aaaki的一键式lora训练界面
upload = False
import re
import asyncio
#功能函数,清理打包上传
from pathlib import Path
from huggingface_hub import HfApi, login
directory_path = '/kaggle/input/mohemodel'
install_path="/kaggle/working" 
# 使用huggingface保存和载入webui配置文件
huggingface_use = True
huggingface_token_file = '/kaggle/input/tenkens/hugfacetoken.txt'
huggiingface_repo_id = 'ACCC1380/private-model'
hugToken = 'hf_JZFqkANVBeq**DrDtSCARGoWlIcFY'
uploadhf = True
repo_id = 'ACCC1380/private-model'
import os
import time
from pathlib import Path
import re
import asyncio
from huggingface_hub import HfApi, login

directory = '/kaggle/working' #搜索的目标目录
yun_files = []  # Define yun_files outside the try block

def compress_images(directory, huggingface_token_file, repo_id):
    if upload:
        initial_files = set()
        for root, _, files in os.walk(directory):
            for file in files:
                if file.endswith(('.safetensors', '.ckpt')):
                    filepath = os.path.join(root, file)
                    initial_files.add(filepath)
        while True:
            try:
                time.sleep(0.1)
                current_files = set()
                for root, _, files in os.walk(directory):
                    for file in files:
                        if file.endswith(('.safetensors', '.ckpt')):
                            filepath = os.path.join(root, file)
                            current_files.add(filepath)

                new_files = current_files - initial_files
                if new_files:
                    print("New files detected:")
                    yun_files = list(new_files)
                    !sleep 2
                    for new_file in yun_files:
                        print(yun_files)
                        hugface_upload(huggingface_token_file, yun_files, repo_id)
                    for uploaded_file in yun_files:
                        os.remove(uploaded_file)
                    initial_files = current_files
            except Exception as e:
                print(f"发生错误: {e}")
                # Handle the error as needed
                break  # Terminate the loop on error

def hugface_upload(huggingface_token_file, yun_files, repo_id):
    if uploadhf:
        if hugToken != '':
            # Use your Hugging Face access token to log in
            login(token=hugToken)
            # Instantiate the HfApi class
            api = HfApi()
            print("HfApi class instantiated")
            # Use the upload_file() function to upload files
            print("Starting file upload...")
            for yun_file in yun_files:
                if Path(yun_file).exists():
                    response = api.upload_file(
                        path_or_fileobj=yun_file,
                        path_in_repo=yun_file,
                        repo_id=repo_id,
                        repo_type="dataset"
                    )
                    print("File upload completed")
                    print(f"Response: {response}")
                else:
                    print(f'Error: File {yun_file} does not exist')
        else:
            print(f'Error: Hugging Face token is empty')
    else:
        print(f'Error: File {huggingface_token_file} does not exist')

        
#hugface_upload(huggingface_token_file,yun_files,huggiingface_repo_id)

# 请不要单独执行代码块
def start():
    ip_addresses_with_port = extract_ip_with_port_from_log('/kaggle/frp.log')
    threading.Thread(target=iframe_thread_1, daemon=True, args=(28000,)).start()
    threading.Thread(target=iframe_thread_2, daemon=True, args=(28000,)).start()
    %cd /kaggle/lora-scripts    
    !df -h
    !source /kaggle/opt/conda/envs/venv/kaggle/working/venv/bin/python3/activate venv
    !/kaggle/opt/conda/envs/venv/kaggle/working/venv/bin/python3 gui.py

install()

[ ]:

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
import concurrent.futures
'''
执行函数,请勿单独执行代码块
'''
if __name__ == "__main__":
    executor = concurrent.futures.ThreadPoolExecutor(max_workers=2)
    future1 = executor.submit(start)
    future2 = executor.submit(compress_images, directory, huggingface_token_file, repo_id)
    concurrent.futures.wait([future1, future2])
    executor.shutdown()

使用说明 (必看)

https://wd-jishu.oss-cn-hangzhou.aliyuncs.com/img/image-20240207000131829.png@!full

https://wd-jishu.oss-cn-hangzhou.aliyuncs.com/img/6daeffceb55bc84c87667049562b292cc138655c9ac66481a7e73b5ae0318793.png@!full https://wd-jishu.oss-cn-hangzhou.aliyuncs.com/img/aNoLTF61mqBMRrV.png@!full

https://wd-jishu.oss-cn-hangzhou.aliyuncs.com/img/bf25e3079050e174d28dc3f63c845868931c9c3382ac1ef0db7cde18820f0743.png@!full

关于Kaggle服务器免费提供的配置如下:

内存显卡CPU存储
29GBT4双卡Xeon系统盘 73.1G
Linux15GB x24核数据盘(output) 19.5G

常用训练底模链接:

SDXL: https://huggingface.co/stabilityai/stable-diffusion-xl-base-1.0/resolve/main/sd_xl_base_1.0_0.9vae.safetensors

SD 1.5: https://huggingface.co/runwayml/stable-diffusion-v1-5/resolve/main/v1-5-pruned-emaonly.safetensors

anime_pruned_full:https://huggingface.co/Zerro0/animefull-final-pruned/resolve/main/model.ckpt?download=true

kohaku_XL v7: https://civitai.com/api/download/models/203416

更新历史:

前身:2023年7月份创建的kohya_ss的Kaggle训练脚本,但使用麻烦,无UI界面。无法在线打标。很多人不会用

  • 2023年11月10日:

  • 2023年11月11日:

data:image/png;base64,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

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
import os
install_path2 = '/kaggle/working/opt/conda/envs/'
Venvpath = '/kaggle/input/sd-webui-venv/venv.tar.bak' 
def venv_install():
    if os.path.exists(Venvpath):
        if os.path.exists('/kaggle/working/opt'):
            !source /kaggle/working/opt/conda/envs/venv/bin/activate venv
            print('环境安装完毕')
        else:
            os.makedirs(install_path2, exist_ok=True)
            %cd {install_path2}
            !mkdir venv
            print('安装VENV环境')
            !tar -xf {Venvpath} -C {install_path2}venv
                #!source /kaggle/working/opt/conda/envs/venv/bin/activate venv
            print('环境安装完毕')
                    #安装依赖
venv_install()

[ ]:

1
!/kaggle/working/opt/conda/envs/venv/bin/python -V

随机文章