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

4.1框架应用

一、DeepSpeed

掌握 ZeRO1、ZeRO2、ZeRO3 优化策略。了解 offload、infinity 策略

DeepSpeed

DeepSpeed 是微软开发的一款专为大型模型训练优化的深度学习框架,它通过一系列创新技术显著降低了训练内存需求并提高了训练效率。DeepSpeed 的核心优势在于其能够支持训练超过单 GPU 内存容量的超大规模模型,例如 GPT - 3 级别的千亿参数模型。它集成了多种优化策略,包括 ZeRO 系列和 Offload 技术,被广泛应用于学术研究和工业界的大模型训练中。
DeepSpeed 是由微软开发的一个开源训练加速库,专门用来训练超大规模模型。它支持:

  • 更大的模型(TB 级别)
  • 更快的训练速度
  • 更低的 GPU 显存占用
  • 支持混合精度、模型并行、梯度累积等技术

核心优势:就是能让你在相对有限的 GPU 上训练非常大的模型!

二、ZeRO(Zero Redundancy Optimizer)系列优化策略

通过实验发现,训练期间的大部分内存被 优化器参数、梯度、模型参数所消耗。
deepspeed ZeRO 的三个阶段只在通过分片技术逐步减少显存占用

ZeRO1 优化器切分

核心思想:把内存占用比例最高的优化器状态(如 Adam 优化器中的梯度一阶矩和二阶矩)分片存储到不同 GPU 上,每个 GPU 仅存储并更新自己分配的部分。优化器状态显存占用减少为原来的 1/N
适用场景
类似 adam 进行优化的模型训练,因为 adam 拥有额外的参数 m(momentum)和 v(variance,方差,也可能是动量),同时使用到了一阶动量和二阶动量
通信开销:仅需要在更新参数阶段同步各个分片的梯度,通信开销较低
优点
训练改动小,兼容性好。
缺点
模型参数和梯度仍需完整存储,显存节省有限。

ZeRO2 优化器状态 + 梯度分片

核心思想:相比于 ZeRO1,ZeRo2 除了对 optimizer state 使用进行切分,还对梯度进行切分。优化器状态和梯度显存都减少原来的 1/N
适用场景:中大型模型训练时非常推荐,效率和显存节省之间平衡好。
通信开销:需要在反向传播后聚合梯度分片,通信量增加,但仍在可控范围
优点
同时减少优化器状态和梯度的内存占用
缺点
模型参数仍需完整存储,对超大规模模型支持有限。
通信开销增加

ZeRO3 优化器状态 + 梯度 + 模型参数 分片

核心思想:相比于 ZeRO1 和 ZeRO2,进一步将模型参数分片存储,每个 GPU 仅保存部分参数,前向和反向传播时按需从其他 GPU 获取缺失的参数。优化器状态、梯度和模型参数显存都减少为原来的 1/N
适用场景:训练超大规模模型,或者 GPU 显存特别紧张的时候。
通信开销:通信量显著增加,需频繁同步参数。要通过异步通信计算(通信)重叠优化性能
优点:显存大幅节省
缺点:增加了通信开销

在使用 ZeRO3 时,若觉得通信开销过大,可尝试以下优化方法:

  1. 通信与计算重叠:启用通信与计算重叠技术,使通信和计算并行执行,减少通信对整体训练时间的占用。DeepSpeed 的 ZeRO 配置中可通过overlap_comm参数实现,从而节省训练时间。

  2. 高效通信后端和硬件互联:使用高效的通信后端(如 NCCL)并确保高带宽互联(如 NVLink、InfiniBand),以提升通信效率,降低通信延迟。

  3. 混合精度训练:通过混合精度训练(如 FP16/BF16)降低参数和梯度的内存占用,减少通信的数据量,从而降低通信开销。

  4. 梯度压缩:采用梯度压缩技术,减少通信时传输的数据量,如使用量化或稀疏化方法压缩梯度。

  5. 减少通信频率:在保证训练精度的前提下,适当增加梯度累积步数,减少通信的频率,从而降低通信开销。

  6. 使用 ZeRO-Offload:结合 ZeRO-Offload 技术,将部分数据卸载到 CPU 内存,减少 GPU 之间的通信量,降低通信开销。

  7. 优化模型并行策略:如果模型支持,可以结合模型并行策略,将模型的不同部分分配到不同的 GPU 上,减少每个 GPU 需要通信的数据量。

  8. 调整批大小和并行度:根据硬件资源,适当调整微批大小和并行度,以在显存占用和通信开销之间找到最佳平衡。

