如何进行多线程训练

如何使用多线程进行深度学习将GPU性能发挥到极致

1. 硬件配置:

CPU:Intel 至强 E5-2678v3 2个
GPU:Nvidia Geforce RTX 2080 ti 2张
RAM:32GB

2. 软件环境:

OS: Windows 10 1903 企业版
Kernel: 18362.239
Python: 3.6.8
MXNet: 1.5.0
CUDA: 10.1

3. 情况介绍:

图1:单个GPU计算时CPU情况

图2:由于CPU单核性能较弱,2080ti性能并没有发挥到极致 (此时负载一个2080ti)

图3:两个GPU同时计算时CPU情况:

图4:由于CPU负担更重 (负载两个2080ti) ,导致训练速度反而变得更慢

4. 提问:

有没有什么办法能够解决这一问题,或者能否实现多线程的训练(以及如何实现)?

Windows环境不太适合做训练, linux下可以给dataloader设置num_worker进行加速, 可以利用像DALI/Horovod/NCCL的三方库对训练流程进行优化, 但是这些方法在windows上通常是没法用的.

如果只是做MNIST这样的任务, 倒是可以先把所有数据都放到GPU上, windows上应该能跑满GPU.

顺便吐槽一下, 我在自己家里windows电脑上训练烧坏过一块6700K, 从那以后我就再也不在家跑训练了.

我尝试了一下修改d2l里的代码,num_worker,还是用的win10, 发现加载变慢了,然后CPU所有核心都跑慢了,训练速度也提升很多(主机是公司的hhhhhhhh),但是我发现两个E5-2678v3跑满好像都带不动一个2080ti

网络小的时候是这样的, 数据加载过来的之后GPU马上就能完成计算, 然后等着下一批数据被送过来, 所以显得GPU没有跑满. 像你这个例子CPU已经不是瓶颈了, 要从其他的流程里找原因, 比如GPU传输延迟之类的.

应该是这样的,昨天跑DCGAN的时候CPU占用率比较低

刚刚试过更多的num_worker,发现超过4就报错“errno32,broken pipe”,

这是Windows下边的一个bug, 可以参考这个:

非常感谢!
Linux用起来挺麻烦的,不适合产品应用,还是不尝试了,而且实际使用也不会跑LeNet这样的模型:rofl: