pytorch錯誤:RuntimeError: received 0 items of ancdata解決

版權聲明:本文爲博主原創文章,歡迎轉載,並請註明出處。聯繫方式:460356155@qq.comshell

RuntimeError: received 0 items of ancdata錯誤是在dataloader加載數據時出現的錯誤,緣由是pytorch多線程共享tensor是經過打開文件的方式實現的,而打開文件的數量是有限制的,經過bash

ulimit -a多線程

core file size          (blocks, -c) 0
data seg size           (kbytes, -d) unlimited
scheduling priority             (-e) 0
file size               (blocks, -f) unlimited
pending signals                 (-i) 128088
max locked memory       (kbytes, -l) 16384
max memory size         (kbytes, -m) unlimited
open files                      (-n) 1024
pipe size            (512 bytes, -p) 8
POSIX message queues     (bytes, -q) 819200
real-time priority              (-r) 0
stack size              (kbytes, -s) 8192
cpu time               (seconds, -t) unlimited
max user processes              (-u) 128088
virtual memory          (kbytes, -v) unlimited
file locks                      (-x) unlimited
ide

可查看,當需共享的tensor超過open files限制時,即會出現該錯誤。
ui

解決辦法有2種:this

一、增長open files的限制數量:spa

不能用sudo ulimit -n命令,而需執行:線程

sudo sh -c "ulimit -n 65535 && exec su $LOGNAME"code

解釋以下: ip

ulimit is a shell builtin like cd, not a separate program. sudo looks for a binary to run, but there is no ulimit binary, which is why you get the error message. You need to run it in a shell.
However, while you do need to be root to raise the limit to 65535, you probably don’t want to run your program as root. So after you raise the limit you should switch back to the current user.
To do this, run:
sudo sh -c "ulimit -n 65535 && exec su $LOGNAME"
and you will get a new shell, without root privileges, but with the raised limit. The exec causes the new shell to replace the process with sudo privileges, so after you exit that shell, you won’t accidentally end up as root again.

 二、修改多線程的tensor方式爲file_system(默認方式爲file_descriptor,受限於open files數量):

 torch.multiprocessing.set_sharing_strategy('file_system')

相關文章
相關標籤/搜索