offload 显存不够,内存来补

核心思想:将优化器状态、梯度(或模型参数)从 GPU 内存卸载(offload)到 CPU 内存(或 NVMe 硬盘),以进一步释放 GPU 内存。它基于 ZeRO-2 优化,将原本需要在 GPU 上保存的优化器状态和梯度转移到 CPU 内存中,从而释放 GPU 显存,让 GPU 能专注于模型的前向传播和反向传播计算。
(Zero-offload 并不希望为了最小化显存占用而让系统的计算效率下降,否则直接用 CPU 和内存不就行了。但是将部分 GPU 计算和存储下放到 CPU 和内存,必然涉及 CPU 和 GPU 之间通信增加,不能让通信成为瓶颈,此外 GPU 的计算效率相比于 CPU 也是数量级上的优势,也不能让 CPU 参与过多计算,避免成为系统瓶颈,只有满足前面两条的前提下,再考虑最小化显存的占用)
步骤
(1)数据流图抽象:将训练过程抽象为数据流图,图中节点分为模型状态节点(需存储的模型参数、梯度、优化器状态等)和运算操作节点(前向传播、反向传播、参数更新等),边表示节点间传递的数据量。
(2)划分策略制定:依据保证 CPU 计算负担远小于 GPU、CPU 和 GPU 间通信量最小、GPU 内存节省最大的原则,制定划分策略。具体为 CPU 负责存储 FP32 的优化器状态和 FP16 的梯度,同时更新参数;GPU 负责存储 FP16 的梯度和参数,同时完成前向传播和反向传播。
(3)单张 GPU 调度:在单张 GPU 训练时,核心是将 GPU 到 CPU 的梯度 offload 和 GPU 上反向传播时的梯度计算重叠,以及将 CPU 到 GPU 的参数 swap 和 CPU 上的参数更新重叠。例如,在反向传播过程中,GPU 每算出一部分梯度,就通过 reduce-scatter 操作将其发送到负责的 rank 上,然后该 rank 将梯度 offload 到 CPU 内存中;CPU 在接收到梯度后,将其从 FP16 转换为 FP32,进行优化器状态和权重更新,再将权重从 FP32 转换为 FP16 传输回 GPU;GPU 在收到所有 rank 的权重后,进行 all-gather 操作,得到完整的权重用于下一轮计算。
(4)多张 GPU 调度:在多张 GPU 训练时,同样遵循上述策略,实现各 GPU 间的协同工作。
适用场景:显存不足但有大内存或大容量硬盘时
通信开销:
优点:大幅降低 GPU 内存压力,支持训练更大模型。
缺点:数据在 GPU 和 CPU 之间传输会引入延迟,可能降低训练速度。

infinity 虚拟显存

将 GPU 不活跃(不常用的)的内存块动态 offload 到 NVMe(SSD,固态硬盘)上,当需要使用这些数据时,再按需交换到 GPU,近似于“虚拟显存”。

通过预测模型的计算需求,提前将可能需要的数据加载到合适的存储层级(GPU 显存、CPU 内存或 NVMe 存储),以减少数据加载的延迟。同时,合理安排计算任务,避免因数据加载不及时而导致的计算资源闲置。

步骤
(1)模型分片:使用 ZeRO 优化器将模型参数、优化器状态和梯度进行分片,分布在多个 GPU 上。
(2)数据分层存储:根据数据的使用频率和重要性,将数据存储在不同的层级。频繁使用的数据存储在 GPU 显存中,不常用的数据存储在 CPU 内存中,而极少使用的数据则存储在 NVMe 存储中。
(3)数据动态迁移:在训练过程中,系统会实时监控 GPU 显存的使用情况。当显存不足时,自动将不常用的数据从 GPU 显存卸载到 CPU 内存或 NVMe 存储中。当需要使用这些数据时,再快速地将它们加载回 GPU 显存。
(4)计算调度优化:根据数据的加载情况,合理安排计算任务。例如,在数据加载到 GPU 显存的过程中,可以先执行其他不需要这些数据的计算任务,以提高计算资源的利用率。

