Skip to content

About

Lightweight local web UI for fine-tuning LLMs with Unsloth on a single GPU (FastAPI + Jinja2). Data prep, LoRA SFT training with resume and live TensorBoard, streaming chat testing. Bilingual EN/ZH UI, text SFT only.

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Repository files navigation

🚀 Unsloth GUI Trainer:轻量专属微调工作台

Version 0.2.0 Python 3.10+ License: MIT

English

一个基于 FastAPI + Jinja2 + Unsloth 的图形化微调工作台, 专注纯文本单卡 SFT:数据处理、训练、监控、对话全在浏览器里点完,模型和界面语言 统一放设置页,全程不用写代码,不用手改配置文件。

Web 界面默认 http://127.0.0.1:7861,语言切换即时生效、无需重启。 本工具面向本机单用户,没有鉴权,不要把端口直接暴露到公网。

只做文本训练(带图/视频/音频暂不支持)。8GB 显存开箱即用。


✨ 四个入口

入口 干什么
1 🧹 数据处理 选来源(上传 / HF ID / 已有配置)→ 读列 → 映射生成:四角色多选(instruction / input / think / output)→ 单行预览 → 生成统一训练数据
2 🚀 进行训练 按步数/轮次、可取消、多数据集合并、断点续训、TensorBoard 实时看板;训练文本默认走模型自带 chat 模板
3 💬 对话测试 载入 LoRA 流式对话,温度/top-p 等可调,深度思考可开关(think 全空的数据建议关),一键卸载腾显存
⚙️ 设置 模型管理(本地/HF/魔搭增删改)+ 数据管理(统一数据列表、重命名、删除)+ 界面语言

统一数据格式:instruction / input / think / output 四列,多列换行拼接; 训练时 user=指令(+上下文) / assistant=回复(含 think),最终训练文本由模型自带的 chat 模板渲染(tokenizer.apply_chat_template,Unsloth 官方用法);训练页可关掉 「使用模型自带对话模板」退回 Instruction / Input(可选)/ Response 模板。 Response = think + output(think 缺 <think> 标签自动套上); 空回复行自动丢弃。只有数据处理 Tab 产出的统一数据(processed=true、schema v3、 产物目录存在)才会出现在训练下拉里;示例 datasets_config/sunwukong.json 默认是未处理状态,先走一遍数据处理即可训练。

模型管理里每个模型带一个「Unsloth 快速下载(hf_transfer)」开关,默认关闭; 环境不支持 hf_transfer 时保持关闭,避免下载卡在进度条上。


🔧 安装

先决条件:Python 3.10+;训练/推理需要 NVIDIA GPU + CUDA(8GB 显存起步)。

git clone https://github.com/aifeifei798/unsloth-gui.git
cd unsloth-gui

./install.sh              # 默认:Web 界面 + 训练/推理栈
./install.sh --web-only   # 只装 Web 界面(无 GPU / 只看界面时用)
./install.sh --dev        # 额外装 pytest / httpx / pyflakes

脚本会创建 .venv,优先用 uv(自动匹配 torch 后端),没有 uv 就退回 pip。 可用 --venv DIR / --python BIN 指定环境。手动安装仍可执行:

python3 -m venv .venv && source .venv/bin/activate
pip install -r requirements.txt -r requirements-web.txt

requirements.txt 是完整训练栈;requirements-web.txt 只装 Web 层。 没有 GPU / torch 时也能打开 Web 界面、管理模型和数据处理,只是训练和推理会提示缺依赖。


▶️ 运行

./server.sh start
./server.sh status
./server.sh logs -f       # 跟踪日志,Ctrl-C 退出
./server.sh restart
./server.sh stop

前台运行用 ./server.sh run。默认监听 127.0.0.1:7861,可用 --host / --port 覆盖;PID 和服务日志在 .run/(已 git 忽略)。

浏览器打开 http://127.0.0.1:7861,流程:设置页加模型 → 数据处理做数据 → 进行训练(TensorBoard 实时监控,支持中途停止/断点续训)→ 对话测试载入 LoRA 对话。界面语言在设置页里切换,即时生效,无需重启。

训练需要 CUDA + requirements.txt 里的训练栈;Web 启动本身不导入 torch。

产物:outputs/<实验名>/(LoRA 适配器 + run_manifest.json)、 logs/<实验名>/(TensorBoard)、local_data/processed/<数据名>/(统一数据)。 推理页会读取 run_manifest.json 里的 prompt 模板、seq_len 和基础模型信息, 自动对齐训练时的格式。

