当前位置: 首页 > news >正文

Tranformer分布式特辑

随着大模型的发展,如何进行分布式训练也成了每位开发者必备的技能。

1. 单机训练

  • CPU Offloading
  • Gradient Checkpointing
    • 正向传播时,不存储当前节点的中间结果,在反向传播时重新计算,从而起到降低显存占用的作用
  • Low Precision Data Types
  • Memory Efficient Optimizers

2. 分布式

数据并行(DP)和模型并行(MP)

分布式通信基础:

  • Broadcast: 把一个节点自身的数据广播到其他节点上
  • Scatter:数据进行切片再分发给集群内所有的节点
  • Gather: 把多个节点的数据收集到一个节点上
  • AllGather:多个节点的数据收集到一个主节点上(Gather),再把收集到的数据分发到其他节点上(broadcast)
  • Reduce:把多个节点的数据规约运算到一个主节点上
  • ReduceScatter:所有节点上都按维度执行相同的Reduce规约运算,再将结果发散到集群所有节点上
  • AllReduce: 多个节点的数据规约运算(Reducer),再把结果分发到其他节点上(broadcast)
    在这里插入图片描述

类型基础:
在这里插入图片描述

在这里插入图片描述

3. FullyShardedDataParallel (FSDP)

  • https://huggingface.co/docs/transformers/main/en/fsdp

4. ZeRO

zero的一些分布式设置

5. Deepspeed

在这里插入图片描述

a. Stage 1 : Shards optimizer states across data parallel workers/GPUs. 优化器状态切分 (ZeRO stage 1)

b. Stage 2 : Shards optimizer states + gradients across data parallel workers/GPUs. +梯度切分 (ZeRO stage 2)

c. Stage 3: Shards optimizer states + gradients + model parameters across data parallel workers/GPUs. + 参数切分 (ZeRO stage 3)

d. Optimizer Offload: Offloads the gradients + optimizer states to CPU/Disk building on top of ZERO Stage 2

e. Param Offload: Offloads the model parameters to CPU/Disk building on top of ZERO Stage 3
请添加图片描述
其中多数情况下,
速度对比:ZeRO-0> ZeRO-1> ZeRO-2> ZeRO-2+offload> ZeRO-3> ZeRO-3+offloads
显存对比:ZeRO-0 <ZeRO-1< ZeRO-2< ZeRO-2+offload< ZeRO-3< ZeRO-3+offloads

因此,选择时,从FSDP开始,如果显存不足,则依次尝试ZeRO-2,ZeRO-2+offload,ZeRO-3,ZeRO-3+offload_optimizer, ZeRO-3+offload_optimizer+offload_param. 其中offload_optimizer: 是为减少GPU显存,将优化器状态加载到CPU。ZeRO-2仅用于训练,推理时不需要优化器和梯度。ZeRO-3也可用于推断,模型分布加载到多个GPU。

  • ZeRO-0:禁用所有分片,此时将DeepSpeed视为DDP使用 (stage默认值:0)
"zero_optimization": {"stage": 0}
  • ZeRO-1:ZeRO第一阶段的优化,将优化器状态进行切分。
"zero_optimization": {"stage": 1}
  • ZeRO2
"zero_optimization": {"stage": 2,"allgather_partitions": true,"allgather_bucket_size": 3e8,"overlap_comm": true,"reduce_scatter": true,"reduce_bucket_size": 3e8,"contiguous_gradients": true}
  • ZeRO3
"zero_optimization": {"stage": 3,"offload_optimizer": {"device": "cpu","pin_memory": true},"offload_param": {"device": "cpu","pin_memory": true},"overlap_comm": true,"contiguous_gradients": true,"sub_group_size": 1e9,"reduce_bucket_size": 1e6,"stage3_prefetch_bucket_size": 4e6,"stage3_param_persistence_threshold": 1e4,"stage3_max_live_parameters": 1e9,"stage3_max_reuse_distance": 1e9,"stage3_gather_16bit_weights_on_model_save": true},

6. Megatron

  • https://huggingface.co/docs/transformers/main/en/perf_train_gpu_many
  • 下图来自bloom
    请添加图片描述

7. Megatron-deepspeed

  • https://github.com/bigscience-workshop/Megatron-DeepSpeed

