附录 C 常见报错与排查 报错不可怕,可怕的是不知道为什么。本章把项目可能遇到的报错分类整理。 C.1 安装与环境报错 ❌ 原因:Windows 上 tiktoken 编译需要 C++ build tools。 解决: 装 Visual Studio Build Tools,勾选「C++ 桌面开发」。 或用预编译 wheel: 。 ❌ 返回 (但有 NVIDIA 卡) 原因: 默认装 CPU 版。 解决:卸载重装 CUDA 版: 验证: ❌ 原因:transformers 版本太老。 解决: ❌ / / 等 原因:依赖没装全。 解决: C.2 数据加载报错 ❌ 原因:GitHub 在国内访问不稳定,tinyshakespeare 下载失败。
报错不可怕,可怕的是不知道为什么。本章把项目可能遇到的报错分类整理。
error: Microsoft Visual C++ 14.0 or greater is required原因:Windows 上 tiktoken 编译需要 C++ build tools。
解决:
pip install tiktoken --prefer-binary。torch.cuda.is_available() 返回 False(但有 NVIDIA 卡)原因:pip install torch 默认装 CPU 版。
解决:卸载重装 CUDA 版:
pip uninstall torch # 去 PyTorch 官网 拿对应命令,例如: pip install torch --index-url PyTorch 官方 CUDA 轮子仓库(whl/cu121)
验证:
import torch print(torch.cuda.is_available()) # 应该 True print(torch.cuda.get_device_name(0))
ImportError: cannot import name 'GPT2LMHeadModel'原因:transformers 版本太老。
解决:
pip install --upgrade "transformers>=4.36.0"
ModuleNotFoundError: No module named 'tqdm' / gradio / 等原因:依赖没装全。
解决:
pip install -r requirements.txt
urllib.error.URLError: <urlopen error ...>原因:GitHub 在国内访问不稳定,tiny_shakespeare 下载失败。
解决:手动下载并缓存:
data/tiny_shakespeare.txt(UTF-8 编码)python train.py,会命中本地缓存。[dataset] HuggingFace 下载失败原因:tiny_shakespeare 数据集从 HF Hub 下线,或网络问题。
解决:本项目会自动回退到 GitHub 直链下载。如果 GitHub 也失败,见上一条手动方案。
DataLoader 为空 / n_samples = 0原因:数据集 token 数 < block_size + 1。
解决:
# 减小 block_size python train.py --block-size 32 # 或检查数据是否下载成功 ls -lh data/tiny_shakespeare.txt # 应该约 1MB
n_embd must be divisible by n_head原因:注意力头维度非整数(如 n_embd=100, n_head=3,100/3 不是整数)。
解决:调整 n_embd 使其能被 n_head 整除:
# 错误 python train.py --n-embd 100 --n-head 3 # 100/3 = 33.33 # 正确 python train.py --n-embd 96 --n-head 3 # 96/3 = 32 ✓ python train.py --n-embd 384 --n-head 6 # 384/6 = 64 ✓(默认)
size mismatch for wte.weight原因:checkpoint 的 vocab_size 与当前配置不一致。
解决:
vocab_size(保持 50257)。wpe 尺寸会变,要么重训要么用 strict=False 加载(会丢失位置嵌入)。RuntimeError: CUDA out of memory原因:显存不足。
解决:按优先级试:
# 1. 减小 batch_size python train.py --batch-size 8 # 2. 减小 block_size python train.py --block-size 64 # 3. 减小模型规模 python train.py --n-layer 4 --n-embd 256 # 4. 终极:CPU 训练(慢但不会 OOM) python train.py --device cpu
nan原因:学习率过大、数值溢出、梯度爆炸。
排查顺序:
学习率是否过大?
# 减小学习率 + 增加预热 python train.py --learning-rate 1e-4 --warmup-iters 200
数据是否异常?检查 data/tiny_shakespeare.txt 是否包含奇怪字符。
加异常检测定位:
torch.autograd.set_detect_anomaly(True) # 然后训练,会打印是哪个算子产生 NaN
检查梯度裁剪是否生效:确认 grad_clip=1.0。
原因:num_workers > 0 但训练入口未在 if __name__ == "__main__": 保护下。
解决:
本项目已正确处理(train.py 末尾有保护)。
如果你自己改了脚本,确保:
if __name__ == "__main__": train()
或保持 --num-workers 0(默认值,安全)。
原因:可能是显存碎片化、或某处不小心累积了计算图。
排查:
监控显存:
nvidia-smi -l 1
如果显存持续增长,说明有计算图泄漏。
检查是否漏了 optimizer.zero_grad() 或 @torch.no_grad()(推理时)。
重启训练:用 --resume 续训。
tqdm 进度条不刷新原因:Windows 终端有时不显示 \r。
解决:
log_iter 步的 [train] step XXX 日志。KeyError: "model_state_dict"原因:传的 checkpoint 不是本项目格式(可能是 HF 目录或纯 state_dict)。
解决:
确认传的是 train.py 产出的 .pt 文件。
如果是 HF 目录(含 config.json),直接传目录路径:
python inference.py --checkpoint path/to/hf_dir
[model] 加载权重:缺失键 XXX 个,多余键 YYY 个原因:模型架构与 checkpoint 不匹配(改了 n_layer/n_embd 等)。
判断:
缺失=0, 多余=0:完美加载 ✓缺失=几百, 多余=0:模型比 checkpoint 大,部分层是新的(随机初始化)。缺失=几百, 多余=几百:架构完全不匹配,别用了。解决:
--n-layer 等参数。load_for_inference 自动从 checkpoint 读配置(默认行为)。FileNotFoundError: checkpoints/gpt_final.pt原因:没训练就推理。
解决:先训练:
python train.py # 训完后再 inference.py
原因:采样有随机性(temperature > 0)。
解决:
想要确定性,用贪心:
python inference.py --prompt "..." --temperature 0
或固定随机种子:
import torch torch.manual_seed(42)
原因:训练步数太少。
解决:
默认 5000 步。如果还是乱码,加大:
python train.py --max-iters 20000
25M 模型在 tiny_shakespeare 上的合理 loss 约 1.5-2.0。
原因:贪心解码陷入循环。
解决:
--temperature 0.8--top-k 40原因:模型在英文(莎士比亚)上训练,不认识中文。
解决:
[生成失败] ...原因:app.py 的 predict 函数捕获了异常,错误信息显示在输出框。
常见子类:
FileNotFoundError → checkpoint 路径不对。RuntimeError: CUDA OOM → 显存不足,重启或换 CPU。ValueError → 输入异常。localhost:7860排查:
端口被占用?换一个:
python app.py --port 8080
防火墙拦截?Windows 关闭防火墙试一下。
进程没起来?看终端有没有 Running on local URL: 本地地址。
--share 公网链接访问不了原因:Gradio tunnel 服务偶尔抽风,或网络问题。
解决:
排查:
GPU 利用率低(nvidia-smi 显示 < 50%)?
--num-workers(Linux)。--log-iter,避免频繁 .item() 同步。block_size 太大?减小试试。
CPU 训练?CPU 训 25M 模型本来就很慢,几个小时正常。
原因:本项目手写循环没用 KV Cache,每步重算。
解决:
用 HF 的 model.generate(use_cache=True),速度提升 5-10 倍:
model = ... # GPT2LMHeadModel out = model.generate( input_ids=input_ids, max_new_tokens=100, do_sample=True, temperature=0.8, top_k=40, use_cache=True, )
报错 │ ▼ 1. 读完整报错信息(不要只看最后一行) │ ▼ 2. 复制报错信息搜索 │ ▼ 3. 判断报错类型: ├─ ImportError → 装包 ├─ FileNotFoundError → 路径/数据问题 ├─ RuntimeError → 模型/设备问题 ├─ CUDA OOM → 减小 batch/模型 └─ ValueError → 参数不对 │ ▼ 4. 最小复现:用超小配置试 python train.py --max-iters 5 --n-layer 2 --n-embd 64 --n-head 2 --block-size 32 │ ▼ 5. 还不行 → 查 issue 区 / 问 AI
print(x.shape) # torch.Size([32, 128]) print(x.dtype) # torch.int64 print(x.device) # cuda:0
很多 bug 是 shape 对不上。
print(f"step={step} loss={loss.item():.4f} lr={scheduler.get_last_lr()[0]:.2e}")
观察训练是否在正常进行。
# 用玩具配置快速试 python train.py --max-iters 5 --n-layer 2 --n-embd 64 --n-head 2 --block-size 32
5 步训练几秒就完,适合验证修改是否有效。
如果某个修改导致崩溃,回退一半,再回退一半,快速定位是哪一行的问题。
# 在代码里加 import pdb; pdb.set_trace() # 或运行时 python -m pdb train.py
常用命令:n(下一步)、s(进入函数)、p var(打印变量)、c(继续)、q(退出)。
求助前确认:
--max-iters 5 --n-layer 2 ...)能复现吗?把这些信息一起贴出来,别人能更快帮你。
| 报错 | 原因 | 解决 |
|---|---|---|
CUDA out of memory |
显存不足 | 减小 batch_size / block_size / n_embd;或 CPU |
n_embd must be divisible by n_head |
注意力头维度非整数 | 调整 n_embd 整除 n_head |
DataLoader 为空 |
数据集 token 数 < block_size+1 | 减小 block_size;检查数据下载 |
KeyError: "model_state_dict" |
checkpoint 格式不对 | 确认是本项目 train.py 产出 |
| 训练时 Windows 卡死 | num_workers>0 且入口未保护 | 用 num_workers=0;或保证 if __name__ |
| 推理输出每次不同 | 采样有随机性 | 用 --temperature 0 走贪心 |
| 推理输出乱码 | 训练步数太少 | 默认 5000 步;加大 max-iters |
| loss 变 NaN | 学习率过大 / 数值溢出 | 减小 lr;加梯度裁剪;anomaly 检测 |
urllib.error.URLError |
GitHub 访问受限 | 手动下载放到 data/ |
| Gradio 启动后无法访问 | 防火墙/端口占用 | 换 --port;或 --share |
| 输出重复循环 | 贪心解码陷阱 | 提高温度,开 top-k |
| 中文输出乱码 | 英文模型不认识中文 | 换中文数据训练 |
祝调试顺利!🐛➡️🚀