Docker中PyTorch的dataloader被终止:RuntimeError: DataLoader worker (pid 25564) is killed by signal: Aborted.

问题

在Docker中运行PyTorch程序时,如果报错:

1
RuntimeError: DataLoader worker (pid 123456) is killed by signal: Aborted.

最可能的原因是,Docker的共享内存不足,解决办法是,要么改成更小的batchsize,要么退出docker后,重新运行docker并指定更大的共享内存。这个原因可以从docker的说明文档中可以看出:

1
--oom-kill-disable=false:Whether to disable OOM Killer for the container or not.

这个命令表示是否要kill超出内存的程序,因此解决上面的问题需要重新调整docker的运行内存。

docker的内存

docker中内存相关的命令

关于docker内存相关的命令:(docker中有很多与内存相关的命令,如kernel-memory,oom等,这里列出常用的几个)

命令 说明 中文
-m, —memory=”” Memory limit (format: []). Number is a positive integer. Unit can be one of b, k, m, or g. Minimum is 4M. 使用内存限制,
—memory-swap=”” Total memory limit (memory + swap, format: []). Number is a positive integer. Unit can be one of b, k, m, or g. 总内存设置:内存+交换内存
—shm-size=”” Size of /dev/shm. The format is . number must be greater than 0. Unit is optional and can be b (bytes), k (kilobytes), m (megabytes), or g (gigabytes). If you omit the unit, the system uses bytes. If you omit the size entirely, the system uses 64m. 共享内存

几种内存命令的说明

  1. -m="10g",docker的运行内存,按照官方文档描述,应该是对应于实际机器的物理内存,因此在设置的时候,肯定是要比本机物理内存小的;单位可以是b/k/m/g
  2. -memory-swap="11g",内存+交换内存,即物理内存+交换内存的总大小,要大于等于上面设置的-m的大小,设置格式同上
  3. --shm-size="10g",共享内存,关于共享内存shmswap之间的区别颇让人让人费解的问题,查了一些资料(见最后的参考)后,对于这两个内存的理解可以查看这篇文章:swap和shm的区别