优点
支持超大模型训练,几十亿甚至上百亿参数
缺点

  1. 数据加载延迟:虽然采用了智能的数据加载和计算调度机制,但数据在不同存储层级之间的迁移仍然会带来一定的延迟,可能会影响训练速度。
  2. IO 和调度复杂。需要良好异步 prefetch 策略

🧠 总结对比表格

特性ZeRO-OffloadDeepSpeed-Infinity
Offload 到哪里CPU 内存NVMe 硬盘
Offload 对象优化器状态、梯度模型参数、激活值
是否涉及优化器
显存节省中等极高
对 NVMe 要求
对 CPU 内存要求
训练速度中等慢(依赖调度)
适用模型规模亿级十亿至百亿级别
  1. 请解释 ZeRO-Offload 和 DeepSpeed-Infinity 的原理,它们的区别在哪里?
  2. ZeRO-Offload 和 ZeRO-3 的显存优化方式有何异同?
  3. 如果我只有一块 16GB 显存的 GPU,想训练 10 亿参数模型,推荐用哪个策略?为什么?
  4. 你觉得 Infinity 策略对训练速度有何影响?你会如何优化?
  5. Infinity 策略是否适合部署?为什么?
  6. 什么是 DeepSpeed?它如何帮助训练大模型?
    请对比 ZeRO-1、ZeRO-2 和 ZeRO-3 的优化策略和适用场景。
    你如何选择是否使用 offload 或 ZeRO-3?它们之间有什么取舍?
    Infinity 技术和 offload 策略的区别是什么?
    你觉得 ZeRO 和 Megatron-LM 的模型并行思路有什么不同?

二、Megatron-LM

掌握 Megatron-LM 模型并行策略,如张量并行、流水线并行等

Megatron-LM 是 NVIDIA 提出的用于 大规模预训练语言模型 的高效并行训练框架,它主要结合了 张量并行(Tensor Parallelism)、流水线并行(Pipeline Parallelism) 和(后续)数据并行(如与 ZeRO 结合) 的混合策略,来突破单机显存限制、加速训练效率。

Megatron-LM 是专为 百亿、千亿甚至万亿参数模型训练设计的并行训练框架,目标是将模型训练任务高效地划分到多个 GPU 上。

Tensor Parallelism(张量并行)

张量并行就是将 模型中某些大层(如线性层、注意力层)内的权重矩阵切分到多个 GPU 上进行并行计算。

  • 行并行:将权重矩阵按行拆分,每个 GPU 计算部分输出行。
  • 列并行:将权重矩阵按列拆分,每个 GPU 计算部分输出列,最后通过 all-reduce 聚合结果。
    (All-Reduce 或 All-Gather 操作合并结果。)
    步骤:
  1. 划分权重矩阵到多个 GPU(行切/列切)
  2. 在每个 GPU 上进行局部矩阵乘法
  3. 使用 torch.distributed 做 All-Reduce/All-Gather 聚合输出
  4. 保证和原始结果一样

优点

  1. 节省显存。每个 GPU 只存一部分参数
  2. 加速大层计算。各 GPU 并行处理

缺点
通信开销:All-Reduce 会影响效率

适用场景
单层参数量巨大的模型,如 GPT-3、OPT、LLaMA

Pipeline Parallelism(流水线并行)

流水线并行将 模型按层切分到多个 GPU,不同 GPU 负责不同层的前向/反向传播。
将模型按层顺序拆分为多个阶段(stages),每个 GPU 负责一个或多个连续层。数据按批次依次通过各阶段,形成流水线。

训练时不同 GPU 像工厂流水线一样:
GPU0 开始处理 batch1
GPU1 同时处理 batch0 的下一层

引入micro-batch(将一个大 batch 分成多个小 batch)解决数据依赖问题。

步骤:

  1. 层分配:将模型层分配到不同 GPU 上,形成流水线阶段。
  2. 微批次处理:将输入数据分割为多个微批次(micro-batches)。
  3. 流水线执行:每个阶段依次处理微批次,前一个阶段完成后立即将结果传递给下一个阶段。
  4. 反向传播同步:在所有微批次完成前向传播后,按相反顺序执行反向传播。
  5. 全部 micro-batch 完成一次迭代

优点

  1. 减少显存压力。每个 GPU 只存部分层
  2. 并行加速。多个 GPU 同时执行不同层

缺点

  1. Bubble 问题;前几步 GPU 不能满载(有空泡)(启动阶段存在流水线气泡(Pipeline Bubble),降低初始效率。)
  2. 延迟较高:微批次间依赖导致梯度同步延迟。

