深度模型gpu运行机制

  • 单机多卡:只需运行一份代码,由该代码分配该台机器上GPU资源的使用
  • 多机多卡:每台机器上都需要运行一份代码,机器之间需要互相通信传递梯度,并且模型参数的更新也存在同步训练模式和异步训练模式的区别

一、单机多gpu运行原理

1.1 单机多卡并行机制:

首先是将模型加载到主GPU,然后将模型复制到其他指定的GPU,接着把输入数据按batch维度划分给各个GPU去计算(batch_size_per_gpu=total_batch_size / num_gpu),各个GPU上的模型和数据独立进行前向推理计算,得到结果(loss)后汇总到主gpu上反向传播更新模型权重,再将主GPU模型更新复制到其他GPU上。

1.2 具体实现
# torch.cuda.set_device(origin_device) # 设置.cuda()时默认使用的gpu_id
os.environ["CUDA_VISIBLE_DEVICS"] = "0,1,2,..."
# ...
# set model parallel
model = torch.nn.DataParallel(model).cuda()
# dataset...
dataloader = torch.utils.data.DataLoader(dataset, batch_size=bs_per_gpu * num_gpu, **kwargs)
# 后面的基本不用任何改动

二、多机多gpu集群运行原理-分布式计算

DistributedDataParallel

待补充

三、GPU使用注意事项

3.1 事项1

当batch_size设置较大时,单个GPU的显存容易占满耗尽,导致Memeror。而较小的batch_size导致需要每个epoch需要迭代训练更多次,造成效率低下。因此可以考虑采用多个GPU并行计算的方式训练模型(但一般batch_size也不宜过大,训练的时候随机性很重要,极端的情况是batch_size=whole_dataset,训练效果可能不容易收敛且、模型不鲁棒)。一般有两种方法,一是多个GPU并行计算(DataParallel),比较简单,常规易用(但是因为loss等操作是将各副卡的推理结果汇总之后在主卡计算的,因此容易出现主GPU利用率比其他副GPU更高的情况,也就是负载不平衡现象),这种方式也稍微慢些(比分布式计算,多级多卡,或者单机多卡也可以用);二是多台机器分布式计算(DistributedDataParallel),速度相对前者更快,也不会出现负载不均衡现象,但是比前者配置起来要麻烦很多。

3.2 事项2

这一节,将详细探讨一下多GPU的机器该如何利用。

对于多GPU训练,一般我们需要用数据并行的模式比较多,通过增大 Batch Size 并辅以较高的 Learning Rate 可以加快模型的收敛速度。

由于我们模型是通过若干步梯度反向传播来迭代收敛模型的参数,而每一步的梯度由一个Batch内样本数据的损失情况(Loss)得到,因此当 Batch Size 比较大时, 可以减少 Batch样本的分布和整体样本的分布偏差太大的风险,进而使得每一步的梯度更新方向更加准确。

比如,单卡训练 InceptionResNet 网络最大Batch Size为100, 学习率为0.001。采用4张卡去训练时,可以设置Batch Size为400, 学习率为 0.002。在代码中对每一个Batch 400 切分成 4*100,然后给到不同GPU卡上的模型上去训练。

感谢以下博主:参考博文
https://blog.csdn.net/weixin_42596214/article/details/112616473

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值