
CUDA out of memory
快速结论:该报错在使用 Transformers 微调 RT DETR v2 目标检测模型时触发,主要因 DataLoader 共享内存不足导致。优先排查 Docker 容器的 --shm-size 参数是否设置过小。
问题场景
用户在 Transformers 5.12.0 环境下,参考 qubvel/transformers-notebooks 中的 RT DETR v2 微调笔记本,对自定义数据集进行目标检测模型微调。训练约 10 个 epoch 后出现 DataLoader worker 被 bus error 杀死的错误,提示共享内存不足。用户已将 batch size 设为 1 仍无法避免崩溃。
报错原文
ERROR: Unexpected bus error encountered in worker. This might be caused by insufficient shared memory (shm).
RuntimeError: DataLoader worker (pid 365) is killed by signal: Bus error. It is possible that dataloader's workers are out of shared memory. Please try to raise your shared memory limit.
原因分析
根本原因是在 Docker 容器中运行 PyTorch DataLoader 时,默认的 /dev/shm 共享内存大小(通常 64MB)远小于 PyTorch 多进程数据加载的需求。当训练进行到评估(evaluation)阶段时,DataLoader 尝试分配共享内存用于 worker 间通信,超出限制导致 bus error。这与 batch size 大小无直接关系,即使 batch size=1 仍可能触发,因为数据预处理和加载过程的整体内存需求超过共享内存容量。
环境排查
- Python 版本:3.12.13
- Transformers 版本:5.12.0
- 系统环境:Linux 6.1.0-40-amd64 (Docker)
- 需确认 Docker 容器的
--shm-size参数设置(默认通常为 64MB) - 需确认宿主机内存和共享内存大小:
df -h /dev/shm - 需确认
torch.utils.data.DataLoader的num_workers设置(可能默认较高)
解决步骤
- 增大 Docker 共享内存:在启动容器时添加
--shm-size=8g或更高(如16g)。例如:docker run --shm-size=8g ... your_image如果使用 Docker Compose,在
docker-compose.yml中添加:shm_size: '8g' - 降低 DataLoader worker 数量:在 Transformers Trainer 配置中设置
dataloader_num_workers=0或 1,减少多进程争抢共享内存:training_args = TrainingArguments( dataloader_num_workers=0, ... ) - 降低图像尺寸(可优先尝试):之前用户使用宽度
1936不可被 32 整除,导致 RT-DETR 混合编码器中的特征图拼接尺寸不匹配。将图像尺寸改为可被 32 整除的值(如 1920),但共享内存问题与图像尺寸无直接因果关系,此步骤主要解决早期 tensor size mismatch 问题。 - 设置
ignore_mismatched_sizes=True:在加载预训练模型时,处理因类别数不同导致的权重尺寸不匹配。
验证方法
修改共享内存设置后重新训练,观察是否还能复现 “Bus error” 和 “out of shared memory” 报错。如果训练能正常完成多个 epoch 并通过评估循环,则问题解决。可在训练期间监控 free -h 和 df -h /dev/shm 确认 /dev/shm 使用率未满。