使用情况
模型层数多(如 BERT、T5)。

序列并行(Sequence Parallelism)

普通方式:
每张 GPU 接收完整的 [batch_size, seq_len] 输入(比如 [4, 4096]),然后前向 + 反向。
🔴 问题:序列太长,attention 的显存是 O(n²),直接炸显存。

输入序列长度维度分割,不同 GPU 处理序列的不同部分。特别适用于处理超长文本(如文档级输入)。
我们将序列维度划分,例如每张 GPU 处理一半:

  • GPU 0 处理前一半 [batch_size, 0:2048]
  • GPU 1 处理后一半 [batch_size, 2048:4096]

步骤

  1. 序列拆分:将输入序列按长度分割为多个块。
  2. 并行处理:各 GPU 独立处理自己负责的序列块。
  3. 跨块交互:在注意力机制中,通过特殊通信模式实现跨块信息交换。

优点
处理超长序列时内存效率高。
缺点
仅适用于可按序列维度拆分的操作。
跨块通信复杂。

适用场景
处理长文本的模型(如检索增强生成)。
输入序列长度远超模型上下文窗口。

3D 并行(3D Parallelism)

结合张量并行、流水线并行和数据并行,形成三维并行架构:

  • 张量并行:在层内矩阵拆分到多卡。
  • 流水线并行:按层顺序分配 GPU。
  • 数据并行:复制模型并处理不同数据批次。

数据并行 + ZeRO(辅助使用)

Megatron 后期支持 ZeRO stage 1/2/3:

  • 对优化器状态、梯度、模型参数进行切分存储
  • 将多机多卡训练的显存占用进一步优化
  • 与张量并行 + 流水线并行互补形成完整并行体系
  1. 请你介绍 Megatron-LM 中的张量并行和流水线并行的原理?

  2. 为什么大模型训练时不能只使用数据并行?如何扩展?

  3. 张量并行和数据并行可以同时使用吗?为什么?

  4. 流水线并行中 bubble 是什么?如何缓解?
    交错式调度(Interleaved Scheduling):
    将模型的层分配到设备时,采用交错的方式,使每个设备处理多个不连续的层块。
    例如,设备 1 处理层 1、2、9、10,设备 2 处理层 3、4、11、12,依此类推。
    这样可以减少每个阶段的计算时间,降低设备等待时间,从而减少 bubble。

    增加微批次数量(m):
    将批次(batch)拆分为更多的微批次(micro-batch),使设备能够更频繁地处理数据,减少空闲时间。
    例如,当 m≥4p 时,bubble 占比可以降低到较低水平。

  5. 对于 GPT-3 级别模型(百亿参数以上),你会如何设计训练并行策略?

langChain

LangChain 是一个专为构建大语言模型(LLM)驱动应用而设计的开源框架,其核心目标是通过模块化设计简化复杂 LLM 应用的开发流程,类似于“胶水层”连接 LLM 与其他工具、数据及外部系统。以下是其核心特点与定位的详细解析:


1. LangChain 的核心定位

LangChain 并非类似 PyTorch、DeepSpeed 或 Megatron 这类底层深度学习框架或训练工具,而是一个应用开发框架。两者的区别在于:

  • PyTorch 等框架:专注于模型训练、优化及底层计算,提供张量操作和神经网络构建能力。
  • LangChain:专注于将 LLM 与外部系统(如数据库、API、工具链)集成,提供标准化接口和模块化组件,简化应用开发流程。

2. LangChain 的核心模块

LangChain 提供以下关键组件,支持开发者灵活组合 LLM 应用:

  • 模型 I/O:统一不同 LLM(如 GPT、Claude、本地模型)的调用接口,支持文本生成、聊天模型和嵌入模型。
  • 数据连接:集成文档加载器、文本分割器和向量数据库(如 Milvus、Weaviate),支持检索增强生成(RAG)以结合外部数据源。
  • 记忆(Memory):管理对话历史或上下文,支持短期记忆与长期存储的结合。
  • 链(Chains):将多个步骤串联成工作流(如“提问 → 检索 → 推理 → 输出”)。
  • 代理(Agents):允许 LLM 自主选择工具(如计算器、搜索 API)完成任务,充当推理引擎。
  • 回调(Callbacks):监控和调试模型交互过程,支持日志记录、流处理等功能。

