背景
当前 TensorBoard(端口 6006)和标签编辑器(dataset-tag-editor,端口 28001)都是外挂式缝合的独立服务,通过 FastAPI 反向代理(proxy.py)转发。这带来了几个严重问题:
- 端口限制 — 云平台(AutoDL、Colab、RunPod)通常只开放 1-2 个端口,28001 和 6006 无法对外暴露,导致这些功能在云端完全不可用
- 反向代理脆弱 — 需要维护 HTTP + WebSocket 两套转发,Gradio 版本升级可能导致兼容性问题
- 依赖链冗长 — tensorboard 和 gradio 各自拖大量依赖,可能与主项目 PyTorch 生态冲突
- 用户体验割裂 — iframe 嵌套导致 UI 风格不统一,跨域问题和样式隔离都有坑
策略:渐进式替换
很多用户已经习惯了 TensorBoard 和 Gradio 版标签编辑器。不一刀切移除,而是:
- 先保留原有服务,同时推出我们自己的内嵌版本
- 两套方案并行,让用户自然迁移
- 当内嵌版功能完全覆盖并且用户体验更好后,再逐步移除旧服务
目标架构
最终实现双端口甚至单端口架构:
主 WebUI (:28000)
├── /lora/* 训练配置页
├── /tensorboard 内嵌 Loss/LR 曲线(新,与旧 TensorBoard 并存)
├── /tageditor 内嵌标签编辑器(新,与旧 Gradio 版并存)
└── /api/* 所有后端 API
训练监控 (:6008) (可选,未来可合并进主 WebUI)
实施阶段
Phase 1:内嵌训练曲线(与 TensorBoard 并存)
Phase 2:内嵌标签编辑器(与 Gradio 版并存)
Phase 3:退役旧服务(条件成熟后)
相关文件
gui.py — 子进程启动逻辑
mikazuki/app/proxy.py — 反向代理
mikazuki/app/application.py — FastAPI 路由挂载
frontend/dist/assets/layout.96d49288.js — 前端 iframe 布局组件
mikazuki/dataset-tag-editor/ — 当前 Gradio 标签编辑器
train_monitor/ — 已有的训练监控模块(可复用架构)
背景
当前 TensorBoard(端口 6006)和标签编辑器(dataset-tag-editor,端口 28001)都是外挂式缝合的独立服务,通过 FastAPI 反向代理(
proxy.py)转发。这带来了几个严重问题:策略:渐进式替换
很多用户已经习惯了 TensorBoard 和 Gradio 版标签编辑器。不一刀切移除,而是:
目标架构
最终实现双端口甚至单端口架构:
实施阶段
Phase 1:内嵌训练曲线(与 TensorBoard 并存)
/api/charts/dataAPI 返回曲线数据Phase 2:内嵌标签编辑器(与 Gradio 版并存)
/api/dataset/list— 列出数据集目录中的图片和标签文件/api/dataset/image/{path}— 返回图片/api/dataset/tag/{path}— 读取/保存标签/api/dataset/tag/batch— 批量搜索替换标签Phase 3:退役旧服务(条件成熟后)
--legacy-tensorboard/--legacy-tageditor开关proxy.py中旧代理代码相关文件
gui.py— 子进程启动逻辑mikazuki/app/proxy.py— 反向代理mikazuki/app/application.py— FastAPI 路由挂载frontend/dist/assets/layout.96d49288.js— 前端 iframe 布局组件mikazuki/dataset-tag-editor/— 当前 Gradio 标签编辑器train_monitor/— 已有的训练监控模块(可复用架构)