⏱ 训练启动慢?Unsloth 的几个开关

点「开始训练」后到真正跑起来要一两分钟,这是 Unsloth 的固定开销,实测拆解(RTX 5090 D + Qwen3.5-0.8B):

阶段 默认 关掉后
import unsloth(Zoo 打补丁) ~10s 一样
get_statistics() 联网体检(子进程去 HF 下 README 看服务是否挂) ~76s(慢代理下更久) 默认已堵死(设 UNSLOTH_DISABLE_STATISTICS=1 + 把 get_statistics 换成空实现)
24 层 decoder 的 torch.compile ~30s UNSLOTH_BLOCK_COMPILE=0 可关,但每步会慢一点
权重加载 + 首次前向 ~35s 一样

本项目默认设了 UNSLOTH_DISABLE_STATISTICS=1(那步只是查 HF 通不通,跟训练无关), 并且在 import unsloth 之后把 Unsloth 内部所有 get_statistics 入口换成空实现 (它是 from ._utils import * 绑定的,只设环境变量不够硬),彻底堵死; 连 8.8.8.8:53 的 has_internet() 探活也一并换掉——它在国内/企业防火墙/部分云 环境常年不通(白等 3 秒 × 4),还会 socket.setdefaulttimeout(3) 把整个进程的 socket 默认超时改成 3 秒,慢一点的下载会被误杀超时(我们会在 import 前记住原值并还原)。

真要临时放行体检:UNSLOTH_GUI_ALLOW_STATISTICS=1 ./server.sh start。

想再省启动时间可以设 UNSLOTH_BLOCK_COMPILE=0(跳过 24 层 decoder 的 torch.compile, 代价是每步慢一点):

UNSLOTH_BLOCK_COMPILE=0 ./server.sh start

另外日志里这两行是「降速」提示,装上更快:

  • causal_conv1d is falling back to its reference PyTorch implementation → Qwen3.5 的线性注意力层在走慢路径,pip install causal-conv1d 能提速
  • FA2 = False → 没装 flash-attn 2,只用了 xformers;pip install flash-attn 可再快一截(编译较慢)

📁 目录结构

install.sh              # 一键安装(Web + 训练栈可选)
server.sh               # 后台启动 / 停止 / 重启 / 状态 / 日志
.run/                   # server.sh 的 PID 与服务日志(运行时生成,git 忽略)
web/                    # FastAPI + Jinja2 Web 层
  main.py               # 应用入口、语言中间件、页面路由
  jobs.py               # 后台任务 + SSE(训练/数据处理)
  routers/              # system / models / datasets / prepare / train / inference
  templates/            # base + 四个页面(prepare / train / chat / settings)
  static/               # app.css、页面 JS、DaisyUI vendor
tests/                  # pytest:domain / API / job / SSE / WebSocket
src/
  paths.py              # 统一路径解析(UNSLOTH_GUI_ROOT 可改根目录)
  storage.py            # 配置文件原子写
  config.py             # 模型/数据集配置加载、校验、来源解析
  dataset_utils.py      # 训练格式化、空段清理、多数据集合并
  dataprep.py           # 数据处理:预览、映射、统一数据生成
  data_mgmt.py          # 数据管理:详情、重命名、删除
  train_utils.py        # 后台训练任务、可取消、断点续训、run manifest
  inference_utils.py    # 推理加载、显存管理、流式对话
  tb_utils.py           # TensorBoard 生命周期
requirements.txt        # 完整训练栈
requirements-web.txt    # Web 层依赖(FastAPI / Uvicorn / Jinja2 …)
models.json             # 模型列表(UI 自动维护,也可手写)
datasets_config/        # 数据集配置(数据处理自动生成)
local_data/             # 示例数据、上传文件、处理产物(git 忽略产物)

测试:

pip install pytest
pytest -q tests/

测试会把 UNSLOTH_GUI_ROOT 指到临时目录,不会碰真实的 models.json、 datasets_config/、outputs/ 和 logs/。


📄 License

本项目采用 MIT License 授权。

About

Lightweight local web UI for fine-tuning LLMs with Unsloth on a single GPU (FastAPI + Jinja2). Data prep, LoRA SFT training with resume and live TensorBoard, streaming chat testing. Bilingual EN/ZH UI, text SFT only.

Topics

Resources

Stars

5 stars

Watchers

0 watching

Forks

Releases

Packages

Contributors

Languages