3. LangChain 的核心优势

  • 快速原型开发:通过预置组件(如提示模板、链式流程)快速搭建应用,例如从 PDF 提取数据并生成报告。
  • 灵活性与兼容性:支持主流 LLM(如 OpenAI、Hugging Face)和工具(如向量数据库、API),提供统一接口。
  • 生产级支持:支持异步调用、流式输出、部署优化,并与可观测性工具(如 LangSmith)集成,便于调试和监控。
  • 模块化设计:组件可自由组合,开发者无需从头造轮子,例如通过 LCEL(LangChain 表达式语言)创建自定义工作流。

4. 与 PyTorch 等框架的差异

维度LangChainPyTorch/DeepSpeed/Megatron
定位LLM 应用开发框架深度学习模型训练与优化框架
核心功能集成 LLM 与外部工具、数据源张量计算、分布式训练、模型微调
应用场景聊天机器人、RAG、智能体等应用模型训练、参数优化、硬件加速
抽象层级高层抽象(链、代理、记忆)底层抽象(计算图、梯度下降算法)

5. LangChain 的挑战与争议

  • 抽象复杂性:高级抽象(如链、模板)可能导致代码难以调试和维护,尤其在需要深度定制时。
  • 灵活性限制:预定义的模块可能无法满足特定需求(如动态调整代理工具可用性),部分开发者认为直接调用 LLM API 更高效。
  • 迭代速度:技术快速迭代下,框架设计可能滞后于新兴技术(如多模态模型)。

6. 适用场景

LangChain 特别适合以下场景:

  • 检索增强生成(RAG):结合外部知识库增强模型回答准确性。
  • 多步骤任务自动化:如通过代理调用工具完成复杂工作流(如数据分析 → 生成报告)。
  • 快速原型验证:利用预置组件快速测试 LLM 应用可行性,降低开发门槛。

总结

LangChain 是 LLM 应用开发领域的“瑞士军刀”,通过模块化设计简化复杂流程,但其抽象层可能带来灵活性限制。对于需要快速原型开发或复杂 LLM 集成的场景,它是理想选择;而对于追求极致定制或简单任务,直接调用 API 可能更高效。

http://www.xdnf.cn/news/4462.html

相关文章:

  • 系统架构师2025年论文《信息系统安全体系设计》
  • Xilinx DSP48E2 slice 一个周期能做几次float32浮点数乘法或者加法?如果是fix 32定点数呢?
  • “wsl --install -d Ubuntu-22.04”下载慢,中国地区离线安装 Ubuntu 22.04 WSL方法(亲测2025年5月6日)
  • python + whisper 读取蓝牙耳机, 转为文字
  • JavaScript 到命令和控制 (C2) 服务器恶意软件分析及防御
  • 三生原理是如何与狄利克雷定理兼容的?
  • 使用docker配置Mysql
  • 2021-10-29 C++被17或13整除最大10个数的和
  • 六六大顺--高精度+数学
  • 【QT】QT软件编译生成exe后,需要拷贝依赖库使用方法
  • 使用Windows+Linux实现mysql的主从复制
  • 【容器化】Docker容器技术入门基础教程
  • 【第四章】23-常见问题的快速处理
  • UKCC(原OUCC)真题讲解(一)
  • 代码随想录算法训练营总结篇
  • C++ 的 Tag Dispatching 技术
  • 人工智能 计算智能领域中分布估计算法的核心思想
  • 深度学习模型GoogLeNet的创新
  • 深入解析代理服务器:原理、应用与实战配置指南
  • 支持 BLF 的 Kamailio 脚本
  • Baklib知识中台驱动企业智能升级
  • SpringBoot快速入门复习概览
  • 2025年01月09日德美医疗前端面试
  • 2025年提交App到Appstore从审核被拒到通过的经历
  • 连锁企业筹建流程效能提升方案:日事清在标准化进度管控中的落地应用​
  • Vue 工程化 + ElementPlus 深度实战指南:从脚手架到生产部署全流程解析
  • 【HDLBits刷题】Verilog Language——1.Basics
  • 2021-10-31 C++求一个千位和十位数字之和为10,百位个位之积为12的四位数
  • 国标GB28181视频平台EasyGBS打造公路水运工程平安工地视频远程监控体系
  • Codeforces Round 1023 (Div. 2) ABC