DataLoader中num_workers设置多少合适?遇到过too many open files吗?PyTorch的DataLoader中num_workers设置多少合适?遇到过too many open files吗?
num_workers > 0 时,DataLoader 会起多个子进程,每个进程负责从 dataset 里取样本、做 collate、放到队列里;主进程只从队列里取 batch。目的是把数据加载和预处理和 GPU 计算并行,避免 GPU 等数据(数据瓶颈)。workers 越多,理论上吞吐越高,但进程数多了会占 CPU/内存、增加 IPC 和打开文件数。
num_workers 对吞吐的影响做微调。nvidia-smi 里 GPU 利用率长期偏低、且不是模型太小,多半是数据跟不上,可适当加大 num_workers;若 CPU 或 I/O 已经打满,再加 workers 收益不大,反而可能因上下文切换或内存变慢。too many open files 从哪来?每个 worker 进程会打开数据文件(如每张图一个 fd、或每个 shard 一个 fd)、可能还有 pipe/socket(和主进程通信)。打开文件数 = 进程数 × 每进程打开文件数,超过系统 ulimit(open files) 就会报 too many open files(或 OSError 类似错误)。
常见场景:num_workers 较大 + 每个 sample 打开一个文件(如每张图一个文件)、或 dataset 里没及时 close、或系统默认 ulimit 较小(如 1024)。
ulimit -n 65535(或更大),只对当前 shell 及子进程有效。/etc/security/limits.conf 或 systemd 的 service 里设 nofile,然后重新登录或重启服务。__getitem__ 里用完即 close,不要长期持有 fd。| 返回模块 | 返回总览 |