Molecule V0.1 · 设计档案(较真版)
开源名 :molecule · 开源版本 :v0.1 · 内部项目名 :分子模型开源版 · 内部版本 :v31
许可证 :Apache-2.0 · 公开仓库 :codecloud-dev/molecule-lm · 训练 :GitHub Actions 纯 CPU,单轮 ≤6h
本文件是「从训练到部署」全部 25 轮讨论的锁死决策留档,也是实现 / CI 的施工蓝图。任何改动需回到这里对齐。
模型身份(固定不可改):开源语言模型 · 代号 molecule · 由 codecloud-dev 独立开发(codecloud-dev 是它的开发者/家人) 。不写版本号,不写任何公司或操作系统相关内容。
做一个 0.1B 级、纯 CPU 可训、好部署、开源 的自研小模型。架构走通用 decoder-only Transformer (与 Llama/Qwen 同源,好部署),把各家开源的注意力/归一化/训练技巧精挑细选地融合 ,配一套专治小参数困难的「分子小模型专项栈」 。验收目标是 六个基准逐项超过 SmolLM2-135M(±0.5 噪声容差) ,且中文单项必须反超(它中文≈0)。
组件
来源(开源实现)
决策
理由
decoder-only Transformer 骨架
GPT/Llama 通用范式
✅
七年未变,"通用架构"= 它,好部署
RoPE 旋转位置编码 + NTK-aware 动态外推
Llama/Mistral/Qwen/DeepSeek + NTK-aware scaling
✅
替代绝对位置;训 2048、推理动态放大 base 到 ~4096 等效,保高频局部分辨率,2× 外推最稳
GQA 分组查询注意力(9 头 / 3 KV 头 = 3:1)
Llama2/3、Qwen、Gemma、MobileLLM
✅
KV 缓存省、质量几乎不降,小模型推理友好
SwiGLU 激活(FFN = 2.67× hidden)
Llama/Gemma/Qwen/DeepSeek
✅
替掉 GELU/ReLU,8/3 标准预算,质量/参数最平衡
RMSNorm + Pre-Norm
全系标配
✅
省参数、训练稳
QK-Norm(RoPE 前对 Q/K 各加 RMSNorm)
OLMo 2 / Gemma 3 / MiniMax-M2
✅
几乎零成本显著稳训,允许更高学习率
logit 软封顶(注意力 50.0 / 输出 30.0)
Gemma 2
✅
防极端 logit 致训崩/掉点;CPU 用 eager 注意力无 FlashAttention 兼容问题
DeepNorm 增益缩放(30 层深窄稳训)
DeepNet / DeepSeek
✅
残差/注意力输出加增益因子,深窄不梯度爆炸
MTP 多令牌预测(1 模块,共享嵌入+输出头)
DeepSeek-V3
✅
训练密度↑、推理可投机解码加速(首层接受率~90%)
绑定嵌入(输入=输出 embedding)
MobileLLM / PanGu-π
✅
砍词表到 32K 后 reclaim ~20% 参数给网络主体
❌ 滑动窗口注意力
Mistral/Gemma
不融
短上下文小模型用不上
❌ MLA 低秩 KV 压缩
DeepSeek
不融
0.1B 不划算
❌ MoE
DeepSeek/Qwen
坚决不融
小模型加了伤质量
1.1 维度(完全对齐 MobileLLM-125M 实测黄金配置)
hidden_size = 576
intermediate_size = 1536(= 8/3 × 576,SwiGLU 标准预算)
num_hidden_layers = 30(深而窄)
num_attention_heads = 9,num_key_value_heads = 3(GQA 3:1)
head_dim = 64(576/9)
vocab_size = 32768(32K,由 Qwen2.5 词表按语料频率裁剪)
全无 bias(Llama/Qwen 式)
参数总量 ≈ 104–125M("0.1B" 级)
精度:自动探测 ——程序先查 CPU 是否支持 bf16/AMX(torch.backends / CPUID),支持才用 bf16 混合精度,否则回退纯 fp32 (GitHub 免费 runner 多数硬件不支持 bf16,必须回退)。
上下文 max_position_embeddings = 4096,训练序列 seq_len = 2048 + packing 去 padding。
随机种子 seed = 42 + torch 确定性模式,保证可复现/可归因。
2. 分词器(复用 Qwen2.5 + 砍表 + 绑定)
复用 Qwen2.5 分词器 (中文已优化、与多老师同词表空间蒸馏顺、生态通用)。
从 Qwen 原版 ~15 万词表按实际训练语料词频保留最高频 32K ;模型本身仍完全自研。
绑定输入/输出嵌入 (reclaim 参数)。
特殊符复用 Qwen 的 <|endoftext|>/<|im_start|>/<|im_end|> 等。
未登录字符用 byte-level fallback (Qwen 自带 byte token,永不乱码)。
对话模板 ChatML (Qwen 格式)。
混比(单固定) :通用中文 40% + 数学 20% + 代码 20% + 推理 10% + EQ对话 10%。
自包含基线 :仓库内置 seed_corpus.py 种子语料(中文为主的多领域真实文本),无需任何外部模型/网络即可从零训练 ——这是 v0.1 的保底路径。
蒸馏增强(核心惊艳路径,CI 内纯 CPU 生成) :见第 4 节。训练前由 data.build_all_bins 把 teacher_*.jsonl 并入对应 domain 的 .bin;无蒸馏产物时自动 fallback 纯种子语料,绝不阻塞训练。
合规红线 :只用 CC/宽松 + 合成数据;避开百度百科(版权)、悟道(社区许可限制商用)。
去重 :词级(ROUGE-L 0.7)+ 语义(embedding 余弦 0.85)双去重。
过滤 :规则(最小长度 / 格式正确 / 过滤教师拒答"我无法…")+ 轻量质量分类器(删高幻觉样本)。
数据可复现 :合成+精选数据随脚本可复现生成,固定一份快照存 artifact/仓库。
4. 多老师分领域 1对1 蒸馏(5 位老师)——核心惊艳路径,CI 内纯 CPU 生成
领域
老师模型
参数量
温度
通用中文
Qwen2.5-0.5B-Instruct
0.5B
0.9(偏多样)
推理/长链思考
DeepSeek-R1-Distill-Qwen-0.5B
0.5B
0.7(偏准确)
数学
Qwen2.5-Math-0.5B
0.5B
0.6(偏准确)
代码
Qwen2.5-Coder-0.5B
0.5B
0.6(偏准确)
语言组织/EQ(情商高,对标豆包)
Qwen2.5-1.5B-Instruct
1.5B
0.9(偏多样暖)
运行位置 :由独立工作流 distill.yml 在 GitHub Actions 免费 runner(纯 CPU )上生成,不需要任何本地 GPU/机器 。5 个域走 matrix 并行(各跑一个教师,≈5 倍提速),HuggingFace 模型目录用 actions/cache 缓存避免重复下载。
前置条件(一次性) :教师均为 HuggingFace gated 模型,需在仓库 Settings > Secrets 配置 HF_TOKEN(对应账号须已同意各模型协议),否则蒸馏步骤会清晰报错、训练自动回退纯种子。
蒸馏机制(生成式数据蒸馏) :教师生成高质量合成文本 ,学生在该文本上做 next-token 硬 CE 训练(词表天然对齐我们的 32K 裁剪空间)。这是当前 v0.1 实际落地的蒸馏方式(Phi/Gemma 同路线),不依赖教师在线推理。
软蒸馏 KL(预留,未启用) :loss_soft_kl=0.0。真正的 soft-label KL 需教师在线产出 soft logits,纯 CPU 不现实,列为后续 GPU 路线;届时温度 T=2.0、权重 0.5。
断点续跑累积 :distill.py 按 domain 记录条数,软限到点优雅停,跨 run 续跑;产物 teacher_*.jsonl 保留 90 天,可多次跑累积语料。「跑慢点没关系」——靠多趟 CI 累积 token 逼近目标。
DN 域归一化 :按领域梯度方差重缩放,防指令跟随梯度淹没数学梯度导致数学能力被吃(MOPD 核心)。
豆包是闭源 ,无法直接蒸馏,EQ 老师用开源 Qwen2.5-1.5B-Instruct 替身(同生态、Apache-2.0)。
优化器 :Muon(2D 权重)+ AdamW(嵌入/bias/1D)混合;WSD 调度(warmup 6%、stable 90%、decay 末 10%)。
超参基线 :lr=5e-4(AdamW 部分)/ Muon 部分按其特征 lr;weight_decay=0.05;grad_clip=1.0。
梯度累积 :按 CPU 内存自动算最大 microbatch,累积到目标 global batch(塞满算力)。
总损失 :硬 CE 1.0(主骨架)/ MTP 0.1(轻量辅助)。软蒸馏 KL 当前为 0——生成式数据蒸馏已通过 hard CE 吸收教师知识;soft KL 预留为 GPU 路线(见第 4 节)。
续训机制 :存全量续训态 ——model state_dict + Muon/AdamW optimizer state + step 计数 + 数据游标 + RNG 种子;artifact 按 run 编号;下一轮 load 继续,累计 token 逼近目标。
保存频率 :每 2000 step 存一次 + 每轮末强制存。
日志 :stdout 打印(loss/step/lr/tokens/s、eval 分数),CI 直接可见。
首轮预算 :6h 约跑 ~300M token(激进塞满,预分词 mmap + packing + torch.compile)。
数据里程碑 :1B token 起步验证 pipeline + 中文增益;5B 为阶段目标;10B+ 长期。
协议 :zero-shot;MCQ 对 A/B/C/D 算 logprob 归一化取最大(CPU 友好、无生成随机性);dev split;内置精简版基准(自包含,CI 不依赖下载)。
对比基线 :引用 SmolLM2-135M 官方零样本数字作硬靶(下表),我们跑同协议得自己分数逐项对比。
达标线 :六项基准**逐项超过 SmolLM2(±0.5 噪声容差)**即视为"惊艳达标",自动建 GitHub Release(draft)。
基准
SmolLM2-135M
我们的策略
HellaSwag
68.4
英文不能掉
ARC(avg)
43.9
英文不能掉
PIQA
68.4
英文不能掉
MMLU(cloze)
31.5
英文不能掉
Winogrande
51.3
英文不能掉
TriviaQA
4.1
弱项,必超
CMMLU / C-Eval
≈0
中文≈0,主突破口
评测频率 :每 2000 step 跑轻量基准子集看趋势 + 每轮末跑完整六项出对比表。
对比表产出 :CI 打印 + 存 markdown 对比表 artifact。
导出 :自写 GGUF 导出(gguf python 库),完全控制 tied embeddings(output.weight 复用 token_embd.weight)和 32K 自定义词表 + Qwen pre-tokenizer 写入;再用 llama.cpp 的 llama-quantize 出 q8_0(近无损)+ q4_K_M(~0.1GB,手机/CPU 可跑)。
imatrix :生成重要性矩阵后再量化,提升 q4 质量。
server 示例 :提供 llama.cpp server 启动脚本 + 推理示例。
Gradio demo :附本地一行启动对话 demo(体验"情商高"的中文对话)。
工具调用 :支持轻量 function calling(0.1B 容量有限,专注对话+中文+工具格式)。
模型卡透明 :注明训练算力(CPU 单轮 6h)、累计步数、数据量、来源。
身份(固定不可改) :开源语言模型 · 代号 molecule · 由 codecloud-dev 独立开发(codecloud-dev 是它的开发者/家人)。语气/措辞/细节自由,但不得否认这几条。不写版本号,不写任何公司或操作系统相关内容。
许可证 :Apache-2.0;LICENSE 注明融合来源(RoPE/GQA/SwiGLU/MTP 等)+ NOTICE 文件列 Qwen2.5 tokenizer 归属(Apache-2.0)。
文档 :README / 模型卡中英文双语、中文优先。
版本号 :权重 v0.1.0 起始,每轮续训递增补丁号(v0.1.1, v0.1.2…)。
仓库 :codecloud-dev/molecule-lm,公开,main 直接提交。
CI :GitHub Actions,matrix 并行数据配比对照(基准配比 vs 数学/代码加量);纯 CPU 单轮 ≤6h;自动续训 artifact;达标(逐项超 SmolLM2)自动建 draft Release。仅 GitHub Release,不推 HuggingFace。
CPU 6h 跑不完 :跨轮续训 + checkpoint 累积;加速四招(预分词 mmap / packing / torch.compile / 最大 batch + 线程调优)。
bf16 硬件不支持 :程序自动探测,回退 fp32。
蒸馏反而掉点(naive 离线蒸馏实证会伤) :MOPD/DN 域归一化 + 始终保留硬 CE 保底。
小模型嵌入占比爆炸 :砍词表到 32K + 绑定嵌入。
数据合规 :只用 CC/宽松 + 合成。
评测不公 :引用官方同口径数字、zero-shot、逐项对比、±0.5 容差。