深度神经网络硬件 GPU单机多卡并行 动手学深度学习v2

本文探讨了单机多卡并行训练中的GPU散热问题,分享了LeNet实现和分布式训练的挑战,如数据读取效率、batch_size调整和学习率策略。还介绍了简洁PyTorch实现和参数调优技巧,以及Q&A部分关于Keras独立于TensorFlow的影响和batchnorm的作用。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

1. 单机多卡并行

GPU 安装靠得太紧,容易烧掉。下面这张图,用了一个月就烧掉了一块GPU。
在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述

2. 多GPU训练 training 从零开始实现

在这里插入图片描述
LeNet实现
在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
w是完整的,X,y都是一小块
在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
分布式不变快,的原因

  1. data读取不变快
  2. batch_size 没有根据GPU的核数增加,一般会根据GPU的个数,乘以每个GPU可以处理的batch_size.
    在这里插入图片描述
    在这里插入图片描述
    learning rate 也需要增大,一般是1.5倍

在这里插入图片描述

3. 简洁实现 pytorch

在这里插入图片描述

在这里插入图片描述

在这里插入图片描述
在这里插入图片描述
在这里插入图片描述
尝试调参
batch_size, lr 都调大,性能提升80%。
在这里插入图片描述

4. Q&A

    1. 最近keras从TensorFlow分离,书籍会不会需要重新整理。大概率是变化不大。
    1. batch norm 是一种正则,但是精度不能提升。为什么? 沐神也不知道。。。
    1. all_reduce 先集合所有GPU的数据到一个GPU中,然后计算求和(举例子),再把结果分发回其它GPU。 all_gather?
    1. learning rate 太大会导致训练不收敛,也会导致准确率震荡比较大。

参考

https://www.bilibili.com/video/BV1vU4y1V7rd/?spm_id_from=trigger_reload

### 如何优化深度学习模型以提高检测速度 #### Backbone网络的选择 选择合适的Backbone对于提升目标检测的速度至关重要。较轻量级的Backbone可以在保持一定精度的同时显著降低推理时间。例如MobileNet系列和EfficientNet-Lite等架构专为移动设备设计,在保证性能的前提下极大地减少了参数数量和计算复杂度[^2]。 #### 特征金字塔网络的设计 有效的特征提取机制能够增强模型对不同尺度物体的理解能力而不增加过额外开销。采用自顶向下的路径聚合层特征图谱有助于捕捉更丰富的上下文信息,同时通过横向连接融合高低分辨率特征来改善边界定位准确性并加速收敛过程。 #### 渠道注意机制 引入渠道级别的注意力模块可以使网络专注于最具判别力的部分,忽略冗余激活区域,进而简化后续处理逻辑达到提速效果。SENet(Squeeze-and-Excitation Networks)就是一种典型代表,它通过对各个channel的重要性打分来进行加权调整,使得重要特征得到强化而次要部分被抑制。 #### 混合精度训练 利用半精度浮点数(FP16)代替标准单精度FP32执行大部分运算操作可有效节省内存带宽消耗以及缩短前向传播所需耗时;然而为了维持数值稳定性某些关键环节仍需保留全精度表示形式。这种策略既不影响最终输出质量又能带来明显的效率增益。 #### 批量大小与梯度累积 适当增大batch size有利于充分利用GPU硬件资源实现数据并行化计算,但过大的批次可能导致显存溢出问题。此时可以通过梯度累积的方式模拟大批次的效果——即在一个完整的更新周期内累加个小批次产生的梯度后再同步权重变化,这样既能缓解存储压力又不会牺牲太迭代次数上的优势[^3]。 #### 分布式训练 当单一节点无法满足大规模数据集快速训练的需求时,借助集群环境开展跨机协作成为必然之选。PyTorch Lightning、Horovod等框架提供了便捷接口支持甚至服务器间的高效通信协调工作,让开发者轻松构建起强大的分布式训练系统,大幅缩减整体耗时时长。 ```python import torch.nn as nn from torchvision import models class OptimizedDetector(nn.Module): def __init__(self): super(OptimizedDetector, self).__init__() # 使用预训练的轻量化backbone作为基础特征抽取器 backbone = models.mobilenet_v2(pretrained=True).features # 构建特征金字塔结构用于层次特征融合 fpn_layers = [] for i in range(4): # 假设有四个阶段的feature maps conv_layer = nn.Conv2d(in_channels=..., out_channels=...) relu_activation = nn.ReLU(inplace=True) fpn_layers.append((conv_layer, relu_activation)) self.backbone = backbone self.fpn = nn.Sequential(*fpn_layers) def forward(self, x): features = self.backbone(x) enhanced_features = self.fpn(features) return enhanced_features ```
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值