Files
ts-as-modality/openspec/changes/ts-as-modality/design.md
T
张宗平 c160718934 chore(ts-as-modality): scaffold OpenSpec change & adopt reviewed design
- 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
2026-06-29 22:29:31 +08:00

5.6 KiB
Raw Blame History

Context

本 change 在单张 3060 12GB 消费级显卡上做一个可复现的实验性落地:把多变量时序视为独立模态,与文本/事件模态联合注入小型 LLMQwen2.5-0.5B-Instruct),端到端任务是时序问答与推理ChatTS 路线)。

背景与约束来自 MTSAD-技术深度调研报告.mddocs/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

时序切 patchP=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 时序 TokenizationChronos 风格) 数值量化成离散 token、扩展词表 最"时序即语言",但量化丢精度、异常细节易损;逐点 token 序列长,12GB 上下文吃紧。放弃
C ReprogrammingTime-LLM 风格) 冻结 LLM 用文本原型重映射 参数最省,但受限于已有文本嵌入流形、表达力弱,时序算不上"真新模态",复杂推理/事件联合弱。放弃

决策 2:骨干选 Qwen2.5-0.5B-Instruct

0.5B 中英均衡、有现成 Instruct 版、社区生态成熟;BF16 约 1GB12GB 余量充足(hidden=896)。

决策 3:两阶段训练,阶段①冻结 LLM

  • 阶段① 对齐预训练:冻结 LLM,仅训 TS Encoder + Projector~4.2M 全参)→ 不存 LLM 优化器状态/梯度,是 12GB 可行的关键省显存技巧
  • 阶段② SFT:在此之上叠加 LoRA r=16q/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 区间→逐点分数,便于数值化评测

决策 74 类同口径基线

纯 LLM 数值喂文本(检验 TS 模态是否真有增益)、Time-LLM 风格重映射、ChatTS(若可复现)、TrivialRandom/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.mdM1→M5)。