完整的 LoRA 模型训练步骤:如何使用 Kohya_ss 进行 LoRA 训练
完整的 LoRA 模型训练步骤:如何使用 Kohya_ss 进行 LoRA 训练
- 一、环境配置
- 1. 安装 Python 和虚拟环境
- 2. 克隆 Kohya_ss 仓库
- 3. 安装依赖
- 4. 启动 GUI
- lora训练
- 1. 准备数据 图片处理打标签
- 2. 配置 LoRA 训练
- 2.2 配置图片文件夹和输出目录
- 训练
- 解决方法:
使用kohya_ss来进行lora训练,难点就是各种报错的问题
如果你自己的CUDA,python,pytorch版本还和官网推荐的不一样,更是报错更多,
Kohya_ss 是一个功能强大的工具,专为 Stable Diffusion 模型的训练设计,可以帮助用户使用 LoRA 方法对模型进行微调。在本文中,我们将详细介绍如何使用 Kohya_ss 进行 LoRA 模型训练的完整步骤,包括环境配置、数据处理、以及模型训练等。
我是Linux centOS系列,用的英伟达CUDA11.2的服务器,虽然官方使用至少是CUDA11.8,但从底层的算子逻辑原理上CUDA11.2是兼容的。
具体步骤如下:
一、环境配置
1. 安装 Python 和虚拟环境
首先,你需要在 CentOS 系统上创建一个 Python 虚拟环境。以下是详细步骤:
安装 Conda: 如果你没有安装 Anaconda 或 Miniconda,可以从官方网站下载并安装它们。
创建 Python 3.10.9 环境: 安装完成后,使用以下命令创建一个 Python 3.10.9 的虚拟环境:
conda create --name kohya_ss python=3.10.9
注意必须是3.10.9,不然后续安装一些库的时候,不兼容报错
激活环境:
conda activate <your_env_name>
2. 克隆 Kohya_ss 仓库
Kohya_ss 项目托管在 GitHub 上,你可以使用以下命令克隆仓库:
git clone --recursive https://github.com/bmaltais/kohya_ss.git
cd kohya_ss
3. 安装依赖
在 kohya_ss 目录下,运行以下命令安装必要的依赖:
chmod +x ./setup.sh
./setup.sh
如果安装这里,报错,或者没有权限去安装,也可以打开项目的requirements_linux.txt
和requirements.txt
的文件,手动pip
安装。
我的CUDA是11.2 兼容的torch版本正好就是文件里requirements_linux.txt
的:
pip install torch==2.1.2+cu118 torchvision==0.16.2+cu118 xformers==0.0.23.post1+cu118 --extra-index-url https://download.pytorch.org/whl/cu118
最后安装完所有通过python -m bitsandbytes
验证,如果没有报错就说明安装没问题了。
python -m bitsandbytes
4. 启动 GUI
若要在 Linux 上启动 GUI,你可以使用以下命令:
bash gui.sh --listen 0.0.0.0 --server_port 7860 --inbrowser --share
这里 0.0.0.0 表示可以从任何 IP 地址访问服务器,7860 是端口号,–share 参数允许你共享链接。你可以根据需要调整这些参数。
后续在训练的时间,需要通过网络访问huggingface下载预训练模型,但通常linux服务器没有代理,是无法访问的,下载不了模型,或者在下载模型时出现连接超时的问题
我的方法是
HF_ENDPOINT=https://hf-mirror.com bash gui.sh --listen 0.0.0.0 --server_port 7860 --inbrowser --share
利用一个镜像地址: http://hf-mirror.com下载
lora训练
1. 准备数据 图片处理打标签
首先,你需要准备原始训练图片,并使用 Kohya_ss 中的 BLIP Captioning 工具对这些图片进行描述。
在 Kohya_ss 的 GUI 中,点击 Utilities
,然后选择 Captioning
和 BLIP Captioning
。
在弹出的界面中,选择存储训练图片的文件夹,
并在 “Prefix to add to BLIP caption” 栏目中填写图片描述的前缀文字(可选)(不填的话,后续点Caption images
,生成标签过程也会下载预训练的blip模型,给你图像描述的)。
点击 Caption images 按钮开始对图片进行处理。
此时,BLIP 将生成每张图片的文字描述,这些描述将用于训练LoRA 模型。
linux日志出现如下,就说明生成出来了
为什么打标签:标签为模型学习提供明确的目标和方向。在 LoRA 训练中,模型通过对数据集中图像和对应标签的学习,理解不同数据特征与期望输出之间的关系。例如在训练一个生成动漫角色的 LoRA 模型时,标签可以是角色的名字、性格特点、所属动漫等信息。模型在训练过程中,依据这些标签,将图像中的人物外貌、服饰风格等特征与标签内容建立联系,从而学习到如何生成符合特定角色设定的图像。如果没有标签,模型就无法得知这些图像代表的具体概念,难以进行针对性学习。
2. 配置 LoRA 训练
在 Configuration file 部分,你可以选择加载一个预定义的配置文件。可以在网上找到一些常用的配置文件,或者根据你的需求自行编写。这个文件通常是一个 JSON 格式的文件,包含了训练过程的参数和设置,其实也不需要自己准备,在你lora,gui界面训练的时候,就会自动生成,可以直接跳过这里。
例如,配置文件可能看起来像这样:
{"LoRA_type": "Standard","LyCORIS_preset": "full","adaptive_noise_scale": 0,"additional_parameters": "","async_upload": false,"block_alphas": "","block_dims": "","block_lr_zero_threshold": "","bucket_no_upscale": true,"bucket_reso_steps": 64,"bypass_mode": false,"cache_latents": true,"cache_latents_to_disk": false,"caption_dropout_every_n_epochs": 0,"caption_dropout_rate": 0,"caption_extension": ".txt","clip_skip": 1,"color_aug": false,"constrain": 0,"conv_alpha": 1,"conv_block_alphas": "","conv_block_dims": "","conv_dim": 1,"dataset_config": "","debiased_estimation_loss": false,"decompose_both": false,"dim_from_weights": false,"dora_wd": false,"down_lr_weight": "","dynamo_backend": "no","dynamo_mode": "default","dynamo_use_dynamic": false,"dynamo_use_fullgraph": false,"enable_bucket": true,"epoch": 1,"extra_accelerate_launch_args": "","factor": -1,"flip_aug": false,"fp8_base": false,"full_bf16": false,"full_fp16": false,"gpu_ids": "","gradient_accumulation_steps": 1,"gradient_checkpointing": false,"huber_c": 0.1,"huber_schedule": "snr","huggingface_path_in_repo": "","huggingface_repo_id": "","huggingface_repo_type": "","huggingface_repo_visibility": "","huggingface_token": "","ip_noise_gamma": 0,"ip_noise_gamma_random_strength": false,"keep_tokens": 0,"learning_rate": 0.0001,"log_tracker_config": "","log_tracker_name": "","log_with": "","logging_dir": "/data/kohya_ss/logs","loss_type": "l2","lr_scheduler": "cosine","lr_scheduler_args": "","lr_scheduler_num_cycles": 1,"lr_scheduler_power": 1,"lr_warmup": 10,"main_process_port": 0,"masked_loss": false,"max_bucket_reso": 2048,"max_data_loader_n_workers": 0,"max_grad_norm": 1,"max_resolution": "512,512","max_timestep": 1000,"max_token_length": 75,"max_train_epochs": 0,"max_train_steps": 1600,"mem_eff_attn": false,"metadata_author": "","metadata_description": "","metadata_license": "","metadata_tags": "","metadata_title": "","mid_lr_weight": "","min_bucket_reso": 256,"min_snr_gamma": 0,"min_timestep": 0,"mixed_precision": "fp16","model_list": "","module_dropout": 0,"multi_gpu": false,"multires_noise_discount": 0.3,"multires_noise_iterations": 0,"network_alpha": 1,"network_dim": 8,"network_dropout": 0,"network_weights": "","noise_offset": 0,"noise_offset_random_strength": false,"noise_offset_type": "Original","num_cpu_threads_per_process": 2,"num_machines": 1,"num_processes": 1,"optimizer": "AdamW8bit","optimizer_args": "","output_dir": "/data/kohya_ss/outputs","output_name": "tianqiong1","persistent_data_loader_workers": false,"pretrained_model_name_or_path": "runwayml/stable-diffusion-v1-5","prior_loss_weight": 1,"random_crop": false,"rank_dropout": 0,"rank_dropout_scale": false,"reg_data_dir": "","rescaled": false,"resume": "","resume_from_huggingface": "","sample_every_n_epochs": 0,"sample_every_n_steps": 0,"sample_prompts": "","sample_sampler": "euler_a","save_every_n_epochs": 1,"save_every_n_steps": 0,"save_last_n_steps": 0,"save_last_n_steps_state": 0,"save_model_as": "safetensors","save_precision": "fp16","save_state": false,"save_state_on_train_end": false,"save_state_to_huggingface": false,"scale_v_pred_loss_like_noise_pred": false,"scale_weight_norms": 0,"sdxl": false,"sdxl_cache_text_encoder_outputs": false,"sdxl_no_half_vae": false,"seed": 0,"shuffle_caption": false,"stop_text_encoder_training_pct": 0,"text_encoder_lr": 0.0001,"train_batch_size": 1,"train_data_dir": "/data/kohya_ss/dataset","train_norm": false,"train_on_input": true,"training_comment": "","unet_lr": 0.0001,"unit": 1,"up_lr_weight": "","use_cp": false,"use_scalar": false,"use_tucker": false,"v2": false,"v_parameterization": false,"v_pred_like_loss": 0,"vae": "","vae_batch_size": 0,"wandb_api_key": "","wandb_run_name": "","weighted_captions": false,"xformers": "xformers"
}
2.2 配置图片文件夹和输出目录
在 Kohya_ss 的 GUI 中,点击 loRA
,然后选择 Training
在 Image folder 选项中选择你存储训练图片的文件夹。在 Output folder 中选择你希望保存训练结果(LoRA 文件)的目录。
放图片的文件夹用数字_英文
的格式,比如100_abc这样的名字来命名,100代表重复图像100次,如果你要训练500次,就改成500_abc。jpg和txt都放在一起。为什么要这么取名字,因为这是kohya_ss软件作者定的规矩
文件夹必须放在kohya_ss/dataset
下面
后面详细的参数配置里有Epoch
和Max train step
Train batch size (训练批量大小)
这个参数指定了每次训练时输入到模型中的样本数量。它决定了每一轮(batch)计算的训练数据量。大批量训练能够利用GPU的并行计算能力,但也会消耗更多的内存。较小的批量大小则会减少内存占用,但可能会导致训练速度变慢。
举例来说:
如果设置为 batch size = 64,每次训练时会使用64张图片进行 前向传播和反向传播。
如果内存较小,可能需要降低批量大小以避免内存溢出。
Max train epoch (最大训练周期数)
训练周期数(epoch)指的是整个训练数据集被模型完整使用的次数。一个 epoch 代表训练集中的所有图像都被用来训练了一次。如果这个参数设置为 1,那么模型只会遍历一次训练数据集。
如果设置为 Max train epoch = 1,表示在训练过程中,数据集将只被使用一次。如果你希望模型多次遍历数据集以进行优化,可以增加这个值。
Max train steps (最大训练步数)
训练步数指的是模型参数更新的次数。每个训练步骤对应于一批数据的处理和权重更新。如果设置了 Max train steps,训练将会在达到指定的步数后停止。
如果设置为 Max train steps = 1600,意味着模型将在达到1600步之后停止训练,尽管最大训练周期数可能允许更多的遍历。
注意:如果你同时设置了 Max train epoch 和 Max train steps,训练将会根据更先达到的条件停止。即,如果训练步骤达到了最大步数,训练会提前停止。
还记得之前的文件夹命名吗,10_abc就等于,把文件夹里所有的图片乘以100下,也就是有1000张图片,下面用一段案列分析
假设你有 1000 张图像,epoch 设置为 50,batch_size 为 1,以下是一些相关参数的影响和内存占用的计算。
- 内存占用分析
内存占用主要取决于以下几个因素:
- 每张图像的大小(例如,尺寸、颜色通道等)
- 批量大小(batch_size)
- 图像数量(num_train_images)
- 模型本身的内存占用
但在此情况下,我们主要关注每次训练时的图像数据占用。
假设:
每张图像的尺寸:假设每张图像大小为 256 x 256 x 3(RGB图像)。
图像数据存储:每个像素点使用 4 字节(float32),即 32 位。
每张图像的内存占用:
- 每次训练的内存占用
由于 batch_size = 1,每个批次会加载一张图像到内存中,因此每次训练所需的内存大小就是每张图像的大小。对于每个批次:
- 总训练内存占用
每个 epoch 会遍历所有训练图像一次。在你的配置中,epoch = 50,每个 epoch 会训练 1000 张图像。所以:
每次训练时,每个批次都要将当前的图像加载到 GPU 内存中,因此每个 epoch 的内存占用大约为 750 MiB。所有训练的时候要考虑一下文件夹命名需要重复几次,还有图像的分辨率如果太高了,很可能导致GPU内存不足
训练
点击start training
可能会出现报错
解决方法:
在 CentOS 上设置虚拟显示器(Xvfb)的方法与 Ubuntu 类似。以下是为 CentOS 配置 Xvfb 和运行 GUI 程序的详细步骤:
- 安装 Xvfb
首先,安装 Xvfb 包:
我是centOS用的yum
l,如果是Ubuntu用lapt-get
l
yum install xorg-x11-server-Xvfb
- 启动 Xvfb
启动 Xvfb 服务器并指定显示编号(通常使用 :99):
Xvfb :99 &
这个命令将启动一个虚拟显示器,并且在后台运行。
- 设置 DISPLAY 环境变量
然后,设置 DISPLAY 环境变量,让系统知道应该使用虚拟显示器:
export DISPLAY=:99
这一步非常重要,必须指向 Xvfb 模拟的显示器。你可以将这行代码添加到 .bashrc 或 .bash_profile 文件中,以便在每次登录时自动设置。
验证模型:训练好了,找到文件模型,可以在stable diffusion weui或者comfyui上验证,我用的comfyui,我先找到一张原图,通过反向推理提示词,生成提示词文本,导入到clip进行生成。
相关文章:

