
Dataset Preparation Deletes Data
快速结论:该问题发生在使用 Kohya SS 的 Dataset Preparation 工具准备训练数据时,工具会因路径冲突(源路径与目标路径相同或嵌套)而误删用户的原始图片数据。优先排查:确保训练图片源路径与准备工具计算出的目标路径不重合。
问题场景
用户在 Kohya SS 的 WebUI 中点击 “Prepare training data” 按钮,用于格式化图片目录(如将图片整理为 img/<repeats>_<instance> <class> 结构)。执行后工具显示 “completed”,但用户的原始图片数据被删除,且无日志输出。随后尝试启动 LoRA 训练时,因图片缺失导致训练失败,WebUI 卡在 “Training has ended” 状态,需强制退出。
报错原文
Completed
Training has ended
工具未输出实质性错误信息,仅显示 “completed”(准备完成后没有任何状态反馈)和 “Training has ended”(训练结束)。实际数据丢失发生在准备阶段。
原因分析
问题根源在于 Dataset Preparation 工具的实现中存在多个安全缺失:
- 路径冲突时直接删除:目标路径如果已经存在,工具会先执行
shutil.rmtree()删除整个目标目录,再执行shutil.copytree()从源目录复制。当源目录与目标目录重合时(例如用户重复运行准备,源路径指向已格式化好的img/<n>_…文件夹),rmtree 会删掉唯一的图片副本,随后 copytree 因源路径不存在而失败。 - 嵌套路径导致递归复制:当源目录(如
…/img)位于目标路径的父目录时,copytree 会递归复制自身,最终耗尽磁盘空间。 - 缺少前置验证:工具在删除或复制之前,未检查:源目录是否存在;解析后的源路径与目标路径是否相同;源路径是否嵌套在目标路径下(或反之)。
- 无 Gradio 状态输出:准备按钮没有绑定 Gradio 状态输出组件,因此验证失败或提前返回时,UI 仍显示 “completed”(看起来执行成功),实际数据已损坏或丢失。
环境排查
- 确认 Kohya SS 版本(建议更新到最新版,该 Issue 已在 2026-07-10 关闭,修复应已包含在后续版本中)
- 检查用户是否在 Dataset Preparation 中设置了与目标路径相同或嵌套的源路径(例如源路径 =
/home/user/dataset/img,目标路径 =/home/user/dataset/img/10_cat,这种情况源路径是目标路径的父目录) - 确认训练图片目录下是否存在
img/、reg/等子目录(这些目录可能是准备工具自动创建的)
解决步骤
- 备份原始数据:在执行任何准备操作前,始终备份训练图片的原始目录。手工将图片分开存放,不要依赖工具自动迁移。
- 避免路径冲突:确保 Dataset Preparation 中设置的源路径(Training images folder)与工具自动计算的目标路径不重叠。工具的目标路径由以下部分组成:
destination/img/<repeats>_<instance> <class>。如果用户将源路径设置为destination/img或destination,就会触发路径冲突。 - 手动准备目录结构:不使用自动准备功能,手工创建
img/(训练图片)和reg/(正则化图片,可选)目录,并按照 Kohya SS 要求的命名格式放置图片(如100_cat表示重复100次的猫图文件夹)。 - 更新到最新版本:拉取 Kohya SS 的最新更新(Issue #3436 已关闭,修复应已合并)。
- 检查状态输出:如果更新后仍遇到问题,检查 Git 日志或讨论区确认 Dataset Preparation 是否已增加 Gradio 状态输出组件(如 Markdown 或 Textbox),以便用户能直接看到成功或拒绝原因。
- 针对训练卡住问题:如果 WebUI 在训练失败后卡住(显示 “Training has ended” 但界面仍认为在训练),需在终端中强制退出(通常用
Ctrl+C或关闭终端窗口),然后重新启动 Kohya SS。
验证方法
- 重新执行 Dataset Preparation 前,先检查日志输出,确认工具已新增路径冲突检测(如 “Source and destination paths cannot be the same” 或 “Destination is nested under source” 等拒绝消息)
- 确保工具不再自动删除任何文件/目录,仅当验证通过且目标路径不存在时才创建目录并复制图片
- 确认准备按钮的 Gradio 界面中有了状态输出字段(如一个文本区域显示结果),不再只显示 “completed”
- 测试重复运行:准备完成后,再次点击 “Prepare training data”,应该看到明确的拒绝消息(如 “Target already exists, refuses to overwrite”),而不是自动删除后重建
- 训练时,确认图片文件夹结构正确且训练可正常启动



