网易首页 > 网易号 > 正文 申请入驻

PyTorch中的多进程并行处理

0
分享至

PyTorch是一个流行的深度学习框架,一般情况下使用单个GPU进行计算时是十分方便的。但是当涉及到处理大规模数据和并行处理时,需要利用多个GPU。这时PyTorch就显得不那么方便,所以这篇文章我们将介绍如何利用torch.multiprocessing模块,在PyTorch中实现高效的多进程处理。



多进程是一种允许多个进程并发运行的方法,利用多个CPU内核和GPU进行并行计算。这可以大大提高数据加载、模型训练和推理等任务的性能。PyTorch提供了torch.multiprocessing模块来解决这个问题。

导入库

import torch
import torch.multiprocessing as mp
from torch import nn, optim

对于多进程的问题,我们主要要解决2方面的问题:1、数据的加载;2分布式的训练

数据加载

加载和预处理大型数据集可能是一个瓶颈。使用torch.utils.data.DataLoader和多个worker可以缓解这个问题。

from torch.utils.data import DataLoader, Dataset
class CustomDataset(Dataset):
def __init__(self, data):
self.data = data
def __len__(self):
return len(self.data)
def __getitem__(self, idx):
return self.data[idx]
data = [i for i in range(1000)]
dataset = CustomDataset(data)
dataloader = DataLoader(dataset, batch_size=32, num_workers=4)
for batch in dataloader:
print(batch)

num_workers=4意味着四个子进程将并行加载数据。这个方法可以在单个GPU时使用,通过增加数据读取进程可以加快数据读取的速度,提高训练效率。

分布式训练

分布式训练包括将训练过程分散到多个设备上。torch.multiprocessing可以用来实现这一点。

我们一般的训练流程是这样的

class SimpleModel(nn.Module):
def __init__(self):
super(SimpleModel, self).__init__()
self.fc = nn.Linear(10, 1)
def forward(self, x):
return self.fc(x)
def train(rank, model, data, target, optimizer, criterion, epochs):
for epoch in range(epochs):
optimizer.zero_grad()
output = model(data)
loss = criterion(output, target)
loss.backward()
optimizer.step()
print(f"Process {rank}, Epoch {epoch}, Loss: {loss.item()}")

要修改这个流程,我们首先需要初始和共享模型

def main():
num_processes = 4
data = torch.randn(100, 10)
target = torch.randn(100, 1)
model = SimpleModel()
model.share_memory() # Share the model parameters among processes
optimizer = optim.SGD(model.parameters(), lr=0.01)
criterion = nn.MSELoss()
processes = []
for rank in range(num_processes):
p = mp.Process(target=train, args=(rank, model, data, target, optimizer, criterion, 10))
p.start()
processes.append(p)
for p in processes:
p.join()
if __name__ == '__main__':
main()

上面的例子中四个进程同时运行训练函数,共享模型参数。

多GPU的话则可以使用分布式数据并行(DDP)训练

对于大规模的分布式训练,PyTorch的torch.nn.parallel.DistributedDataParallel(DDP)是非常高效的。DDP可以封装模块并将其分布在多个进程和gpu上,为训练大型模型提供近线性缩放。

import torch.distributed as dist
from torch.nn.parallel import DistributedDataParallel as DDP

修改train函数初始化流程组并使用DDP包装模型。

def train(rank, world_size, data, target, epochs):
dist.init_process_group("gloo", rank=rank, world_size=world_size)
model = SimpleModel().to(rank)
ddp_model = DDP(model, device_ids=[rank])
optimizer = optim.SGD(ddp_model.parameters(), lr=0.01)
criterion = nn.MSELoss()
for epoch in range(epochs):
optimizer.zero_grad()
output = ddp_model(data.to(rank))
loss = criterion(output, target.to(rank))
loss.backward()
optimizer.step()
print(f"Process {rank}, Epoch {epoch}, Loss: {loss.item()}")
dist.destroy_process_group()

修改main函数增加world_size参数并调整进程初始化以传递world_size。

