tysgydk/DeepSeek-V2-Lite-LoopIntervention
English summary. This is a work-in-progress research repository that ports a "loop intervention" idea from a dense model to a Mixture-of-Experts trunk: a frozen DeepSeek-V2-Lite-Chat (16B MoE, MLA, hidden 2048) loaded in 4-bit with manually int8-quantized experts, plus a small trainable intervention network (per-loop full-rank projection + gate, about 8.41M parameters). It ships 3 intervention checkpoints (~33.6 MB each) and 12 training / quantization / evaluation scripts — but no trunk weights, no config, no tokenizer, so nothing here can be loaded with from_pretrained. The author marks it as a half-finished prototype whose checkpoints are not usable models: generation collapses.
这是什么
- 主干固定:
DeepSeek-V2-Lite-Chat(作者卡片描述为 16B MoE、MLA 注意力、hidden 2048),全程冻结,只训练外挂干预网络。 - 干预网络(
scripts/train_dsv2.py的ResidualLoop,loop 模式):圈间 Proj 翻译(每圈一份LayerNorm + Linear(2048→2048),满秩)+ 门控(把[h; fh]拼接后预测逐 token 的 z,用凸组合h = (1-z)·h + z·fh混合),每圈重新 forward 主干(真循环)。作者卡片给出的总参数量约 841 万。 - 仓库性质:训练/量化/评测的胶水代码 + 少量中间检查点,不是成品模型。作者在原卡片顶部明确标注「⚠️ 半成品 / Work in Progress …… 干预网络 ckpt 均为实验中间产物,不是可用于正式场景的成品模型」。
- 两个代码世代混在同一目录里:早期 loop 模式用每圈一个标量
loop_gate(对应ckpt/intervdsv2_r2_step3000.pt,作者卡片称"残差循环 R=2(无 GRU 门控)"),后期改成 **GRU 式gate_proj**(对应两个intervdsv2_gru_r2_*)。这直接决定了哪些脚本还能跑,见「已知限制」。
不含完整权重(重要澄清)
- 三个
.pt都是 loop 模式的 checkpoint,字典形态为{'step', 'r', 'loop_sd'}(见train_dsv2.py:592),loop_sd内含proj.{i}.*、门控(loop_gate.{i}或gate_proj.{i}.*),可选interv_loop.*、v_tokens.{i}。 - 仓库内没有主干权重、
config.json、tokenizer 或任何 HF 格式权重文件;AutoModelForCausalLM.from_pretrained("<本仓库>")不能工作。复现需要自行下载主干(脚本里的路径是魔搭/本地 snapshot 形式:/root/autodl-tmp/models/models/deepseek-ai--DeepSeek-V2-Lite-Chat/snapshots/master)。
仓库内容
DeepSeek-V2-Lite-LoopIntervention/
├── README.md # 原卡片(无 license 字段)
├── .gitattributes # 标准模板,声明 *.pt 走 LFS(实际 0 个 LFS 对象)
├── ckpt/ # 3 个干预网络检查点
└── scripts/ # 12 个脚本
ckpt/:3 个检查点
| ckpt(大小) | 结构(引自原卡片) | 状态(引自原卡片) |
|---|---|---|
intervdsv2_r2_step3000.pt (33.6 MB) |
残差循环 R=2(无 GRU 门控,即每圈标量 loop_gate) |
早期版 |
intervdsv2_gru_r2_step2500.pt (33.6 MB) |
GRU 门控 R=2 | 首轮 |
intervdsv2_gru_r2_resume_step1000.pt (33.6 MB) |
GRU 门控 R=2,续训累计 3500 步 | 最终(生成崩坍,待改进) |
- 文件名遵循
train_dsv2.py:593的命名规则interv{--tag}_step{step}.pt:因此intervdsv2_r2_*对应--tag dsv2_r2,..._resume_step1000对应续训那一段的 tag(用--init-ckpt从上一段继承)。仓库没有附带训练日志,步数之外的训练细节只能从文件名读出。 - 三个文件大小几乎一致,与"每圈一份满秩 2048×2048 Proj"的量级相符;GRU 版比无门控版略大(多出两个
gate_proj)。
scripts/:12 个脚本
训练
train_dsv2.py(620 行,最核心):4-bit(bitsandbytes nf4 + double quant)加载主干,再用quantize_all_experts()手动把 MoE 专家权重转 int8;ResidualLoop同时提供 5 种前向——forward_residual(残差堆叠,主干只 forward 一次)、forward_blockwise(中间层 hook 分块残差)、forward_loop(真循环:Proj 翻译 + 门控混合,圈间用torch.utils.checkpoint手动梯度检查点省显存)、forward_vtok(每圈在输入端拼 k 个可学习虚拟 token + 真循环),以及对应的 4 个generate_*。loop 模式的损失是只逼末圈 CE(loss = ls[-1],train_dsv2.py:529注释写作 "C-ablation: 只逼末圈 CE,中间圈完全自由"),并带val_ce早停;非 loop 模式另有 MATH 小样本早停与最优快照回滚。- 关键默认超参(argparse 默认值):
--steps 2000 --bs 2 --lr 1e-3 --weight-decay 0.01 --r 2 --rank 32 --margin 0.01 --lam 1.0 --eval-every 500 --eval-n 8 --patience 2 --val-ratio 0.08 --ce-every 200 --tag res --data /root/autodl-tmp/data/cot_mix_v1.jsonl,序列MAX_LEN = 512。
量化
quantize_dsv2.py(107 行):手工 int8 分组量化(GROUP_SIZE = 128)MoE 专家的gate_up_proj/down_proj,monkey-patchDeepseekV2Experts.forward,并用自定义 autograd Function(QuantLinear)在前向时反量化、反向时重新反量化以省显存;可直接运行,打印量化前后显存。verify_quant.py:对同一 prompt 比较量化前后的 logits(max/mean |diff|、cosine 相似度、top-5 一致性)。
探针 / 冒烟 / 显存
probe_dsv2.py:结构探针——tokenizer vocab/eos、Q4 加载是否成功、顶层与 layer0/mlp 的模块树、显存占用。smoke_dsv2.py:forward_loop+ CE 的冒烟测试(含短生成)。smoke_gru.py:GRU 门控版冒烟——gate_proj结构、z 均值是否落在 [0,1]、gate_proj梯度是否非零、短生成。diag_mem.py:逐步打印显存(embedding / 第一圈 / proj / 第二圈 / 残差 / loss / backward),定位 R=2 训练的峰值来源。mem_test.py:给定序列长度(默认 L=2048)实测训练显存峰值,并按 32 GB 显存算余量。
评测
eval_dsv2.py:加载 loop ckpt,用generate_loop跑 MATH 正确率(位置参数ckpt,--r 2 --n 30 --offset 0 --cap 4096 --rank 32),并打印每题输出。eval_dsv2_base.py:基线对照——无循环,主干直接generate(--n 5 --cap 4096,eos_token_id=100001)。gate_eval.py/gate_scan.py:固定/扫描门控值(gate_eval 默认 0.3 跑 5 题;gate_scan 扫1.0 / 0.3 / 0.1各跑第 1 题)看崩坍是否随 gate 单调变化。
脚本用法(脚本内取证的真实命令)
# 训练:真循环 R=2(GRU 门控)。默认即 steps=2000, bs=2, lr=1e-3, rank=32
python scripts/train_dsv2.py --loop --r 2 --rank 32 --tag dsv2_gru_r2
# 续训:从上一段的点继承,用新 tag(对应 ckpt/intervdsv2_gru_r2_resume_step1000.pt)
python scripts/train_dsv2.py --loop --r 2 --rank 32 --tag dsv2_gru_r2_resume \
--init-ckpt <intervdsv2_gru_r2_step2500.pt>
# 其它前向模式(同一脚本):残差堆叠 / 中间层分块 / 虚拟 token
python scripts/train_dsv2.py --r 2 --rank 32 --tag dsv2_r2
python scripts/train_dsv2.py --n-blocks 6 --rank 8 --tag dsv2_blk
python scripts/train_dsv2.py --loop --vtok 8 --tag dsv2_vtok
# 量化与验证(可直接运行,路径常量指向本地主干)
python scripts/quantize_dsv2.py
python scripts/verify_quant.py
# 探针 / 冒烟
python scripts/probe_dsv2.py
python scripts/smoke_gru.py
python scripts/mem_test.py 2048
# 评测
python scripts/eval_dsv2.py <intervdsv2_gru_r2_resume_step1000.pt> --r 2 --n 30 --cap 4096 --rank 32
python scripts/eval_dsv2_base.py --n 5 --cap 4096
运行前必须处理的两件事:① 脚本里 MODEL 是硬编码的本地 snapshot 路径;② train_dsv2.py 第一行 import 就依赖外部文件(见下)。数据侧同样硬编码:/root/autodl-tmp/data/cot_mix_v1.jsonl、/root/autodl-tmp/data/math500/test.jsonl。
技术要点
- 迁移目标:把"循环干预"从稠密 Qwen 模型搬到 MoE 架构上做实验(同作者的
tysgydk/Qwen3-4B-LoopIntervention对应稠密版)。 - 显存工程是这个仓库的主要工作量:4-bit 主干 + 手动 int8 专家量化 + 圈间手动梯度检查点 + logits 分块计算,
mem_test.py用以按 32 GB 卡算余量。 - 门控设计:从早期"每圈一个标量
loop_gate"演进到"GRU 式gate_proj(Linear(2D→1),逐 token 从[h; fh]预测 z)",h = (1-z)·h + z·fh的凸组合形式在train_dsv2.py与 Qwen 仓库的变换循环中一致。 - 损失取舍:loop 模式只用末圈 CE(作者注释称在 dense 上最稳);非 loop 模式用"各圈 CE 均值 + margin 单调约束"(
train_dsv2.py:1-4的注释给出了残差循环的完整定义与损失)。 - 作者给出的结论(原卡片「当前结论(首轮)」):
- 训练侧正常、生成侧崩坍——val_ce 1.1312、gate 正常、圈间差异为正,但生成 2/2 题崩坍(ok=0、顶帽 100%)。
- 崩坍根因判为周期吸引子(limit cycle):hidden 进入 5-token 周期循环,不是门控失配、不是不动点。
- dense vs MoE 的关键区分:Qwen dense 上真循环失败是"分数低但生成正常",DeepSeek MoE 上失败是"直接生成崩坍";根因指向 MoE 离散 Top-K 路由 + 循环收缩映射。
- 待定修复方向:软路由(专家加权平均替代硬 Top-K)、训练侧 free-run 采样。
已知限制
- 许可:上游采用自定义的 DeepSeek License v1.0(非 OSI 开源许可),本仓库已随附许可全文(根目录
LICENSE)并逐条落实该许可 §4 的四项义务;详见文末「许可」一节。 - 生成崩坍:按作者自述,最终 checkpoint 在生成侧 2/2 题崩坍、顶帽 100%,不可用于任何生成或生产用途;作者给出的定位是"半成品 / Work in Progress"。
- 不是成品模型:无主干权重、无 config、无 tokenizer,不能
from_pretrained,不能直接接 HF pipeline。 - 代码代际不一致(会导致脚本跑不起来):
gate_eval.py、gate_scan.py、smoke_dsv2.py、diag_mem.py都引用lm.loop_gate,而当前train_dsv2.py的 loop 模式用的是gate_proj(GRU 门控),ResidualLoop里已经没有loop_gate属性;同时gate_eval.py/gate_scan.py硬编码从intervdsv2_r2_step3000.pt读loop_gate.*。因此这些探针与最新训练代码不匹配。 - 缺失依赖:
train_dsv2.py:10是from train_interv import load_docs, batchify,而train_interv.py不在本仓库(它属于tysgydk/Qwen3-4B-LoopIntervention);复现训练需要同时取那个仓库的脚本。另外被复用的batchify用151643作 padding id(Qwen 的 pad token),并不是 DeepSeek-V2-Lite 的(其 eos/pad 为100001,见eval_dsv2_base.py与train_dsv2.py:16),属代码复用残留。 - 所有脚本硬编码绝对路径;数据文件(
cot_mix_v1.jsonl、math500/test.jsonl)与量化/评测结果都不在仓库内。 - 作者卡片中的
val_ce 1.1312、2/2 崩坍等结论没有附带日志或结果文件,无法在本仓库内复核;仓库也没有说明训练总耗时、硬件环境。 .gitattributes声明*.pt走 LFS,但仓库内当前 0 个 LFS 对象(.pt为普通文件),迁移到 HF 时需自行决定 LFS 策略。
未说明的信息:训练数据 cot_mix_v1.jsonl 的来源、规模与 token 总量;续训累计 3500 步对应的 epoch 数;每轮实验的硬件与耗时;量化误差的实际数值(verify_quant.py 会打印,但仓库内没有结果);仓库的上传/最后更新时间。
许可
可以公开,但不能标成 Apache-2.0。 上游主干 deepseek-ai/DeepSeek-V2-Lite-Chat 用的是自定义的 DeepSeek License Agreement v1.0(2023-10-23),不在 OSI 认可的开源许可列表内。因此 front matter 采用 license: other + license_name: deepseek-license + license_link: LICENSE,并把许可全文随仓库提供(本仓库根目录的 LICENSE,13,759 字节,取自上游官方仓库)。
允许分发:该许可第 2 条授予「永久、全球、非独占、免费、免版税、不可撤销」的版权许可,明确包含 reproduce / prepare / publicly display / sublicense / distribute;第 4 条进一步允许以任意介质分发 Model 与 Derivatives of the Model(含修改版)。所以本仓库公开是合规的。
但第 4 条的四项义务必须同时满足——本仓库已逐项落实:
| DeepSeek License §4 的要求 | 本仓库的处理 |
|---|---|
| a. 管辖使用的条款中必须保留 Attachment A 的使用限制并可执行,且须告知下游 | 见下方「使用限制」,逐条转载 |
| b. 必须向接收方提供本许可的副本 | 根目录 LICENSE = 许可全文 |
| c. 修改过的文件须带显著改动声明 | 本仓库全部文件(干预模块 + 脚本)均为作者新增,不含上游文件 |
| d. 保留版权、专利、商标与署名声明 | 保留许可全文中的 Copyright (c) 2023 DeepSeek,未作删改 |
许可第 4.e 条允许作者为自己的修改另附条款,但前提是仍保留上述使用限制;本仓库选择了最简单稳妥的做法:整仓按 DeepSeek License 发布。
使用限制(转载自 Attachment A,具有约束力):不得将本模型或其衍生物用于——违反任何适用法律法规或侵害第三方合法权益;任何军事用途;剥削、伤害或试图伤害未成年人;为伤害他人而生成或传播可证伪的虚假信息;生成或传播受监管的不当内容;未经授权生成或传播个人身份信息;诽谤、贬损或骚扰他人;对个人法律权利产生不利影响或创设约束性义务的全自动决策;基于线上/线下社会行为或人格特征歧视、伤害个人或群体;利用特定群体的年龄、社会、身体或心理特征实质性扭曲其行为并造成身心伤害;基于受法律保护的特征或类别歧视个人或群体。
关于「本仓库不含主干权重」:本仓库只分发约 841 万参数的干预模块与脚本,不含 DeepSeek-V2-Lite-Chat 的任何权重文件。但这类「基于上游模型激活/输出训练」的产物在许可定义下仍可能落入 §1 的 Derivatives of the Model,故上面四项义务按最谨慎口径一并履行。主干权重请自行从上游仓库获取,其许可独立适用。
输出:许可第 6 条声明 DeepSeek 不对你生成的输出主张权利,但你需要对输出及其后续使用负责。
引用
- 本仓库(ModelScope):https://modelscope.cn/models/tysgydk/DeepSeek-V2-Lite-LoopIntervention
- 本仓库(Hugging Face):
- 基座:
deepseek-ai/DeepSeek-V2-Lite-Chat(作者卡片声明的仓库名;脚本中为本地 snapshot 路径) - 同作者的稠密版相关仓库:
tysgydk/Qwen3-4B-LoopIntervention(本仓库的train_dsv2.py从它的train_interv.py导入工具函数) - 本仓库未附带论文、arXiv 编号或 BibTeX 条目;如引用请引用上面的仓库地址。
Model tree for tysgydke/DeepSeek-V2-Lite-LoopIntervention
Base model
deepseek-ai/DeepSeek-V2-Lite-Chat