Reference

  • https://pytorch.org/docs/stable/distributed.html
  • accelerate
  • https://www.deepspeed.ai/getting-started/
  • https://wandb.ai/byyoung3/ml-news/reports/A-Guide-to-DeepSpeed-Zero-With-the-HuggingFace-Trainer–Vmlldzo2ODkwMDc4
  • https://github.com/huggingface/blog/blob/main/accelerate-deepspeed.md
  • DeepSpeed之ZeRO系列:将显存优化进行到底 - basicv8vc的文章 - 知乎
  • 从啥也不会到DeepSpeed————一篇大模型分布式训练的学习过程总结 - elihe的文章 - 知乎
  • DDP系列第二篇:实现原理与源代码解析 - 996黄金一代的文章 - 知乎
  • 关于Deepspeed的一些总结与心得 - 白板笔的文章 - 知乎
  • deepspeed入门教程 - JOYWIN的文章 - 知乎
  • deepspeed多机多卡训练踏过的坑 - 100110的文章 - 知乎
  • https://www.zhangzhenhu.com/deepspeed/index.html
  • https://github.com/hpcaitech/ColossalAI
  • 模型并行训练:为什么要用Megatron,DeepSpeed不够用吗? - 流逝的文章 - 知乎
  • 如何判断候选人有没有千卡GPU集群的训练经验? - 你的真实姓名的回答 - 知乎
  • https://www.determined.ai/blog/tp
  • https://imbue.com/research/70b-infrastructure/

相关文章:

  • 北京网站建设多少钱?
  • 辽宁网页制作哪家好_网站建设
  • 高端品牌网站建设_汉中网站制作
  • 【C++】Stack
  • 【ShuQiHere】探索人工智能核心:机器学习的奥秘
  • 计算机毕业设计 智能推荐旅游平台 Java+SpringBoot+Vue 前后端分离 文档报告 代码讲解 安装调试
  • Spring Boot之DevTools介绍
  • 网络安全 DVWA通关指南 DVWA Reflected Cross Site Scripting (反射型 XSS)
  • C#使用TCP-S7协议读写西门子PLC(三)
  • 2024 年 8 月区块链游戏研报:用户增长与加密货币市场波动并存
  • 队列-数据结构
  • django学习入门系列之第十点《A 案例: 员工管理系统5》
  • 嵌入式音视频开发:探索多领域的融合与创新
  • 跟李沐学AI:长短期记忆网络LSTM
  • 个人用户如何有效利用固态硬盘数据恢复工具
  • 开源Devops工具-Ansible
  • 【Python】05.Python 中的列表与元组
  • Oracle(120)如何创建和管理备份策略?
  • 《用数据讲故事》作者Cole N. Knaflic:消除一切无效的图表
  • 【391天】每日项目总结系列128(2018.03.03)
  • 【挥舞JS】JS实现继承,封装一个extends方法
  • android图片蒙层
  • CSS实用技巧干货
  • electron原来这么简单----打包你的react、VUE桌面应用程序
  • HTML-表单
  • IDEA常用插件整理
  • Linux链接文件
  • PHP那些事儿
  • 阿里云容器服务区块链解决方案全新升级 支持Hyperledger Fabric v1.1
  • 从零开始的无人驾驶 1
  • 理解IaaS, PaaS, SaaS等云模型 (Cloud Models)
  • 前端技术周刊 2019-01-14:客户端存储
  • 入口文件开始,分析Vue源码实现
  • 腾讯大梁:DevOps最后一棒,有效构建海量运营的持续反馈能力
  • 用jquery写贪吃蛇
  • ​LeetCode解法汇总2304. 网格中的最小路径代价
  • !!Dom4j 学习笔记
  • ###51单片机学习(1)-----单片机烧录软件的使用,以及如何建立一个工程项目
  • #鸿蒙生态创新中心#揭幕仪式在深圳湾科技生态园举行
  • #预处理和函数的对比以及条件编译
  • (C++二叉树05) 合并二叉树 二叉搜索树中的搜索 验证二叉搜索树
  • (HAL库版)freeRTOS移植STMF103
  • (Redis使用系列) SpirngBoot中关于Redis的值的各种方式的存储与取出 三
  • (板子)A* astar算法,AcWing第k短路+八数码 带注释
  • (二)c52学习之旅-简单了解单片机
  • (附源码)ssm基于jsp高校选课系统 毕业设计 291627
  • (四)TensorRT | 基于 GPU 端的 Python 推理
  • (详细版)Vary: Scaling up the Vision Vocabulary for Large Vision-Language Models
  • (自适应手机端)响应式服装服饰外贸企业网站模板
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .Net Redis的秒杀Dome和异步执行
  • .NET 中什么样的类是可使用 await 异步等待的?
  • .NET的数据绑定
  • .net开发引用程序集提示没有强名称的解决办法
  • .net图片验证码生成、点击刷新及验证输入是否正确
  • /proc/stat文件详解(翻译)
  • ?php echo $logosrc[0];?,如何在一行中显示logo和标题?
  • @基于大模型的旅游路线推荐方案