和自己训练的大模型对话:train-llm-from-scratch的chat.py完全指南
【免费下载链接】train-llm-from-scratchA straightforward method for training your LLM, from downloading data to generating text.项目地址: https://gitcode.com/GitHub_Trending/tr/train-llm-from-scratch
train-llm-from-scratch 是一个从零训练大模型的开源项目:纯 PyTorch 手写 Transformer,覆盖预训练、SFT、奖励模型、DPO、PPO、GRPO 全流程。而 scripts/chat.py 是整条流水线的"最后一公里"——一条命令,就能和你自己训练的大模型对话,无论是 Base 模型还是经过 SFT 微调的对齐版本。
🚀 为什么需要 chat.py
训练大模型最爽的时刻,就是第一次和它说上话。但直接用生成脚本会遇到两个问题:
- Base 模型只懂"续写",不懂"对话",直接问它问题会得到一堆文字接龙;
- 经过 SFT 之后的模型学会了聊天模板(
<|user|>/<|assistant|>角色标记),必须套上模板它才能正常回答。
chat.py 自动帮你处理这一切:它从 checkpoint 文件里自动读取模型结构(层数、维度、词表),你只需要传一个模型路径,不用手动指定任何超参。
🛠 快速上手:chat.py 的 4 种用法
先克隆仓库并安装:
git clone https://gitcode.com/GitHub_Trending/tr/train-llm-from-scratch cd train-llm-from-scratch pip install -e .用法 1:一次性提问(chat 模式)
适用于 SFT / DPO / PPO / GRPO 微调后的模型,自动套用聊天模板:
python scripts/chat.py --ckpt models/sft.pt --prompt "What is 13 + 29?"用法 2:贪心解码,结果可复现
加--greedy关闭随机采样,每次回答完全一致,适合评估数学题等确定性任务:
python scripts/chat.py --ckpt models/grpo.pt --prompt "What is 13 + 29?" --greedy用法 3:Base 模型原始续写(raw 模式)
预训练后的 Base 模型不会对话,只会续写。加--raw后,你的输入会被当作"前缀",模型接着往下写:
python scripts/chat.py --ckpt models/base_pretrained.pt --raw --prompt "Once upon a time"用法 4:交互式聊天(REPL)
不带--prompt参数,直接进入多轮对话,输入exit或按 Ctrl-D 退出:
python scripts/chat.py --ckpt models/sft.pt启动时它会打印加载信息,方便你确认状态:
loaded models/sft.pt (406M params) on cuda | mode=chat T=0.8 top_p=0.95🎛 采样参数调优:4 个关键旋钮
chat.py 暴露了 4 个最常用的大模型推理参数(源码见 src/post_training/inference.py):
| 参数 | 默认值 | 作用 | 建议 |
|---|---|---|---|
--temperature | 0.8 | 采样随机性,越高越发散 | 开放式聊天用 0.7~1.0 |
--top_p | 0.95 | 核采样,砍掉长尾低概率 token | 保持 0.9 以上 |
--top_k | 不限 | 只在概率最高的 k 个 token 里选 | 可选,一般不用 |
--greedy | 关 | 取概率最大的 token,完全确定性 | 评估/数学题必开 |
--max_new_tokens | 256 | 单次回复最大生成长度 | 按需调整 |
--device | 自动 | cuda / cpu 任选 | 小模型 CPU 也能跑 |
经验法则:想让回答"稳定可复现"就--greedy;想让回答"有趣多样"就调高 temperature。
💬 免命令体验:Streamlit 聊天面板
不想敲命令行?项目自带一个 Streamlit 控制面板,其中 ui/pages/9_Chat.py 就是聊天页:
pip install -e ".[ui]" streamlit run ui/app.py侧边栏可以选择任意 checkpoint、切换 chat/raw 模式、用滑块调节 temperature 和 top-p、填写 system prompt,右侧就是仿真的聊天气泡界面。它和 chat.py 底层调用的是同一个generate_reply函数,所以两边效果完全一致。
📈 如何看出模型真的变强了
对话只是感性体验,项目提供了量化手段:scripts/eval_post_training.py 会对 Base → SFT → DPO → PPO → GRPO 各阶段跑同一套 GSM8K 数学题评测,生成对比表格。
最直观的"SFT 前后行为变化"是:Base 模型面对问题只会继续瞎写;SFT 之后它会老老实实按<think>...</think><answer>42</answer>的结构作答(模板定义在 src/post_training/chat_template.py)——这正是后续 PPO/GRPO 强化学习的优化基础。
下面是预训练阶段真实的 loss 曲线(77M 参数,2x L40 GPU),loss 从 11.14 一路降到 3.7,模型把语言规律压缩进了权重:
❓ 常见问题速查
- 模型加载失败/维度报错?确认 checkpoint 是本项目训练产物——chat.py 从 checkpoint 内嵌的 cfg 恢复结构,跨框架权重不兼容。
- 回复全是乱码?大概率是对 Base 模型用了 chat 模式,Base 模型请加
--raw。 - 回答太长/太短?用
--max_new_tokens控制长度上限。 - GPU 不够?加
--device cpu,13M 参数的小模型 CPU 完全能跑。
📚 延伸阅读
- 推理与聊天专题文档:docs/09_inference.md
- 评测脚本:scripts/eval_post_training.py
- 生成核心(训练/评测/聊天共用):src/post_training/evaluation.py
- UI 说明:docs/howto/ui.md
从下载数据到和自己训练的大模型对话,train-llm-from-scratch 用一套代码打通了全链路。跑通chat.py的那一刻,你会真正体会到"这是我的模型"的重量。
【免费下载链接】train-llm-from-scratchA straightforward method for training your LLM, from downloading data to generating text.项目地址: https://gitcode.com/GitHub_Trending/tr/train-llm-from-scratch
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考