def main():
num_processes = 4
world_size = num_processes
data = torch.randn(100, 10)
target = torch.randn(100, 1)
mp.spawn(train, args=(world_size, data, target, 10), nprocs=num_processes, join=True)
if __name__ == '__main__':
mp.set_start_method('spawn')
main()

这样,就可以在多个GPU上进行训练了

常见问题及解决

1、避免死锁

在脚本的开头使用mp.set_start_method('spawn')来避免死锁。

if __name__ == '__main__':
mp.set_start_method('spawn')
main()

因为多线程需要自己管理资源,所以请确保清理资源,防止内存泄漏。

2、异步执行

异步执行允许进程独立并发地运行,通常用于非阻塞操作。

def async_task(rank):
print(f"Starting task in process {rank}")
# Simulate some work with sleep
torch.sleep(1)
print(f"Ending task in process {rank}")
def main_async():
num_processes = 4
processes = []
for rank in range(num_processes):
p = mp.Process(target=async_task, args=(rank,))
p.start()
processes.append(p)
for p in processes:
p.join()
if __name__ == '__main__':
main_async()

3、共享内存管理

使用共享内存允许不同的进程在不复制数据的情况下处理相同的数据,从而减少内存开销并提高性能。

def shared_memory_task(shared_tensor, rank):
shared_tensor[rank] = shared_tensor[rank] + rank
def main_shared_memory():
shared_tensor = torch.zeros(4, 4).share_memory_()
processes = []
for rank in range(4):
p = mp.Process(target=shared_memory_task, args=(shared_tensor, rank))
p.start()
processes.append(p)
for p in processes:
p.join()
print(shared_tensor)
if __name__ == '__main__':
main_shared_memory()

共享张量shared_tensor可以被多个进程修改

总结

PyTorch中的多线程处理可以显著提高性能,特别是在数据加载和分布式训练时使用torch.multiprocessing模块,可以有效地利用多个cpu,从而实现更快、更高效的计算。无论您是在处理大型数据集还是训练复杂模型,理解和利用多处理技术对于优化PyTorch中的性能都是必不可少的。使用分布式数据并行(DDP)进一步增强了跨多个gpu扩展训练的能力,使其成为大规模深度学习任务的强大工具。

https://avoid.overfit.cn/post/a68990d2d9d14d26a4641bbaf265671e

作者:Ali ABUSALEH

特别声明:以上内容(如有图片或视频亦包括在内)为自媒体平台“网易号”用户上传并发布,本平台仅提供信息存储服务。

Notice: The content above (including the pictures and videos if any) is uploaded and posted by a user of NetEase Hao, which is a social media platform and only provides information storage services.

相关推荐
热点推荐
王志文越老越放飞!58岁穿骚红裤潮得离谱,连名模妻子也黯然失色

王志文越老越放飞!58岁穿骚红裤潮得离谱,连名模妻子也黯然失色

南城无双
2025-01-03 23:34:28
刷新底线!美媒:为了树立威信,莱利曾警告巴特勒不许上场比赛

刷新底线!美媒:为了树立威信,莱利曾警告巴特勒不许上场比赛

鸡丁侃球
2025-01-04 05:14:31
盛草飞,被查

盛草飞,被查

新京报政事儿
2025-01-04 09:18:41
张一山买的二手法拉利,498万,原车主尹喜地,没上牌就卖了

张一山买的二手法拉利,498万,原车主尹喜地,没上牌就卖了

蜉蝣说
2025-01-03 10:32:13
朝鲜突然“撤掉”中朝友好专栏!金正恩又在玩什么套路?

朝鲜突然“撤掉”中朝友好专栏!金正恩又在玩什么套路?

杨子电影
2025-01-04 02:38:09
世体:维尼修斯会被禁赛4-12场,将错过西超杯的比赛

世体:维尼修斯会被禁赛4-12场,将错过西超杯的比赛

懂球帝
2025-01-04 07:55:14
882万?龙宝宝带不动生育率

882万?龙宝宝带不动生育率