完整的 LoRA 模型训练步骤:如何使用 Kohya_ss 进行 LoRA 训练
完整的 LoRA 模型训练步骤:如何使用 Kohya_ss 进行 LoRA 训练 一、环境配置1. 安装 Python 和虚拟环境2. 克隆 Kohya_ss 仓库3. 安装依赖4. 启动 GUI lora训练1. 准备数据 图片处理打标签2. 配置 LoRA 训练2.2 配置图片文件夹和输出目录 训练解决方法: 使…...

视觉分析之边缘检测算法
9.1 Roberts算子 Roberts算子又称为交叉微分算法,是基于交叉差分的梯度算法,通过局部差分计算检测边缘线条。 常用来处理具有陡峭的低噪声图像,当图像边缘接近于正45度或负45度时,该算法处理效果更理想。 其缺点是对边缘的定位…...

git输错用户名或者密码
git push时候跳出window弹窗,输入用户名和密码,如果错误,会有如下情况: $ git push -u origin “master” remote: [session-6c466aa6] rain: Incorrect username or password (access token) fatal: Authentication failed for ‘…...

【Unity Shader编程】之图元装配与光栅化
执行方式:自动完成 图元装配自动化流程 顶点坐标存入装配区 → 按绘制模式连接顶点 → 生成完整几何图元 示例:gl.drawArrays(gl.TRIANGLES, 0, 3)自动生成三角形 会自动自动裁剪超出屏幕范围(NDC空间外)的三角形,仅保…...

