4.5 KiB
4.5 KiB
总体架构
- 服务端统一暴露训练服务与进程管理接口;引入客户端注册与鉴权,训练仅对已注册客户端开放。
- 训练能力保持原子化:按
train_type(pretrain/sft/lora/dpo/ppo/grpo/spo)分派脚本与参数,保留现有脚本接口。 - 提供 Python SDK,封装注册、发起训练、查询进程与日志等操作,客户端只需少量模型参数即可启动训练。
- Web 端保留现有操作界面,新增注册流程与鉴权头注入。
服务端改造(Flask)
- 新增注册接口:
POST /api/register,入参:name、email;生成并返回client_id与api_key,并在服务端保存(trainer_web/clients.json)。 - 新增鉴权中间件:校验请求头
Authorization: Bearer <api_key>;解析出client_id并附加到请求上下文。 - 训练相关接口全部鉴权并按
client_id隔离:- 保留并保护现有接口:
POST /train(trainer_web/train_web_ui.py:247-266)、GET /processes(trainer_web/train_web_ui.py:267-286)、GET /logs/<process_id>(trainer_web/train_web_ui.py:288-374)、POST /stop/<process_id>(trainer_web/train_web_ui.py:466-485)、POST /delete/<process_id>(trainer_web/train_web_ui.py:487-520)、GET /logfiles、GET /logfile-content/<filename>、DELETE /delete-logfile/<filename>。 training_processes结构增加client_id字段;training_processes.json持久化同步该字段(trainer_web/train_web_ui.py:540-607)。- 在读取日志、停止/删除进程时先校验归属(仅允许操作本客户端的进程与日志)。
- 保留并保护现有接口:
- 抽象原子训练分发器:新增
dispatcher模块,统一train_type → 脚本路径 + 参数构造,内部直接复用现有命令拼装逻辑(trainer_web/train_web_ui.py:59-175)。脚本与参数名均保持不变。 - 安全与配置:
api_key服务端按sha256存储,避免明文;可选SERVER_SECRET用于签发/验证简易令牌。- 新增布尔配置
ALLOW_ANONYMOUS=false,默认禁止匿名训练。
客户端 SDK(Python)
- 包名:
minimind_sdk;类:MinimindClient(base_url, api_key=None)。 - 方法:
register(name, email) -> {client_id, api_key}start_training(train_type, **params) -> process_id(保留与/train相同字段约定)get_processes() -> list、get_logs(process_id) -> strstop(process_id)、delete(process_id)、get_logfiles()、get_logfile_content(filename)、delete_logfile(filename)
- 简化封装:按训练类型提供高层方法:
train_sft(...)、train_dpo(...)、train_ppo(...)等,只暴露核心参数,其余按当前脚本默认值填充(例如 SFT 参考 trainer/train_full_sft.py:83-105)。 - 错误处理:统一抛出带有服务端错误信息的异常;返回类型标准化。
Web 端适配
- 新增“注册”入口:表单提交到
POST /api/register,成功后将api_key保存到localStorage。 apiClient.js在所有请求中自动注入Authorization头(trainer_web/static/js/services/apiClient.js:1-73)。- 进程与日志列表仅展示当前客户端数据;保留现有 Tab 与交互(trainer_web/static/js/app.js:1-24、train/form.js:1-127)。
接口保留与兼容
- 现有 REST 路径与请求体字段保持不变;仅增加注册接口与鉴权要求。
- 训练脚本 CLI 接口完全保留(
argparse参数不改动),通过分发器集中调用。 - 对历史脚本/工具的兼容:如果需要,可保留一个仅本机可用的“匿名模式”开关用于调试(默认关闭)。
数据与安全
- 客户注册数据文件:
trainer_web/clients.json;字段:client_id、name、email、api_key_hash、created_at。 - 进程记录增加
client_id,日志操作前进行归属校验;多租户隔离。 - 不在日志中打印敏感信息;不落盘明文
api_key。
交付与变更点
- 服务端:
train_web_ui.py引入鉴权与client_id归属;新增auth.py与dispatcher.py。 - SDK:
minimind_sdk源码与示例;示例脚本:注册→发起 SFT 训练→轮询进程→查看日志→停止。 - Web:新增注册 UI、
apiClient.js注入鉴权、列表隔离逻辑。
验收与测试
- 未注册请求调用
/train返回401;注册后可正常发起训练。 - 用 SDK 完成一次 SFT 训练,能看到进程、日志、停止与删除操作均正常并隔离。
- 多客户端并发训练与日志隔离验证;重启服务后通过
training_processes.json成功恢复状态。