miniNLM thin 46M

一个从零训练的中文小模型(46.34M 参数,非嵌入 27.90M),语料是中文网络小说,训练了 7.2B token。 适合用来学习语言模型结构、跑通训练/推理流程、或者当一个小体积的中文续写玩具模型。

配套代码:**github.com/cmddirexit/miniNLM**

权重文件 model.safetensors(176.8 MB,fp32),结构代码随仓库附带,不依赖其它仓库即可加载。

指标

项目 数值
参数 46.34M 总 / 27.90M 非嵌入
训练 token 7.20B
上下文 1024(+32×2 记忆槽 → 有效 2048)
验证集 loss 4.0726(ppl 58.71)
训练步数 146000
词表 SentencePiece BPE,48000

验证集是按同样协议(n_seg=2、bs=4、block 1024、固定随机种子)在留出的小说分片上算的 next-token loss。测试时 600 批跑出的 loss 是 4.0576(ppl 57.83,95% CI ±0.014)。

用法

pip install torch safetensors sentencepiece

# 方式一:git
git lfs install
git clone https://huggingface.co/wcldehgfc/miniNLM-thin-46m
cd miniNLM-thin-46m
python example.py --prompt "他推开客栈的门,"

# 方式二:只下载文件
python -c "
from huggingface_hub import snapshot_download
snapshot_download('wcldehgfc/miniNLM-thin-46m', local_dir='miniNLM-thin-46m')"
cd miniNLM-thin-46m && python example.py --prompt "他推开客栈的门,"

输出示例(prompt = 他把剑收回鞘中,转身看向身后的少年。,temperature 0.75 / top_k 40 / rep_penalty 1.15):

他把剑收回鞘中,转身看向身后的少年。
“你是何人,为何对我天君出手?”白凌雪指着杨叶问道。
杨叶道:“天君,我是杨某人。”
白凌雪闻言脸色顿时一沉,然后看向对面不远处的那个少年:“是你?”
杨叶道:“不错,是我,白仙子,想不到你居然认得我。”

排版、引号、对话分行、人称都像样;但名字会串、人物关系会乱、越往后越飘。

18 行代码加载模型:

import json, torch, sentencepiece as spm
from safetensors.torch import load_model
from model import GPT

conf = json.load(open("config.json"))
model = GPT(conf["arch"]); load_model(model, "model.safetensors"); model.eval()
sp = spm.SentencePieceProcessor(model_file="spm48k_v4.model")
ids = sp.encode("他把剑收回鞘中,转身看向身后的少年。")
x = torch.tensor([ids])
out = model.generate(x, 100, temperature=0.75, top_k=40, eos_id=4,
                     repetition_penalty=1.15)
print(sp.decode(out[0][len(ids):].tolist()))   # 只解码新生成的部分

架构

  • 18 层 Transformer,d=384,8 头,GQA(2 个 KV 头),RoPE 位置编码 + QK-norm
  • 注意力残差(AttnRes):每层对前面所有层的输出做一次学习到的加权,代替单纯的残差累加
  • 记忆槽:每段前面 32 个「读槽」token、后面 32 个「写槽」token;写槽的输出接给下一段当读槽,把上一段的语义摘要带过来(有效上下文 1024 → 2048)
  • SwiGLU FFN、RMSNorm、权重绑定(嵌入 = 输出层)
  • 训练用 bf16 混合精度 + AdamW + z-loss 1e-4

单卡 AMD RX 9060 XT(16 GB)上约 2.9 s/step(batch 4 × grad-accum 6 × 1024 token)。

怎么用比较好

  • temperature 0.7–0.8、top_k 40、repetition_penalty 1.15:稳、不绕圈
  • 温度 0.9 以上开始重复,贪心解码容易掉进 我是……我是…… 的循环
  • 适合:给一句话让它续写网文片段;不适合:问答、代码、事实性知识

局限

  • 46M 参数 + 单一小说语料:知识面很窄,2–3 句之后容易跑题、人名会串
  • 没有做过指令微调(SFT 只到「学会对话格式」的程度),不要期望它听懂复杂指令
  • 中文标点和分段学得不错,但长文本逻辑一致性弱

训练与许可

  • 代码(训练 / 数据管线 / 评测 / SFT):https://github.com/cmddirexit/miniNLM
  • 本仓库里也带了一份 model.py,权重自带架构,不依赖上面那个仓库也能加载
  • 语料为公开网络小说,仅用于研究;模型输出可能复现训练语料片段,商用前请自行评估版权风险
  • 权重以 MIT 许可发布
Downloads last month
383
Safetensors
Model size
46.3M params
Tensor type
F32
·
Inference Providers NEW
This model isn't deployed by any Inference Provider. 🙋 Ask for provider support