以ChatGPT为例解析大模型背后的技术
目录 1、大模型分类 2、为什么自然语言处理可计算? 2.1、One-hot分类编码(传统词表示方法) 2.2、词向量 3、Transformer架构 3.1、何为注意力机制? 3.2、注意力机制在 Transformer 模型中有何意义? 3.3、位置编…...

网页版的俄罗斯方块
1、新建一个txt文件 2、打开后将代码复制进去保存 <!DOCTYPE html> <html lang"en"><head><meta charset"UTF-8"><meta name"viewport" content"widthdevice-width, initial-scale1.0"><title>俄…...
Linux运维_Dockerfile_打包Moby-26.1.4编译dockerd环境
Linux运维_Dockerfile_打包Moby-26.1.4编译dockerd环境 Dockerfile 是一个文本文件, 包含了构建 Docker 镜像的所有指令。 Dockerfile 是一个用来构建镜像的文本文件, 文本内容包含了一条条构建镜像所需的指令和说明。 通过定义一系列命令和参数, Dockerfile 指导 Docker 构…...

数据中心储能蓄电池状态监测管理系统 组成架构介绍
安科瑞刘鸿鹏 摘要 随着数据中心对供电可靠性要求的提高,蓄电池储能系统成为关键的后备电源。本文探讨了蓄电池监测系统在数据中心储能系统中的重要性,分析了ABAT系列蓄电池在线监测系统的功能、技术特点及其应用优势。通过蓄电池监测系统的实施&#…...
layui.table.exportFile 导出数据并清除单元格中的空格
Layui在执行数据导出的时候,会出现部分数据单元格中有空格的情况,下面的方法可以去除掉单元格中的空格,供大家参考!! function table_export(id,title) {//根据传入tableID获取表头var headers $("div[lay-id" id "] .layu…...
vue-指令
前端开发Vue的指令 Vue.js 提供了丰富的指令系统,用于扩展HTML的功能和行为。这些指令可以分为内置指令和自定义指令两大类。以下是对Vue.js中常见指令的详细解释和示例: 1. 内置指令 1.1 插值表达式 用法:{{ expression }}示例ÿ…...

跟着李沐老师学习深度学习(十三)
现代循环神经网络 循环神经网络中梯度异常在实践中的意义引发了一些问题: 早期观测值影响重大:早期观测值对预测所有未来观测值极为重要,如序列中第一个观测值包含校验和,需在序列末尾辨别其是否正确,若无特殊机制存…...
鸿蒙与跨端迁移的重要性
鸿蒙操作系统(HarmonyOS)是由华为公司开发的一款面向未来的全场景分布式操作系统。它旨在提供一个统一的平台,支持各种设备之间的无缝协作和数据共享,从而为用户提供更加连贯和高效的体验。在鸿蒙的生态系统中,跨端迁移…...

成员函数定义后面加const是什么功能:C++中const成员函数的作用
成员函数定义后面加const是什么功能:C中const成员函数的作用 前言C中const成员函数的作用总结 前言 在PX4的代码中的位置控制模块中,有这样一个成员函数 void getAttitudeSetpoint(vehicle_attitude_setpoint_s &attitude_setpoint) const;该函数的…...

QSNCTF-WEB做题记录
第一题,文章管理系统 来自 <天狩CTF竞赛平台> 描述:这是我们的文章管理系统,快来看看有什么漏洞可以拿到FLAG吧?注意:可能有个假FLAG哦 1,首先观察题目网站的结构和特征 这个一个文件管理系统&#x…...

UE引擎游戏加固方案解析
据VGinsights的报告,近年来UE引擎在过去几年中市场占比显著增长,其中亚洲市场增幅达到了30%,随着UE5的推出和技术的不断进步,UE引擎在独立开发者和移动游戏开发中的应用也在逐步增加。 UE引擎的优势在于强大的画面表现与视觉特效…...
统计函数运行时间的python脚本
这是一个统计函数运行时间的实用脚本,其中用到了函数的嵌套、链式传输参数,以及修饰器。 import time# 定义一个装饰器timer,用于计算被装饰函数的运行时间 def timer(func):print("执行了timer")def wrapper(*args, **kwargs):st…...

大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(3)
大模型WebUI:Gradio全解11——使用transformers.agents构建Gradio UI(3) 前言本篇摘要11. 使用transformers.agents构建Gradio UI11.3 创建和使用工具Tools11.3.1 默认工具箱与load_tool11.3.2 创建新工具11.3.3 管理代理的工具箱toolbox11.3…...
spring boot知识点5
1.如何你有俩套配置环境,运行时如何选择 如果有俩套配置环境,则需要三个yml application.yml 用于配置你用那个配置环境 application-dev.yml 用于开发配置环境 application-prod.yml 用于发布配置环境 spring:profiles:active: prod # 指定当前激…...
【C++】面向对象的三大特性
面向对象编程三大核心特性:封装、继承和多态。 1. 封装 封装指的是将数据和操作这些数据的方法绑定在一起,形成一个对象,并且隐藏对象的内部实现细节,只暴露必要的接口。封装的目的是保护数据,确保外部代码不能直接访…...
Docker构建时,设定默认进入的工作目录的方法
在 Docker 中,你可以通过不同的方式来设定容器默认进入的目录,以下针对不同场景分别介绍具体方法: 1. 使用 Dockerfile 设定工作目录 如果你是通过构建镜像的方式来运行容器,那么可以在 Dockerfile 中使用 WORKDIR 指令来设置容器启动时的默认工作目录。以下是具体步骤:…...
谷歌浏览器插件
项目中有时候会用到插件 sync-cookie-extension1.0.0:开发环境同步测试 cookie 至 localhost,便于本地请求服务携带 cookie 参考地址:https://juejin.cn/post/7139354571712757767 里面有源码下载下来,加在到扩展即可使用FeHelp…...
PHP和Node.js哪个更爽?
先说结论,rust完胜。 php:laravel,swoole,webman,最开始在苏宁的时候写了几年php,当时觉得php真的是世界上最好的语言,因为当初活在舒适圈里,不愿意跳出来,就好比当初活在…...
django filter 统计数量 按属性去重
在Django中,如果你想要根据某个属性对查询集进行去重并统计数量,你可以使用values()方法配合annotate()方法来实现。这里有两种常见的方法来完成这个需求: 方法1:使用annotate()和Count 假设你有一个模型Item,并且你想…...

什么是库存周转?如何用进销存系统提高库存周转率?
你可能听说过这样一句话: “利润不是赚出来的,是管出来的。” 尤其是在制造业、批发零售、电商这类“货堆成山”的行业,很多企业看着销售不错,账上却没钱、利润也不见了,一翻库存才发现: 一堆卖不动的旧货…...

前端开发面试题总结-JavaScript篇(一)
文章目录 JavaScript高频问答一、作用域与闭包1.什么是闭包(Closure)?闭包有什么应用场景和潜在问题?2.解释 JavaScript 的作用域链(Scope Chain) 二、原型与继承3.原型链是什么?如何实现继承&a…...

Android15默认授权浮窗权限
我们经常有那种需求,客户需要定制的apk集成在ROM中,并且默认授予其【显示在其他应用的上层】权限,也就是我们常说的浮窗权限,那么我们就可以通过以下方法在wms、ams等系统服务的systemReady()方法中调用即可实现预置应用默认授权浮…...

vue3+vite项目中使用.env文件环境变量方法
vue3vite项目中使用.env文件环境变量方法 .env文件作用命名规则常用的配置项示例使用方法注意事项在vite.config.js文件中读取环境变量方法 .env文件作用 .env 文件用于定义环境变量,这些变量可以在项目中通过 import.meta.env 进行访问。Vite 会自动加载这些环境变…...
HTML前端开发:JavaScript 获取元素方法详解
作为前端开发者,高效获取 DOM 元素是必备技能。以下是 JS 中核心的获取元素方法,分为两大系列: 一、getElementBy... 系列 传统方法,直接通过 DOM 接口访问,返回动态集合(元素变化会实时更新)。…...
【WebSocket】SpringBoot项目中使用WebSocket
1. 导入坐标 如果springboot父工程没有加入websocket的起步依赖,添加它的坐标的时候需要带上版本号。 <dependency><groupId>org.springframework.boot</groupId><artifactId>spring-boot-starter-websocket</artifactId> </dep…...

二叉树-144.二叉树的前序遍历-力扣(LeetCode)
一、题目解析 对于递归方法的前序遍历十分简单,但对于一位合格的程序猿而言,需要掌握将递归转化为非递归的能力,毕竟递归调用的时候会调用大量的栈帧,存在栈溢出风险。 二、算法原理 递归调用本质是系统建立栈帧,而非…...