minimind/.trae/documents/训练SDK化与注册鉴权实现.md

53 lines
4.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters!

This file contains ambiguous Unicode characters that may be confused with others in your current locale. If your use case is intentional and legitimate, you can safely ignore this warning. Use the Escape button to highlight these characters.

# 总体架构
- 服务端统一暴露训练服务与进程管理接口;引入客户端注册与鉴权,训练仅对已注册客户端开放。
- 训练能力保持原子化:按 `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) -> str`
- `stop(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` 成功恢复状态。