【免费下载链接】mini-AGI
Continual learning model trained from scratch on 8GB VRAM laptop with batch-1 stream of data.
本文带你完整复现mini-AGI的遗忘测量(forgetting probe)实验。mini-AGI 是一个在 8GB 显存显卡上从零开始持续学习的字节级语言模型,它能一边读取新数据一边保持旧知识。开源仓库的 replication/ 工具链把这套遗忘实验做成了可一键复现的流程:下载权重、准备语料、跑探测脚本、生成汇总表格、重绘三张结果位图,全部命令都已给出。
一、遗忘测量工具链能做什么 🧪
遗忘实验回答一个问题:连续读一个陌生主题,模型会不会忘掉已经学会的其他主题?
实验设计是"最坏情况":把模型冷切换到 19 世纪小说语料 PG19 上,以 batch 1 连续读1,048,576 个字符,期间每隔一段重新给全部 9 个主题打分,看"没在读"的那 8 个主题是否退化。工具链由四个部分组成:
| 组件 | 作用 |
|---|---|
| replication/forgetting_probe.py | 遗忘探测主脚本,支持 massed / 冻结 / 交错等 4 种实验臂 |
| replication/cl_summary.py | 把 4 个实验臂的 JSON 结果汇总成对照表,并先给出控制组判定 |
| replication/plot_figures.py | 从结果 JSON 重绘全部三张结果位图 |
| replication/results/ | 官方已跑好的 4 份结果 JSON(control/static/none/trunk01),可跳过训练直接出图 |
实验的四个臂:
- static:冻结专家(
--no-swap),trunk 学习率 = 专家学习率 - none:正常换入换出,trunk 学习率 = 专家学习率(
--trunk-lr-mult 1.0) - trunk01:trunk 学习率降到 0.1 倍(
--trunk-lr-mult 0.1)——正式训练采用的配置 - control:PG19 与其余 8 个主题交错轮读,作为控制组
两个可信性设计值得了解:评分用的FolderEvaluator(minagi/stream.py)每次都从同一批文件、同一位置开始打分,差值只反映模型变化而非采样噪声;探测期间通过model._grower = None禁止专家池增删,避免"没忘"与"偷偷扩容"混淆。
二、环境与权重下载
git clone https://gitcode.com/gh_mirrors/mini/mini-AGI cd mini-AGI pip install torch numpy pyyaml matplotlib权重方面:遗忘实验所有数字都测在同一个检查点上——step 223,506、已读 428.2M 字符、174 个专家、held-out 0.7702 nats。请到 Hugging Face 上的官方权重仓库Volotat/mini-AGI-cl-replication-weights下载weights/文件夹,放到仓库根目录:
mini-AGI/ weights/ # 每个专家一个 .npz 文件,目录本身就是模型⚠️ 关键提示:探测脚本会改写它拿到的权重目录(专家页入时会被标记 dirty)。运行前务必先复制一份:
cp -a weights /tmp/w,然后所有实验臂都指向这份拷贝。
三、准备语料 📚
语料由 corpora/ 模块统一构建,data/train、data/val覆盖 8 个既有主题:
python3 -m corpora all # 8 个主题的全部训练/验证数据新领域 PG19 单独准备,注意它要放在训练语料之外,防止正式训练循环"顺带"读到它:
python3 -m corpora pg19 --split validation \ --out data/cl/pg19 # 新领域,validation 分片这里有两个细节:
- 为什么用
--split validation而不是 test:test 分片是公开 BPB 基准(见 corpora/pg19.py 的说明),留着不动才能与 MambaByte 等已发表数字同轴比较。 data/cl_val的作用:held-out 目录里既有 8 个原有主题的验证集,也有从未被读过的 PG19 书籍——这样"PG19 变好了"就不可能是背下来了。
四、运行遗忘探测
核心命令(trunk 0.1x 缓解配置,即正式训练在用的那组参数):
python3 replication/forgetting_probe.py --weights /tmp/w \ --domain pg19 --read-root data/cl --steps 512 \ --at 0,64,128,256,384,512 --eval-chunks 16 --chunk 2048 \ --lr 2.08e-4 --held-out data/cl_val \ --trunk-lr-mult 0.1 --out replication/results/mine.json关键参数速查:
| 参数 | 含义 |
|---|---|
--weights | 权重副本目录,探测会读写它 |
--domain | 要 massed 连读的主题(这里是 pg19) |
--read-root | 新主题文件所在目录(data/cl),刻意与data/train分离 |
--steps/--at | 总步数;在每个标记步重新给所有主题打分 |
--chunk 2048 | 每步 2048 字符,512 步即 1,048,576 字符 |
--lr 2.08e-4 | 专家学习率,与官方结果一致 |
--trunk-lr-mult | trunk 学习率倍率:0.1 缓解 / 1.0 未缓解 |
--no-swap | 冻结专家臂:第一个窗口准入的专家集一直用到底 |
--rotate a,b,c,... | 交错控制臂:按轮转方式读多个主题 |
--held-out | 打分用的验证集目录(data/cl_val) |
其他三个实验臂只需微调:
# 未缓解臂:--trunk-lr-mult 1.0 # 冻结专家臂:在此基础上加 --no-swap # 交错控制臂: # --rotate pg19,chess,code,stories,arithmetic,wikipedia,chat,reasoning另一个容易踩的坑:优化器状态。optim.npz中的 Adam 动量属于模型状态的一部分,脚本默认通过_load_optim(minagi/store.py)恢复它;如果冷启动优化器,Adam 会在单批梯度上迈出一步巨大的初始更新,把"正在读的主题"都打坏,那读起来像遗忘、实际上不是。
五、一行命令出汇总表
python3 replication/cl_summary.py它会先打印控制组判定再输出各臂对照表:控制组把每个主题都读了,按构造不可能发生遗忘,若它出现退化,说明退化来自实验装置本身而非模型,此时其余各臂只能当作上界看。
四列结果的含义:read(新领域获得)、unread(8 个旧领域平均变化)、retained(相对随机猜测保留了多少进度)、experts(有多少专家收到过梯度)。官方四臂数字:
| 配置 | PG19(新领域) | 8 个旧领域 | 每忘 1 nat 换到 | 保留率 |
|---|---|---|---|---|
| 专家冻结,trunk 全速 | -0.2909 | +1.2663 | 0.23 | 74.12% |
| 正常换出,trunk 全速 | -0.3106 | +1.2628 | 0.25 | 74.25% |
| trunk 0.1x(正式配置) | -0.4216 | +0.1297 | 3.25 | 97.30% |
| 交错控制组 | -0.3124 | -0.0065 | 无遗忘 | 100.13% |
结论一目了然:把 trunk 学习率降到 0.1 倍,新领域学得更快、遗忘量少了一个数量级——慢 trunk 不是牺牲了可塑性。
六、重绘三张位图
python3 replication/plot_figures.py脚本读取 replication/results/ 下的 JSON(如 replication/results/trunk01.json),输出三张图到assets/:mitigations.png(三配置消融对比)、probe_massed.png(massed 连读过程)、probe_interleaved.png(交错控制组)。仓库里已附官方结果 JSON,即使一步实验没跑,这一条命令也能直接出图。
上图为plot_figures.py生成的三面板消融对比:左(A)massed 暴露下 8 个未读主题的平均损失变化,trunk 0.1x 配置(蓝线)远低于两条未缓解曲线;中(B)新领域 PG19 的学习进度,蓝色配置学得最快;右(C)进度保留率,蓝色 97.30% 对红色 74.25%。
七、如何读懂结果图 📊
massed 臂(trunk 0.1x)的过程图:左面板蓝线是正在读的 PG19,稳步降到 -0.4216 nats;灰色带是 8 个未读主题,整体只上浮 +0.1297,且漂移最大的恰是 chat、stories、reasoning 这些"散文型"主题——损伤落在表征重叠的地方。右面板是关键机制:整个连读过程中只有44/174(25%)的专家收到过梯度,路由让更新天然被限制在文本实际触及的局部,这就是遗忘被"圈住"的原因。
交错控制组:PG19 作为 9 个主题之一轮读后降 0.31 nats,其余 8 个主题平均-0.0065(负值是变好了)——对这种架构而言,"新增一个领域"几乎零成本。
八、常见注意事项 ✅
- 永远先拷贝权重:
cp -a weights /tmp/w,否则页式加载会污染真实运行目录(minagi/paged.py 的 dirty 标记机制)。 - 先读控制组判定:
cl_summary.py输出CLEAN才相信 massed 各臂的数字。 - 方差意识:同一配置跑两次约有 0.014 的差距(CUDA 上专家分派不确定),把 0.03 当作"真实差异"的阈值。
- 硬件门槛:与正式训练一致,8GB 显存的 NVIDIA/AMD 显卡或 CPU 均可,参考速度见 README 的 GPU support 一节(RTX 3070 Laptop 约 2,000 字符/秒)。
九、文件索引
- 探测脚本:replication/forgetting_probe.py
- 汇总脚本:replication/cl_summary.py
- 绘图脚本:replication/plot_figures.py
- 官方四臂结果:replication/results/control.json、replication/results/static.json、replication/results/none.json、replication/results/trunk01.json
- PG19 语料构建:corpora/pg19.py
- 权重目录规范:minagi/store.py
- 主配置文件:config.yaml
照着上面五步走完,你就能在自己机器上把 mini-AGI"连续学习不遗忘"的每个数字亲手复现出来——从一份权重拷贝到三张位图,全程无需改动任何仓库文件。
【免费下载链接】mini-AGI
Continual learning model trained from scratch on 8GB VRAM laptop with batch-1 stream of data.
相关推荐
Mindustry 安装与配置指南:从源码构建到启动验证的完整流程
Mindustry 安装与配置指南:从源码构建到启动验证的完整流程 Mindustry 是一款用 Java 编写的自动化塔防 RTS 游戏,你可以在本地把它当作
游戏开发AntiDupl重复图片清理工具:从入门到精通的完整指南
AntiDupl重复图片清理工具:从入门到精通的完整指南 在数字时代,我们每天都在产生大量图片数据,重复图片不仅占用宝贵存储空间,还让图片管理变得混乱。Anti
图像处理桌面应用Potrace 矢量转换工具:从位图到完美矢量的完整指南
Potrace 矢量转换工具:从位图到完美矢量的完整指南 在当今数字化时代,矢量图形转换已成为设计师和开发者必备的技能之一。无论你是需要将公司logo从扫描件转
图像处理后端
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考