Pytorch数据加载 torch.utils.data.DataLoader 中 num_workers 设置

电脑有10核20线程应该怎么设置torch.utils.data.DataLoader 中 num_workers使得我数据加载最快?

官方指导

pytorch 官方解释为子进程(subprocesses)的数量

num_workers (int, optional) – how many subprocesses to use for data loading. 0 means that the data will be loaded in the main process. (default: 0)

参考
这里我们就需要搞定几个定义:核心数,线程数和进程

核心数,线程数和进程

核心:一个CPU具有的物理核心数(物理概念)
线程(thread):是CPU调度和分配的基本单位(逻辑概念)。
一个计算机可以并发(同时)的线程数,等于计算机上的逻辑处理器的个数(CPU个数 *每个CPU核心数 *每个内核线程数)
进程(process):是操作系统(OS)进行资源(CPU、内存、磁盘、IO、带宽等)分配的最小单位;

进程和线程的关系

另一个博客中的介绍:

进程可以简单理解为一个容器,有自己独立的地址空间,其内部的各个线程共享该地址空间。
其实严格讲应该是线程能够获得CPU资源,进程对CPU资源的获取也是体现在线程上的。至于CPU内核数,和进程线程没直接关系。操作系统(OS)可以把某个进程部署在某个CPU核上,当然这要取决于系统设计。
线程是CPU调度和分配的最小单位,操作系统会根据进程的优先级和线程的优先级去调度CPU。一个计算机可以并发(同时)的线程数,等于计算机上的逻辑处理器的个数(CPU个数 *每个CPU核心数 *每个内核线程数)。
进程、线程是操作系统调度的,进程本身不会负责调度线程。在操作系统看来,线程和进程其实差不多,不同点是线程是迷你的进程,并且进程可以包含多个线程

详细参考

简而言之,就是一个进程可以调用多个线程,那num_workers中一个子进程需要多少个线程呢?就不太清楚了,但是可以确定的是能输入的参数一定事小于等于CPU的总线程数20.

试验

试验过程中将num_workers设置不同的数值,处理一个batch的时间

num_workers Duration of one batch
0 86
4 21
8 18
10 17
20 17

大家品出规律了吗?
个人推测,一个进程至少需要的线程数并不是确定的,程序可以根据本地硬件的情况自适应的调整调用的线程数。在CPU线程数足够的情况下,可以设置num_workers=四分之一到半线程数,CPU的利用率最高。

你可能感兴趣的:(Pytorch,pytorch)