硬件环境
项目规格
| GPU |
NVIDIA RTX 4090D × 1 (22.15 GB VRAM) |
| CPU |
x86_64 |
| RAM |
~32 GB |
| 存储 |
/mnt/scratch (tmpfs, 用于数据缓存) |
运行对比总览
V1 (原版 FRSM)V6 (非 Fast)V6 Fast (200M)V6 Fast (417M) ⭐
| 模型文件 |
frsm.py |
frsm_v6.py |
frsm_v6a_fast.py |
frsm_v6a_fast.py |
| 架构 |
原始 FRSM |
多尺度状态机 (逐 scale 循环) |
多尺度状态机 (einsum 并行) |
同左 |
| d_model |
1904 |
1904 |
1904 |
3000 |
| 参数量 |
~180M |
~200M |
~200M |
~417M |
| num_scales |
— |
4 |
4 |
4 |
| batch_size |
40 (GRPO) |
40 |
40 |
40 |
| max_seq_len |
384 |
384 |
384 |
384 |
| 训练模式 |
GRPO (含 critic) |
纯 pretrain |
纯 pretrain |
纯 pretrain |
| 训练步数 |
27,700/317,577 |
5,850+/396,975 |
12,600 |
6,450+/396,975 |
| 最佳 loss |
~2.97 (lm) |
~2.78 |
~2.55 (平台) |
~2.75 (下降中) |
| 速度 (tok/s) |
~7,080 (177×40) |
~5,360 (134×40) |
9,240 |
~2,320 (58×40) |
| GPU 内存 |
— |
— |
21.1 GB |
19.6 GB (含优化器) |
| epochs |
~0.26 |
~0.03 |
~0.06 |
~0.03 (进行中) |
详细记录
V1 — 原版 FRSM (GRPO 训练)
- 文件: frsm.py、train_pretrain.py → train_grpo.py (含 critic loss)
- 参数: d_model=1904, head=8, n_layer=12, 约 180M
- 训练: GRPO, 含 lm_loss + crit_loss
- 状态: step 27,700/317,577, loss=2.97 (lm) + 1.02 (crit), lm 已平台化
- 速度: ~7,080 tok/s (177 raw × 40 batch)
- 日志: train_out.txt (555 条记录)
- 检查点: frsm_checkpoints/ (2.4 GB)
- 结论: 原始架构已瓶颈,lm loss 无法继续下降(~2.97 平台),转 V6 架构
V6 — 非 Fast 多尺度 (200M)
- 文件: frsm_v6.py、train_frsm_v6.py
- 参数: d_model=1904, num_scales=4, ~200M
- 改进: 多头尺度状态机 + 内容门控 + 门控 soft 更新
- 状态: step 5,850/396,975, loss=2.78 (仍在下降)
- 速度: ~5,360 tok/s (134 raw × 40 batch) — 瓶颈: Python 逐 scale 循环
- 日志: train_v6_out.txt (118 条记录)
- 检查点: frsm_v6_checkpoints/ (2.3 GB)
- 问题: 4 个 scale 用 Python for 循环串行计算,GPU 利用率不足
V6 Fast (200M) — Einsum 并行化
- 文件: frsm_v6a_fast.py(初始版)
- 改进: 将所有 scale 权重合并为 (ns, d, 2d) 张量,用 einsum 一次计算全部 4 个 scale
- 初始问题: batch_size=64 OOM (21.1 GB)
- 修复 1: batch_size 降为 40
- 修复 2: _init_weights — stacked tensor 上用 kaiming_uniform 的 fan_in 计算错误(44x 偏小),改为逐 scale 单独 init
- 修复 3: outputs.append + torch.cat → 预分配 torch.empty(B,T,vs),节省 ~1.7 GB
- 状态: step 12,600, loss=2.55 平台化 — 200M 容量已耗尽
- 速度: 9,240 tok/s(比 V6 非 Fast 快 72%)
- 结论: 模型容量瓶颈,决定尝试 400M+
V6 Fast (417M) ⭐ 当前运行
- 文件: frsm_v6a_fast.py(当前版)
- 启动参数: –d_model 3000 –num_scales 4 –batch_size 40 –max_steps 396975 –lr 0.0005
- 当前状态: step 6,450 / 396,975, loss=2.75 (持续下降中)
- 速度: ~2,320 tok/s (d=3000 的 d² 缩放导致比 200M 慢 4×)
- GPU 内存: 20.9 GB / 23.0 GB (91%) — 含模型 + 梯度 + AdamW 状态
- GPU 温度: 54°C, 利用率: 100%
- epoch 进度: ~3%
- 预计 ETA: ~16 天完成 1 epoch
- 关键修复:
- TF32 NaN: torch.set_float32_matmul_precision('highest') — TF32 的 10-bit 尾数在 6000 维 einsum 内积中溢出,导致 NaN
- 未初始化 bias: b_cand、gate_b1、gate_b2 未在 _init_weights 中初始化,torch.empty 返回 garbage/NaN。修复: 显式 nn.init.zeros_
内存分析(d=3000, bs=40)
组件大小
| 模型参数 (417M × 4B) |
1.67 GB |
| 梯度 (417M × 4B) |
1.67 GB |
| AdamW 状态 (2 × 417M × 4B) |
3.34 GB |
| 持久占用合计 |
6.68 GB |
| 前向激活 (batch 峰值) |
~3-4 GB |
| 缓存分配器碎片 |
~1-2 GB |
| 实际峰值 |
~20.9 GB |
速度对比(d 缩放)
d_model参数量tok/s相对速度
| 1904 |
~200M |
9,240 |
1.00× |
| 3000 |
~417M |
2,320 |
0.25× |
速度下降约 4×,与 d² 缩放一致(注意力 + einsum 均为 O(d²))。
损失曲线

文件清单
文件角色大小
| frsm.py |
V1 模型定义 |
— |
| frsm_v6.py |
V6 非 Fast 模型 |
— |
| frsm_v6a_fast.py |
V6 Fast 模型(当前) |
9.0 KB |
| train_frsm_v6_fast.py |
V6 Fast 训练脚本 |
— |
| train_out.txt |
V1 训练日志 (555 entries) |
— |
| train_v6_out.txt |
V6 非 Fast 日志 (118 entries) |
— |
| train_v6_fast_out.txt |
V6 Fast 417M 日志 (130 entries) |
— |
| frsm_checkpoints/ |
V1 检查点 |
2.4 GB |
| frsm_v6_checkpoints/ |
V6 非 Fast 检查点 |
2.3 GB |
| frsm_v6_fast_checkpoints/ |
V6 Fast 417M 检查点(当前) |
4.7 GB |
| /mnt/scratch/pretrain_t2t_mini.jsonl_cache_8470000_384_v2.pt |
数据集缓存 |
~18 GB |