多进程可以加速任务的进行。不牵扯cuda的多进程可以使用Process
或者Pool
使用,具体的网上很多了就不再一一介绍。
现在遇到一个需求,当我训练好一个神经网络,需要将推理的结果保存在本地,那么一个一个有点浪费时间,如果推理一个batch,然后对这一个batch使用多线程同时保存到本地,那岂不是快的飞起!!说干就干,我加载进程池,运行函数,还没怎么高兴,不出意外的出现了意外
RuntimeError: Cannot re-initialize CUDA in forked subprocess.
To use CUDA with multiprocessing, you must use the 'spawn' start method
根据提示修改我们的代码,把python的进程池换成pytorch的进程池:
torch_ctx = torch.multiprocessing.get_context("spawn")
pool = torch_ctx .Pool(processes=os.cpu_count()//2)
接着就正常使用pool的api,map()
,apply()
,apply_async()
。但是processes不易设置过大,根据自己性能进行设置。
以下是多进程保存推理结果的模板:
# 处理函数
def main(args):
# save result
......
torch_ctx = torch.multiprocessing.get_context("spawn")
pool = torch_ctx .Pool(processes=os.cpu_count()//2)
model = Network()
pred = model(inputs)
# 对一个batch使用进程池保存
for i in pred.size(0):
pool.apply_async(main, (pred[i],))