Llama-Factory 训练进度条卡住?排查与优化指南
在大模型落地越来越依赖微调的今天,一个看似不起眼的问题——训练进度条不动了,却常常让开发者陷入焦虑。明明进程没崩、日志还在刷,GPU 利用率也正常,可 WebUI 上的进度条就是一动不动,像极了'假死'。这种情况到底是不是真卡?要不要重启?会不会丢数据?
如果你正在用 Llama-Factory 做模型微调,并且被这类问题困扰过,那你并不孤单。这个框架虽然大大降低了大模型定制的门槛,但其背后的复杂性并未消失,只是被封装得更友好而已。当'表面平静'之下暗流涌动时,我们需要的不是盲目重试,而是深入运行机制去定位根因。
理解机制:为什么进度条会'停'?
Llama-Factory 的核心价值在于它把原本需要写一堆脚本、配一堆参数的大模型微调流程,变成了一键启动的可视化操作。支持上百种主流模型架构,集成 LoRA、QLoRA、全参微调等多种策略,还能通过 WebUI 实时查看 loss 曲线和显存占用。听起来很完美,对吧?
可一旦训练'卡住',这种抽象反而成了障碍:你不知道是数据加载慢、显存溢出、还是前端通信断了。更糟的是,很多人第一反应是关掉重来,结果白白浪费几小时预处理时间。
其实,'进度条卡住'往往不是单一故障,而是一个系统级现象,可能涉及硬件资源、I/O 性能、分布式调度甚至浏览器兼容性。要解决它,必须打通从前端界面到后端训练的全链路认知。
整个流程从你在网页上点下'Start Training'开始。你的配置被序列化成 JSON 发送到后端服务,由 Python 驱动加载模型、构建数据集、初始化训练器。真正的训练逻辑依托于 Hugging Face 的 Transformers + PEFT + Accelerate 三件套,而 UI 更新则依赖 Gradio 的生成器模式(generator)实现流式输出。
也就是说,每当你看到进度条前进一格,背后都是一次成功的状态推送。如果这一步失败或延迟,前端就会'以为'训练卡住了。
所以第一个关键洞察来了:
进度条不动 ≠ 训练停止。
有时候 GPU 跑着 90% 的负载,loss 在稳步下降,只是因为 logging_steps=100 导致前 99 步没有上报状态,前端自然显示为'0%'。这不是 bug,是配置问题。
第一步:确认是否真的卡死了
那怎么判断是不是真的卡了?最直接的方法是看系统资源:
nvidia-smi
htop
- 如果 GPU Util 持续高于 50%,大概率训练仍在进行;
- 如果 CPU 单核跑满而 GPU 空闲,很可能是数据预处理阻塞;
- 如果出现
CUDA out of memory或进程突然退出,则是典型的 OOM 问题。
别只盯着 UI,日志才是真相所在。
打开 logs/train.log 或控制台输出,观察最后一条记录停留在哪里:
[INFO] Dataset loaded, total samples: 50000
[INFO] Training: 0%| | 0/10000 [00:00<?, ?it/s]
如果停在'Dataset loaded'之后,说明还没进入训练循环;如果连第一条 batch 都没送进去,那问题很可能出在 DataLoader 构建阶段。
这时候你可以试着降低 logging_steps 到 1,强制每一 step 都刷新 UI:
logging_steps: 1
或者在命令行加参数:
--logging_steps 1
虽然会带来轻微性能损耗,但在调试阶段非常值得。你会发现所谓的'卡住',很多时候只是反馈太稀疏导致的心理错觉。

