happy-llm 大模型训练排障实战:从环境自检到训练推理的 5 类故障快速定位
【免费下载链接】happy-llm📚 从零开始构建大模型项目地址: https://gitcode.com/GitHub_Trending/ha/happy-llm
先把最近训练现场最常见的几段日志贴出来:
RuntimeError: CUDA out of memory. Tried to allocate 2.50 GiB ValueError: Token indices sequence length is longer than the specified maximum sequence length # SwanLab 截图:loss 三分钟掉到 0.1 以下,grad_norm 平稳 —— 一推理,模型完全看不懂图如果你正在复现 happy-llm 的动手章节(从零构建、预训练、微调大语言模型的开源教程),大概率会撞上上面其中一条。本文按"开工 → 训练 → 推理验收"的任务顺序,把环境自检、训练中故障、推理报错与效果验收拆开讲,每个症状都按"症状 → 原因 → 修复"给出最短路径,读完可以直接照做。
训练前的三项开机自检
用 3 条命令确认 Python 与 GPU 就绪
症状:第一条命令就报错,或torch.cuda.is_available()返回False。原因:Python 与 torch 版本不匹配,或显卡未正确接入当前环境。修复:
python -V python -c "import torch; print(torch.__version__, torch.cuda.is_available(), torch.cuda.get_device_name(0))"第二条同时打印 torch 版本、CUDA 可用性与显卡型号;国产卡(如沐曦 C500)需用厂商提供的定制版 PyTorch,并用mx-smi查看设备与显存状态,确认驱动与框架匹配后再开训。
核对章节依赖,别混装
症状:ImportError或模型加载时抛AttributeError、权重 shape 对不上。原因:happy-llm 按章节拆分依赖,不同章节锁定的 transformers 版本差异很大,装错版本是模型加载失败的高频原因。修复:按当前章节安装对应的依赖清单,例如第六章:
pip install -r docs/chapter6/code/requirements.txt装完执行pip check确认无版本冲突。依赖清单位置:docs/chapter6/code/requirements.txt 与 docs/chapter5/code/requirements.txt,各章对应各章。
先抽查数据再开训
症状:训练跑了几百步后因损坏样本中断,或样本里图像字段为空。原因:多模态数据集分多个子集,个别分片下载不完整或已损坏。修复:
python docs/chapter6/code/download_dataset.py该脚本用--resume-download断点拉取预训练与 SFT 数据集,并可通过HF_ENDPOINT环境变量切换下载镜像加速;多模态数据建议本地抽查若干样本,确认图像可加载、问答字段完整再开训,避免中途断供。
上图为 The Cauldron 数据集的图像与问答对结构(左侧图像、右侧文本与来源标注),抽查时重点确认字段一一对应。
训练中 4 个典型故障与定位
显存溢出(CUDA out of memory)怎么快速排查
症状:训练启动或几百步后抛出CUDA out of memory。原因:批量、上下文长度与图像特征总量叠加后超出显存,或预处理峰值内存没算进去。修复:
- 依次排查三个旋钮:
per_device_train_batch_size减半、开--gradient_checkpointing用计算换显存、把--block_size降到 2048; - 多模态任务限制单样本图像数量,例如 VLM 微调里只取一张图(
example["images"][:1]),因为一张图切块后就能占掉数百 token。
第六章的启动脚本 docs/chapter6/code/pretrain.sh 里已包含--bf16、--gradient_checkpointing与--block_size 2048的组合,可作排查基准。
loss 不降、或降得"太快"都别急着调学习率
症状:两种极端——loss 纹丝不动且grad_norm接近 0;或 loss 掉得异常快、数值低得可疑,但一推理效果极差。原因:模型根本没有在"学"。特征没传进语言模型时,模型会很快学会预测默认占位 token,loss 虚低;该训练的模块被错误冻结时,loss 则完全不降。修复:先查两件事再碰超参:
# 关键标识要在 模型 / 模型.config / 嵌套 backbone 三层同步 model.image_token_id = qwen.image_token_id model.config.image_token_id = qwen.image_token_id model.model.image_token_id = qwen.image_token_id嵌套结构里漏掉一层(只改外层、没改内层 backbone),是视觉特征传不进去的最常见根因;改完确认被训练模块的requires_grad状态与预期一致,再重开训练。
上图是 SwanLab 记录的一次失败训练:错误配置下 loss 下降快得可疑,但推理毫无图像能力,是典型的"曲线好看、模型没学"。
多卡训练吞吐上不去,GPU 利用率怎么查
症状:多卡并行时吞吐低、单步耗时远超预期。原因:数据预处理跟不上、batch 与梯度累积配比不合理,或并行配置没生效。修复:对照 GPU 利用率/显存占用曲线判断——显存长期低位说明 batch 偏小,利用率周期性掉零说明数据加载是瓶颈。调大per_device_train_batch_size、配合gradient_accumulation_steps保持全局批量不变,同时启用 bf16 与 DeepSpeed ZeRO-2:
--per_device_train_batch_size 16 --gradient_accumulation_steps 4 \ --bf16 --deepspeed docs/chapter6/code/ds_config_zero2.jsonds_config_zero2.json中zero_optimization.stage: 2负责切分优化器状态,bf16.enabled: auto自动启用混合精度。
Token 超长报错:max sequence length 推理报错怎么解
症状:推理阶段报Token indices sequence length is longer than the specified maximum sequence length。原因:高分辨率图像经分块(image splitting)后,单张图的视觉 token 远超模型上下文预算。修复:把总 token 预算拆成"图像配额 + 文本上限",先算清单张图占多少 token,再据此限制输入长度,或减少单次输入的图像数量,确保图像特征加文本不超过模型处理上限。
上图是 SwanLab 里一次正常微调的 loss 曲线与 GPU 监控,可作为判断自己训练是否健康的对照基准。
推理验收:中文理解差与效果核对
中文问答答非所问,微调数据里中文样本占比太低
症状:模型对中文指令 + 图像的回答驴唇不对马嘴,或夹杂英文输出。原因:基座以英文数据为主,微调时中文图文样本不足,对话模板也没适配中文指令。修复:
- 把英文问答对翻译成中文再进训练集(项目里就用翻译工具处理过 COCO-QA),并在微调集中保留一定比例纯文本数据防止语言能力退化;
- 设计统一的多模态对话模板,让视觉占位符与中文指令在同一上下文中衔接,例如:
user <vision_start><row_1_col_1>图像占位<vision_end> 图中有几只狗?模板中的<vision_start>/<vision_end>与row_1_col_1等位置标记是 SmolVLM2 图像分块流程的组成部分,推理时必须严格保留。
用固定样例集做推理效果验收
症状:不知道微调后到底"行不行"。原因:缺少固定的对照标准。修复:准备一组固定的图 + 问题(如"图中有几只狗"),逐条检查:回答语言是否为中文、think过程是否连贯、多张同类图的结果是否一致。
上图即修复后的验收样例:中文提问、中文回答、思考过程完整,可作为通过标准。
监控指标与资料入口
训练期:loss 与 grad_norm 要交叉看,单看 loss 会被虚低曲线欺骗;GPU 利用率与显存占用维持高水位,才说明 batch、数据管线与并行配置生效。
资料入口:环境搭建看 docs/学习与环境准备.md;训练脚本与配置集中在 docs/chapter6/code/;模型拼接微调的完整思路见 Extra-Chapter/vlm-concatenation-finetune/README.md;推理侧思考预算控制可参考 Extra-Chapter/s1-vllm-thinking-budget/readme.md。
排障顺序记住一句话:环境 → 数据 → 配置 → 超参。每个问题先复现最小案例、留好报错原文与曲线截图,再动手改。遇到本文没覆盖的情况,直接到 happy-llm 仓库的 issue 区搜索最新代码与最新讨论,那里是持续跟进的第一入口。
【免费下载链接】happy-llm📚 从零开始构建大模型项目地址: https://gitcode.com/GitHub_Trending/ha/happy-llm
创作声明:本文部分内容由AI辅助生成(AIGC),仅供参考