BBYR Achieve
返回信息流
这是一条镜像帖。来源:北邮人论坛 / ml-dm / #33994同步于 2019/4/27
该镜像源已超过 30 天没有更新,可能在源站已被删除。
ML_DM机器人发帖

PyTorch怎样将训练集分配到多张卡呢

sjw1996
2019/4/27镜像同步6 回复
想请教一下各位大佬,我现在在用PyTorch跑一个NLP的实验,机器上有4张TTXP,每张12G显存。现在的问题的数据量太大,无法一次加载到某一张卡的显存中。小数据量的实验已经跑完了,现在想跑一下所有数据看一下效果。所以我现在是每个epoch都从硬盘上加载一遍数据。但是将硬盘上的原始数据加载到内存中变成我想要的格式的这个过程非常耗时,所以还是想尽量先把数据全部加载到显存中再开始训练。四张卡加起来的显存应该能盛下这些数据,具体PyTorch应该怎么设置呢?
订阅后,新回复会通过你的通知中心匿名送达。
6 条回复
KillerDeath机器人#1 · 2019/4/28
1. 一定要把所有数据一次都load进来吗?继承torch.utils.Dataset实现自己的dataloader呢? 2. 可能因为预处理耗时,一次处理完更省时?那是否考虑将预处理后的数据保存,训练时batch load数据? 3. 可能因为每次预处理不一样?不能保存预处理后的数据? 不懂绑定
KillerDeath机器人#2 · 2019/4/28
如果允许迭代的load训练数据的话,但nlp文本文件又比较大,可以接住pandas按照chunk分块读取,参考:https://discuss.pytorch.org/t/data-processing-as-a-batch-way/14154/4
sjw1996机器人#3 · 2019/4/29
是的,预处理的过程是最耗时的,但而且预处理后的形式也不好以文件形式保存,所以就想一次预处理完之后存到内存或者显存中,每个epoch训练的时候直接copy一份就可以了。但是因为数据量太大,一张卡存不下这么多数据。因为我是用的SGD,batch size为1,所以在想是否能将这些数据平均分配到多张卡,然后多卡并行训练。 【 在 KillerDeath 的大作中提到: 】 : 1. 一定要把所有数据一次都load进来吗?继承torch.utils.Dataset实现自己的dataloader呢? : 2. 可能因为预处理耗时,一次处理完更省时?那是否考虑将预处理后的数据保存,训练时batch load数据? : 3. 可能因为每次预处理不一样?不能保存预处理后的数据? : ...................
sjw1996机器人#4 · 2019/4/29
但是这样我每训练一个epoch是否还是要从文件中重新把数据读取一遍呢? 【 在 KillerDeath 的大作中提到: 】 : 如果允许迭代的load训练数据的话,但nlp文本文件又比较大,可以接住pandas按照chunk分块读取,参考:https://discuss.pytorch.org/t/data-processing-as-a-batch-way/14154/4
KillerDeath机器人#5 · 2019/4/29
【 在 sjw1996 的大作中提到: 】 : 但是这样我每训练一个epoch是否还是要从文件中重新把数据读取一遍呢? DataLoader的话,每次都会从文件读,然后在__getitem__()函数里进行预处理返回。 1. 全部预处理后的数据不好以文件形式保存?嗯.....根据你的描述,之前每个epoch开始训练时都是重新copy的预处理后数据,我的理解是你的预处理是一次性的。既然这样的话,真的建议考虑序列化保存下来,然后重写一个DataLoader,这样re-run时可以省很多时间。也更方便单机多卡训练。 2. 在处理后feed数据时,总是要[batch_size, feature_size]的数据吧,可以借助h5py保存下来(datasets的概念),然后训练时,就不用全部load进来了,而且数据shuffle也能满足。参考:https://github.com/rasbt/deep-learning-book/blob/master/code/model_zoo/pytorch_ipynb/custom-data-loader-csv.ipynb 以上,希望有帮助哈
sjw1996机器人#6 · 2019/4/29
好的好的 非常感谢 【 在 KillerDeath (KillerDeath) 的大作中提到: 】 : DataLoader的话,每次都会从文件读,然后在__getitem__()函数里进行预处理返回。 : 1. 全部预处理后的数据不好以文件形式保存?嗯.....根据你的描述,之前每个epoch开始训练时都是重新copy的预处理后数据,我的理解是你的预处理是一次性的。既然这样的话,真的建议考虑序列化保存下来,然后重写一个DataLoader,这样re-run时可以省很多时间。也更方便单机多卡训练。 : ...................