一个基于 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.txtrequirements.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 的固定开销,实测拆解(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/。
本项目采用 MIT License 授权。