深度学习 GPU与模型迁移 笔记
本文最后更新于:2023年6月17日 下午
多GPU计算
方式
网络分区
- 在多个GPU之间拆分网络。每个GPU将流入特定层的数据作为输入,跨多个后续层对数据进行处理,然后将数据发送到下一个GPU。
- GPU的接口之间需要的密集同步可能是很难办的,还有层之间的接口需要大量的数据传输的时候数据量可能会超出GPU总线的带宽。
按层分区
- 拆分层内的工作。
- 我们需要大量的同步或屏障操作(barrier operation),因为每一层都依赖于所有其他层的结果。
数据并行
- 每块GPU上的参数值都是相同且同步的
- 每个GPU独立地维护一组完整的模型参数
- 计算过程
- 在任何一次训练迭代中,给定的随机的小批量样本都将被分成
k个部分,并均匀地分配到GPU上; - 每个GPU根据分配给它的小批量子集,计算模型参数的损失和梯度;
- 将
k个GPU中的局部梯度聚合,以获得当前小批量的随机梯度; - 聚合梯度被重新分发到每个GPU中;
- 每个GPU使用这个小批量随机梯度,来更新它所维护的完整的模型参数集。
- 在任何一次训练迭代中,给定的随机的小批量样本都将被分成
数据并行例子
手动实现
1 | |
定义模型
1 | |
数据同步
1 | |
1 | |
数据分发
在训练前,把数据均匀的分发到每块显卡。这里用了torch.nn封装好的函数。
1 | |
1 | |
训练
1 | |
1 | |
1 | |
简洁实现
1 | |
定义模型
1 | |
1 | |
训练
1 | |
1 | |
模型迁移
网络架构
- 一个神经网络一般可以分为两个部分
- 特征提取模块,将原始像素变为容易线性分割的特征
- 分类模块,线性分类器进行分类
微调
在一个比较大的数据集上训练的模型,可以把它的特征提取模块拿出来重新用一用。
训练
- 目标数据集上正常的训练任务,使用更强的正则化
- 使用更小的学习率
- 使用更少的数据迭代
- 源数据集远复杂于目标数据集,微调效果更好
重用分类器权重
最后一层分类层满足条件也可以进行迁移学习
- 源数据集可能也有目标数据中的部分标号
- 可以使用预训练好模型分类器中对应标号对应的向量来做初始化
固定一些层
是一种更强的正则
- 神经网络通常学习有层次的特征表示
- 低层次的特征更加通用
- 高层次的特征则更与数据集有关
- 可以固定底部的一些层的参数,不参与更新
代码
1 | |
数据加载
1 | |
数据预处理
1 | |
拿模型、改模型
输出层随机初始化,从头开始训练
1 | |
定义训练函数
1 | |
1 | |
总结
- 微调通过使用在大数据上得到的预训练好的模型来初始化新模型的权重来完成精度提升
- 预训练模型质量很重要
- 微调通常速度更快,精度更高
深度学习 GPU与模型迁移 笔记
https://anonymouslosty.ink/2023/06/15/深度学习 GPU与模型调度笔记/