- OpenSpec change: proposal/design/tasks + 3 delta specs (ts-synthesis, ts-multimodal-model, ts-evaluation; 21 requirements) - comet state initialized (phase=build), plan recorded - adopt existing reviewed design doc as Design Doc (+ comet frontmatter) - existing implementation plan (+ comet frontmatter) - workspace .gitignore
5.6 KiB
Context
本 change 在单张 3060 12GB 消费级显卡上做一个可复现的实验性落地:把多变量时序视为独立模态,与文本/事件模态联合注入小型 LLM(Qwen2.5-0.5B-Instruct),端到端任务是时序问答与推理(ChatTS 路线)。
背景与约束来自 MTSAD-技术深度调研报告.md 与 docs/superpowers/specs/2026-06-29-ts-as-modality-design.md(已通过设计评审)。核心约束:
- 算力:单卡 12GB → 骨干 ≤0.5B、依赖 LoRA/QLoRA + 短上下文 + 小批量 + 梯度检查点
- 数据:合成数据为主(CPU 离线生成)→ 评测锚定真实 benchmark,防合成过拟合
- 目标:不追学术 SOTA,追「12GB 跑通、可复现、时序模态确有增益」的可验证结论
Goals / Non-Goals
Goals:
- 全流程单卡 3060 12GB 跑通,阶段②峰值显存 ≤11GB
- TS Encoder + Projector 把时序编码为独立 soft token,使 LLM「能读懂」时序
- 时序模态带来可量化增益:真实 benchmark VUS-PR 显著优于纯 LLM 数值喂文本基线;时序消融后指标明显下降
- 6 类问答任务(描述/异常/根因/预测/比较/事件关联)LLM-judge 均分超纯 LLM 基线
- 评测可复现:含 trivial 基线对照、标注是否用 PA、严守 MTSAD 报告评估纪律
Non-Goals:
- ❌ 不从零预训练 LLM(成本不允许,且非本实验目的)
- ❌ 不做多卡分布式训练(单卡约束)
- ❌ 不追求学术 SOTA 排名
- ❌ 不做端侧部署优化(先验证方法)
- ❌ DPO 首版不做(M5 后视效果再决定)
Decisions
决策 1:采用 Patch-Project + 轻量编码器,而非时序 Tokenization 或 Reprogramming
时序切 patch(P=8, stride=4,通道独立)→ 2 层 Transformer 编码器(d=256, 4 头, ~4M)→ 线性投影(256→896)成独立 TS token,作为可学习 soft token 注入 LLM。
对比的备选方案:
| 方案 | 含义 | 取舍 |
|---|---|---|
| A(选用)Patch-Project + 轻量编码器 | patch→小编码器→线性投影成独立 TS token | 真正的"时序作为模态";12GB 可训;patch 捕捉局部结构、变长友好。代价:需训编码器+投影层(已在显存预算内) |
| B 时序 Tokenization(Chronos 风格) | 数值量化成离散 token、扩展词表 | 最"时序即语言",但量化丢精度、异常细节易损;逐点 token 序列长,12GB 上下文吃紧。放弃 |
| C Reprogramming(Time-LLM 风格) | 冻结 LLM 用文本原型重映射 | 参数最省,但受限于已有文本嵌入流形、表达力弱,时序算不上"真新模态",复杂推理/事件联合弱。放弃 |
决策 2:骨干选 Qwen2.5-0.5B-Instruct
0.5B 中英均衡、有现成 Instruct 版、社区生态成熟;BF16 约 1GB,12GB 余量充足(hidden=896)。
决策 3:两阶段训练,阶段①冻结 LLM
- 阶段① 对齐预训练:冻结 LLM,仅训 TS Encoder + Projector(~4.2M 全参)→ 不存 LLM 优化器状态/梯度,是 12GB 可行的关键省显存技巧
- 阶段② SFT:在此之上叠加 LoRA r=16(q/v_proj,~2-3M),LLM 其余冻结 + 梯度检查点
分阶段 checkpoint 互不污染、可回滚。损失仅对回答段 token 计 LM loss;阶段①叠加对比损失(扰动时序→回答应变)防止 LLM 忽略 TS token。
决策 4:输入拼接顺序 [属性][时间戳][TS token][事件][问题]
属性先给语义,时序居中,事件定位在对应时间,问题在末尾便于回答。
决策 5:合成数据为主,真实 benchmark 仅用于评测锚定
合成管线全 CPU 离线,成分参数随机化;核心红利:异常段、事件时间戳、各成分参数全部作为 ground-truth 自动记录——免费且精确的标签。评测锚定 SMD/MSL/SMAP/SWaT/PSM 真实分布,避免「合成上 SOTA、真实上崩盘」。
决策 6:评测指标以 VUS-PR 为主,严守 MTSAD 报告纪律
- 主指标 VUS-PR(阈值无关);辅 Affiliation-F1(多 λ)、AUC-PR、Point-F1(无 PA)
- PA-F1 仅作对照、不得作主指标(防虚高)
- 问答用 LLM-judge + 规则解析双轨
- 自然语言回答→约束 JSON 区间→逐点分数,便于数值化评测
决策 7:4 类同口径基线
纯 LLM 数值喂文本(检验 TS 模态是否真有增益)、Time-LLM 风格重映射、ChatTS(若可复现)、Trivial(Random/Constant/全报异常)。全部走同一套解析+指标脚本。
Risks / Trade-offs
- [12GB 阶段②仍 OOM] → 降批量/上下文、开 CPU offload 优化器、
adamw_8bit、退回阶段①-only 报告 - [合成→真实泛化差距大(高风险)] → 阶段②掺真实 benchmark 改写样本;评测以真实 benchmark 为准
- [LLM 忽略 TS token] → 对比损失 + "必看时序"样本 + 消融实验定位
- [回答 JSON 解析失败率高] → 训练强化格式约束 + 解析兜底(失败→全 0 计漏报)+ 单独报解析成功率
- [GPT-4o judge 成本] → 仅评测 2k 样本调用;可换开源 judge 做 sanity
- [TS Encoder 过拟合合成分布] → 成分参数随机化 + 多套合成配置 + 阶段②引入真实改写样本
Open Questions
- TS Encoder 层数/d 是否需小规模 sweep(2 层是否够)
- Patch P=8/stride=4 是否最优,是否需对比 P=16
- 对比损失具体形式(InfoNCE vs 扰动一致性)与权重 λ
- DPO 是否纳入首版(建议首版先不做,M5 后视效果决定)
- 真实 benchmark 改写问答的数量与质量校验流程
详细行为需求见
specs/ts-synthesis/、specs/ts-multimodal-model/、specs/ts-evaluation/;任务拆解见tasks.md(M1→M5)。