程序如何在两个gpu卡上并行运行_单机多卡并行训练的程序编写

本文探讨了在单机多GPU环境下,通过数据并行策略进行神经网络训练的方法。采用1+N线程模式,主线程负责调度,副线程对应GPU执行计算。重点强调了cuda设备管理、跨GPU数据复制以及cublas和cudnn的正确使用。代码示例展示了副线程和主线程如何协同工作以实现权重同步。
摘要由CSDN通过智能技术生成

762c788a8ec17edc0c7b8457082bf9e2.png

本文采用的方法为作者独自设计,未参考其他框架的思路。如有雷同纯属巧合。

注意事项

神经网络的多卡并行训练通常有两个思路,一是数据并行,二是网络并行。数据并行即多张显卡上使用的是同一个网络和权重,将训练集拆分为两个部分,各自计算之后,将权重变化取平均值并同时更新。网络并行即考虑网络本身规模很大,因此需要将网络分成多个部分存在多张显卡上。因为这个并行设计与网络结构相关,需要针对具体问题,通用性不高,本文只分析数据并行的情况。

本文也不讨论多机并行,因为多机并行通常延迟较高,提速效果有限。

线程的分配来说,按Nvidia的推荐,一个线程控制一个显卡比较适合。因此线程设计采取1+N的模式,即主线程+N个副线程,其中N为显卡的个数。主线程负责调度和处理数据集,每个副线程对应一个显卡,控制GPU的运行。

多显卡的程序在调试过程中相对比较困难,因为一旦跨显卡调用错误,可能导致整个系统卡死,后续的调试异常困难。因此,有几个cuda设备相关的函数在这里非常关键,例如:cudaSetDevice,cudaMemcpyPeer等。它们用于设置本线程使用的显卡和跨显卡复制数据,使用时必须非常谨慎!

Nvidia旧版的驱动还存在一个诡异的问题。驱动附带的nvml可以得到显卡的更多信息,但

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值