利用模型异步线程并行等方式优化多模型推理速度(方法整理)

目录训练时优化:DataParallel多进程 multiprocessing 或flask1. multiprocessing2. flasktf的案例pytorch例子多线程:set_num_threads和Ensemble1.多线程并行2. 两个不同的模型异步部署时优化附录训练时优化:DataParallel拥有多卡环境,利用DataParallel优化。优点:将相同的模型复制到所有GPU,其中每个GPU消耗输入数据的不同分区,可以极大地加快训练过程。缺点:不适用于某些模型太大而无法容纳单个
摘要由CSDN通过智能技术生成

训练时优化:DataParallel

拥有多卡环境,利用DataParallel优化。

优点:将相同的模型复制到所有GPU,其中每个GPU消耗输入数据的不同分区,可以极大地加快训练过程。
缺点:不适用于某些模型太大而无法容纳单个GPU的用例。

定义:CLASS torch.nn.DataParallel(module, device_ids=None, output_device=None, dim=0)
module:输入的模块,可以绑定网络模型,也可以绑定优化器。
output_device:设备id
output_device:输出所在设备id(默认为device 0)

device_ids = [0, 1]
net = torch.nn.DataParallel(net, device_ids=device_ids)

此时device id 0默认为你的gpu 0.
可通过设置:

os.environ["CUDA_DEVICE_ORDER"] = "PCI_BUS_ID"
os.environ["CUDA_VISIBLE_DEVICES"] = "2, 3"

这样device id 0就默认为gpu 2了,可以避免第一张卡占用过高等问题。

优化器转换成DataParallel

optimizer = torch.optim.SGD(net.parameters(), lr=lr)
optimizer = torch.nn.DataParallel(optimizer, device_ids=device_ids)

注意事项 :
因为使用了 nn.DataParallel,所以网络模型net和优化器optimizer 都变成了一个nn.module。当你需要保存的时候,要调用一次.module方法:
保存模型变更:

torch.save(net.state_dict(), path) 
torch.save(net.module.state_dict(), path)

加载模型变更为:

net=nn.DataParallel(Resnet18())
net.load_state_dict(torch.load(path))
net=net.module

优化器使用:

optimizer.step()  # 原版
optimizer.module.step() #DataParallel

多进程 multiprocessing 或flask

1. multiprocessing

import multiprocessing
multiprocessing.set_start_method('spawn')

记得使用spawn防止卡死。
参考python3多进程方式,可以用多个进程实现模型并行加载。例如我要对一系列图片作出处理时,可以用这个方法加速。
python的多线程和多进程使用方法类似,都是先定义任务,在将任务排到线程或者进程中,等待结果。

import multiprocessing as mp
import threading as td

def job(a,d):
    print('任务')

t1 = td.Thread(target=job,args=(1,2))
p1 = mp.Process(target=job,args=(1,2))
t1.start()
  • 1
    点赞
  • 9
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 3
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

canmoumou

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值