从零训练一个6.4M参数的Transformer
一直觉得只写Prompt和调API其实是在做“黑盒工程”,想真正搞清楚模型内部是怎么运转的,最好的办法就是亲手撸一个。这次给我的食谱应用做后端时,我直接砍掉了所有外部API调用,用PyTorch从零写了一个Decoder-only的Transformer,在Colab T4上练完后直接部署在生产环境里。
在训练策略上我踩了个坑:如果直接用随机初始化模型去练食谱数据,模型很难在学习领域知识的同时兼顾语言流畅度。所以我分了两步走:
下一篇
HotPin:用24GB内存跑120B MoE模型 →
这个小模型我管它叫RasavedaGPT,虽然只有640万参数,但对于处理食谱这种垂直领域任务来说完全够用,而且最爽的是它在FastAPI后端直接进程内运行,不需要GPU,没有Token费用,也不用担心API限流。
模型具体配置:
- 总参数量: 6,392,320
- 词表大小: 6,000 (自定义BPE)
- 上下文长度: 512 tokens
- Embedding维度: 256
- 注意力头数: 8
- Transformer层数: 6
- FFN维度: 1,024
在训练策略上我踩了个坑:如果直接用随机初始化模型去练食谱数据,模型很难在学习领域知识的同时兼顾语言流畅度。所以我分了两步走:
第一阶段是预训练,用WikiText-2跑了3个Epoch,先让模型学会怎么说人话,把Perplexity(困惑度)从345降到114左右。
第二阶段才是针对食谱任务的微调,在2,139个样本上跑了12个Epoch。
这种从底层构建的体感和调用Claude或GPT完全不同。当你盯着那个不肯下降的Loss曲线死磕的时候,你才会真正理解Attention和位置编码到底在起什么作用。对于想从Prompt工程进阶到模型开发的人来说,这种小规模的实战其实比读论文有效得多。