添加链接
link管理
链接快照平台
  • 输入网页链接,自动生成快照
  • 标签化管理网页链接
  • 使用卷积神经网络进行图像分类
  • CIFAR-100数据集上基于Vision Transformer 实现图片分类
  • GAMMA比赛多模态眼底图像数据集下基于EfficientNet和ResNet构造fundus_img和oct_img的分类模型
  • MosMedData: 新冠肺炎胸部 CT扫描数据集上基于3D-CNN实现二分类
  • 基于图片相似度的图片搜索
  • 基于U-Net卷积神经网络实现宠物图像分割
  • 通过OCR实现验证码识别
  • 通过Sub-Pixel实现图像超分辨率
  • 人脸关键点检测
  • 点云处理:实现PointNet点云分类
  • 点云处理:实现PointNet点云分割
  • 自然语言处理
  • 用N-Gram模型在莎士比亚文集中训练word embedding
  • IMDB 数据集使用BOW网络的文本分类
  • 使用预训练的词向量完成文本分类任务
  • 使用注意力机制的LSTM的机器翻译
  • 基于Transformer实现英语到西班牙语的翻译任务
  • 使用序列到序列模型完成数字加法
  • 使用协同过滤实现电影推荐
  • 强化学习——Actor Critic Method
  • 强化学习——Advantage Actor-Critic(A2C)
  • 强化学习——Deep Deterministic Policy Gradient (DDPG)
  • 强化学习——DQN玩合成大西瓜
  • 用飞桨框架2.0造一个会下五子棋的AI模型
  • 通过AutoEncoder实现时序数据异常检测
  • Jena Climate时间序列数据集上使用LSTM进行温度的预报
  • 证券数据集下使用LSTM模型预测A股走势
  • 使用动转静完成以图搜图
  • 生成式对抗网络
  • 图像风格迁移模型-CycleGAN
  • 通过DCGAN实现人脸图像生成
  • MNIST数据集下用Paddle框架的动态图模式玩耍经典对抗生成网络(GAN)
  • 城市街景分割数据集下使用对抗网络Pix2Pix根据掩码生成街景
  • API 文档
  • 代码贡献流程
  • 新增 API 开发&提交流程
  • 贡献前阅读
  • 开发 API Python 端
  • 开发 C++ 算子
  • API 设计和命名规范
  • API 文档书写规范
  • API 单测开发及验收规范
  • 算子性能优化 提交流程
  • 算子性能优化 方法介绍
  • 算子性能优化 验收规范
  • Kernel Primitive API
  • API 介绍
  • API 介绍 - IO
  • API 介绍 - Compute
  • API 介绍 - OpFunc
  • API 示例
  • 示例 - ElementwiseAdd
  • 示例 - Reduce
  • 示例 - Model
  • 算子数据类型扩展 提交流程
  • 算子数据类型扩展 验收规范
  • 低精度算子开发贡献指南
  • 低精度算子支持开发规范
  • 低精度算子单测开发规范
  • 曙光开发指南
  • 曙光智算平台-Paddle 源码编译和单测执行
  • Paddle 适配 C86 加速卡详解
  • Paddle 框架下 ROCm(HIP)算子单测修复指导
  • 硬件接入飞桨后端指南
  • 硬件接入飞桨后端方案介绍
  • 训练硬件 Custom Device 接入方案介绍
  • 自定义 Runtime
  • Device 接口
  • Memory 接口
  • Stream 接口
  • Event 接口
  • 集合通讯接口
  • Profiler 接口
  • 自定义 Kernel
  • Kernel 函数声明
  • Kernel 实现接口
  • Context API
  • Tensor API
  • Exception API
  • Kernel 注册接口
  • 新硬件接入示例
  • 文档贡献指南
  • 规范和参考信息
  • 报错信息文案书写规范
  • 代码风格检查指南
  • Paddle CI 测试详解
  • Python 文档示例代码书写规范
  • Paddle 中的类型提示与 Q&A
  • 常见问题与解答
  • 2.0 升级常见问题
  • 安装常见问题
  • 数据及其加载常见问题
  • 组网、训练、评估常见问题
  • 模型保存常见问题
  • 参数调整常见问题
  • 分布式训练常见问题
  • 其他常见问题
  • 3.0 Beta Release Note
  • 一、简介

    为了提升模型的性能,人们开始追求:更大规模的数据集、更深的网络层、更庞大的参数规模。但是随之而来的就是给模型训练带来了巨大的压力,因此分布式技术及定制化 AI 芯片应运而生。但在分布式训练中,经常会遇到显存或者内存不足的情况,通常是以下几点原因导致的:

  • 输入的数据过大,例如视频类训练数据。

  • 深度模型的参数过多或过大,所需的存储空间超出了内存/显存的大小。

  • AI 芯片的内存有限。

  • 为了能正常完成训练,我们通常只能使用较小的 batch size 以降低模型训练中的所需要的存储空间,这将导致很多模型无法通过提高训练时的 batch size 来提高模型的精度。

    Gradient Merge (GM) 策略的主要思想是将连续多个 batch 数据训练得到的参数梯度合并做一次更新。 在该训练策略下,虽然从形式上看依然是小 batch 规模的数据在训练,但是效果上可以达到多个小 batch 数据合并成大 batch 后训练的效果。

    二、原理介绍

    Gradient Merge 只是在训练流程上做了一些微调,达到模拟出大 batch size 训练效果的目的。具体来说,就是使用若干原有大小的 batch 数据进行训练,即通过“前向+反向” 网络计算得到梯度。其间会有一部分显存/内存用于存放梯度,然后对每个 batch 计算出的梯度进行叠加,当累加的次数达到某个预设值后,使用累加的梯度对模型进行参数更新,从而达到使用大 batch 数据训练的效果。

    在较大的粒度上看, GM 是将训练一个 step 的过程由原来的 “前向 + 反向 + 更新” 改变成 “(前向 + 反向 + 梯度累加)x k + 更新”, 通过在最终更新前进行 k 次梯度的累加模拟出 batch size 扩大 k 倍的效果。 更具体细节可以参考 《MG-WFBP: Efficient Data Communication for Distributed Synchronous SGD Algorithms》

    三、动态图使用方法

    需要说明的是,动态图是天然支持 Gradient Merge。即,只要不调用 clear_gradient 方法,动态图的梯度会一直累积。 动态图下使用 Gradient Merge 的代码片段如下:

    for batch_id, data in enumerate(train_loader()):
        ... ...
        avg_loss.backward()
        if batch_id % k == 0:
            optimizer.minimize(avg_loss)
            model.clear_gradients()