金投网
2025-01-03 16:53:59
52岁吴越全素颜亮相,戴奶奶灰帽子朴素低调,没有眉毛也很美!

52岁吴越全素颜亮相,戴奶奶灰帽子朴素低调,没有眉毛也很美!

南城无双
2025-01-03 23:04:41
你就医时遇到过什么尴尬的事嘛?网友:这辈子就没这么羞耻过。。

你就医时遇到过什么尴尬的事嘛?网友:这辈子就没这么羞耻过。。

美好客栈大掌柜
2024-12-25 00:15:03
德布劳内续约?瓜帅:不关我事,就年龄和表现来看俱乐部得考虑下

德布劳内续约?瓜帅:不关我事,就年龄和表现来看俱乐部得考虑下

直播吧
2025-01-03 20:56:23
舍甫琴科:自俄乌战争爆发以来,已有超200名足球界人士丧生

舍甫琴科:自俄乌战争爆发以来,已有超200名足球界人士丧生

直播吧
2025-01-03 16:00:10
周海琦,甘于被“围猎”

周海琦,甘于被“围猎”

中国基金报
2025-01-04 00:07:20
福建省委研究决定,陈立红、俞开建、胡志彪、林朝旭履新

福建省委研究决定,陈立红、俞开建、胡志彪、林朝旭履新

鲁中晨报
2025-01-04 09:14:05
杜金的天才建议就是甩掉尾巴吐出西伯利亚,全力打赢北约!

杜金的天才建议就是甩掉尾巴吐出西伯利亚,全力打赢北约!

星辰故事屋
2025-01-02 17:39:11
大事件!山东突然要省属事业单位全面向企业改制,释放什么信号?

大事件!山东突然要省属事业单位全面向企业改制,释放什么信号?

笑熬浆糊111
2025-01-04 09:09:39
不准别人思考,是种什么大病?

不准别人思考,是种什么大病?

亮见
2025-01-03 13:43:19
刘欢弟弟上节目被问为何不当歌手,刘欢直呼:他背着我干过不少事

刘欢弟弟上节目被问为何不当歌手,刘欢直呼:他背着我干过不少事

简读视觉
2025-01-03 23:10:03
永镇南海!央视不装了,罕见曝光三亚军港,光055就停着4艘

永镇南海!央视不装了,罕见曝光三亚军港,光055就停着4艘

青辉
2025-01-03 20:50:08
唐一军出镜忏悔:看看我的所作所为,我真是无颜面对、无地自容!

唐一军出镜忏悔:看看我的所作所为,我真是无颜面对、无地自容!

新京报政事儿
2025-01-04 09:40:45
乌克兰发布新传单:投降朝鲜士兵可获韩国欢迎!

乌克兰发布新传单:投降朝鲜士兵可获韩国欢迎!

涛哥锐评
2025-01-03 14:12:52
2025-01-04 12:20:49
deephub incentive-icons
deephub
CV NLP和数据挖掘知识
1539文章数 1419关注度
往期回顾 全部

科技要闻

华为车BU业务装入引望 上汽有望入伙

头条要闻

年轻人开始选择南北"换房"过年:春节可以省下近万元

头条要闻

年轻人开始选择南北"换房"过年:春节可以省下近万元

体育要闻

库明加一数据成倍增长 追梦:他定会成超巨

娱乐要闻

张颂文风波后露面,多位业内导演力挺

财经要闻

左江退市前疯涨 寒武纪更猛却尚无退市征兆

汽车要闻

10万元级无图智驾 悦也PLUS全路况实测

态度原创

教育
亲子
旅游
公开课
军事航空

教育要闻

养出一个小心翼翼的孩子,是父母最大的失败

亲子要闻

只要你够懒,那你就会生一个足够勤快的孩子~网友:这届家长真难带啊

旅游要闻

“五小时飞行圈”,中外游客双向奔赴

公开课

李玫瑾:为什么性格比能力更重要?

军事要闻

泽连斯基称“尚未决定是否竞选连任”

无障碍浏览 进入关怀版