这篇踩坑文章专门讲解 PyTorch 在 Windows 平台训练时非常经典的故障,就是程序启动之后一直卡死,停在读取第一个 batch,没有报错、也不会继续往下跑,绝大多数新手甚至不少有经验的 AI 工程师都会踩这个多进程的坑,根源在于 Windows 的多进程创建方式和 Linux 完全不一样,Linux 使用 fork,而 Windows 只能走 spawn,子进程会重新加载整个脚本,如果代码没有做好隔离,就会反复创建子进程,形成死锁,表面现象就是 DataLoader 一直卡住不动。除了最核心的主入口没有保护之外,自定义数据集、回调函数没法序列化、IDE 调试器干扰、OpenCV 线程冲突,也会加重这个问题。
故障快速定位清单
- 现象特征:脚本运行,模型初始化正常,迭代 DataLoader,卡在第一组 batch,无崩溃报错,GPU、CPU 占用异常,长时间没有输出。
- 优先判断:把 num_workers 设置为 0,如果可以正常跑通,就确认是 Windows 多进程 spawn 带来的问题。
- 次要排查点:如果改成单进程依旧卡住,再去检查磁盘 IO、样本损坏、transform 里的死循环、内存溢出。
- IDE 区分测试:VSCode、Jupyter 里更容易复现;换到原生 CMD、PowerShell 运行,用来排除调试钩子干扰。
核心修复方案
- 使用 if __name__ == "__main__": 包裹训练入口
- 调低或者直接关闭多进程
- 规避不可序列化对象
- 控制第三方库线程
所有创建 DataLoader、启动训练循环的代码,都放到这个判断里面,防止子进程再次执行训练逻辑,不断派生新进程,形成循环。自定义 Dataset、collate_fn、transform 类建议写在全局作用域,不要写在主函数内部,否则序列化失败。
临时方案:num_workers=0,使用单进程加载数据,适合调试;如果需要提速,可以少量开启 worker,同时搭配 multiprocessing_context="spawn" 显式指定。
不要在数据集内部携带锁、打开的文件句柄、CUDA Tensor,这些对象无法 pickle,会造成子进程静默失败。
OpenCV、MKL、OMP 如果不限制线程数量,多 worker 下容易出现内部死锁,可以在脚本最开头设置环境变量限制线程数。
避坑对照表
| 项目 | Linux(fork) | Windows(spawn) |
|---|---|---|
| 进程创建 | 复制进程现场,开销低 | 重启解释器,重新导入全部代码 |
| 入口保护 | 不强制,推荐加上 | 强制,不加极易死锁 |
| CUDA IPC | 支持 | 不支持,不要在 worker 里操作 CUDA |
| 序列化要求 | 宽松 | 严格,自定义类必须可 pickle |
【相关 FAQ】
问题 1:Windows 下 DataLoader 卡死在第一个 batch,是不是一定就是多进程 spawn 的问题?
回答 1:Windows 下 DataLoader 卡死在第一个 batch,最常见元凶就是多进程 spawn 机制,但不是唯一原因;需要先把 num_workers 改成 0,如果正常运行,才能确认是这个坑。
问题 2:修复 Windows 多进程导致 DataLoader 卡在第一个 batch,只加 if __name__ == "__main__" 就够吗?
回答 2:修复 Windows 多进程导致 DataLoader 卡在第一个 batch,加上 if __name__ == "__main__" 是最关键一步,同时还要保证数据集、回调函数可以序列化,不在子进程内操作 CUDA。
问题 3:如果我需要速度,Windows 能不能一直开高 num_workers 跑 DataLoader?
回答 3:Windows 虽然可以开启 num_workers,但受限于 spawn 和 CUDA IPC 的限制,稳定性不如 Linux;想要避开 DataLoader 卡在第一个 batch,优先控制 worker 数量,必要时使用单进程加载。
【参考资料】
[2026-10-26](Python 环境下 PyTorch 如何避免多进程 DataLoader 死锁问题)PHP 中文网
[2025-12-26](训练每隔几步就 “卡半天”?PyTorch DataLoader 阻塞与吞吐骤降的三连坑)腾讯云开发者社区
[2025-09-13](踩坑实录:PyTorch DataLoader 多进程陷阱,Windows 多进程机制刨根问底)DevPress
[2024-06-09](Dataloader slow on pc fast on colab)PyTorch 官方论坛
[2024-03-01](PyTorch Windows 平台官方注意事项)PyTorch 中文文档
【免责声明】
本文仅整理该篇 AI 工程师踩坑实录以及 PyTorch 社区公开排障方案;不同 PyTorch 版本、显卡驱动、系统版本、第三方库版本,都会改变复现难度;如果业务需要稳定高速的数据加载,生产环境优先考虑 Linux。
