简单记录一次dataloader低效运行DEBUG过程
key words: pytorch, dataloader, multiprocessing
问题描述
- Dataset输入是一组对象,每个对象可以产生20-3000个训练样本。使用IterableDataset,用迭代的方式从每个对象中产生样本。为了支持多进程,预计算了每个对象会产生的样本数,使得分配给每个进程的对象产生的总样本数接近。
- 一开始程序运行正常,开了
num_workers=24,每个进程可以跑满100%的cpu利用率。 - 然后发现了产生样本代码的bug,会重复访问图中的结点,添加visited数组阻止这种行为。
- 重新运行程序,发现只有一个进程在满负荷运行,其他进程都处于等待状态。
解决记录
- 排除了其他地方的代码造成区别的可能性,确定就是添加visited数组导致的。同时确定新增加的代码本身没有问题。
- 猜测是DataLoader出了问题
- 乱七八糟的各种尝试
- 使用pycharm自带的profile工具,得到每个部分运行时间图,发现大部分时间都花在了DataLoader读取数据上,而其中的大部分时间都在进行等待。
![profile结果]()


浙公网安备 33010602011771号