中英双语介绍DeepSpeed 的 ZeRO 优化

news2024/11/28 10:29:57

DeepSpeed 的 ZeRO 优化:通俗易懂的原理与实践指南

引言

在深度学习的大规模模型训练中,显存瓶颈是常见的挑战。DeepSpeed 提供了革命性的 ZeRO (Zero Redundancy Optimizer) 优化技术,为大模型训练节省显存、提高效率提供了强有力的工具。本文将深入介绍 ZeRO 的原理、三种阶段的特点及其适用场景,并结合实际脚本展示如何使用 ZeRO Stage 2 进行优化。 本文借助https://github.com/allenai/open-instruct这个框架来展开。


ZeRO 优化的核心原理

通常在深度学习中,模型训练会使用大量显存来存储:

  1. 模型参数
  2. 梯度
  3. 优化器状态

这些资源在分布式训练时会被复制到每张 GPU 上,造成显存浪费。ZeRO 的目标是消除冗余数据存储,将这些资源高效地分布到多张 GPU 上,使得大模型的训练在有限硬件条件下成为可能。

ZeRO 优化通过以下方式工作:

  • 参数分片 (Parameter Sharding)
    将模型参数、梯度和优化器状态分割到不同的设备上,各 GPU 只存储自己负责的一部分。

  • 按需加载
    各 GPU 只在需要时访问其他分片的数据,避免不必要的通信和存储开销。


ZeRO 的三种阶段及区别

DeepSpeed 提供了 ZeRO 的三种优化阶段,每个阶段在显存占用和通信开销之间找到不同的平衡:

Stage 1: 优化器状态分片
  • 特点:
    仅将优化器状态分片存储,各 GPU 保留完整的梯度和模型参数。
  • 优点:
    易于实现,通信量小。
  • 适用场景:
    中等规模的模型训练,显存节省有限。
Stage 2: 优化器状态和梯度分片
  • 特点:
    在 Stage 1 的基础上,进一步将梯度分片,各 GPU 只存储自己负责的部分。
  • 优点:
    较大幅度降低显存需求,同时通信开销适中。
  • 适用场景:
    大多数大规模模型训练的理想选择,兼顾效率和资源节省。
Stage 3: 优化器状态、梯度和模型参数分片
  • 特点:
    所有相关数据(优化器状态、梯度和模型参数)都被分片存储,训练过程需要频繁的通信。
  • 优点:
    显存需求最小,适合超大模型。
  • 适用场景:
    超大规模模型(如 GPT-3)训练,但通信开销高,对网络带宽要求高。

ZeRO Stage 2 的使用实践

以下通过一个完整示例,展示如何使用 ZeRO Stage 2 优化器。

配置文件

创建一个 DeepSpeed 配置文件,命名为 stage2_no_offloading_accelerate.conf

{
    "bf16": {
        "enabled": "auto"
    },
    "zero_optimization": {
        "stage": 2,
        "overlap_comm": true,
        "contiguous_gradients": true,
        "reduce_bucket_size": "auto",
        "sub_group_size": 1e9
    },
    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 1e5,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}
  • stage: 2 表示启用 ZeRO Stage 2。
  • overlap_comm: true 表示通信和计算重叠以加速训练。
  • contiguous_gradients: true 用于优化梯度内存布局,进一步减少显存碎片化。
    文件所在位置如下图所示:
    在这里插入图片描述

Bash 脚本

以下是完整的训练脚本,结合了 ZeRO Stage 2 的优化设置:脚本来源于https://github.com/allenai/open-instruct/blob/main/docs/tulu3.md

# 设置模型和训练参数
MODEL_NAME=google/gemma-2-2b
MACHINE_RANK=0
MAIN_PROCESS_IP=127.0.0.1
MAIN_PROCESS_PORT=29400
NUM_MACHINES=1
NUM_PROCESSES=4
PER_DEVICE_TRAIN_BATCH_SIZE=1
GRADIENT_ACCUMULATION_STEPS=2

# 启动命令
accelerate launch \
    --mixed_precision bf16 \
    --num_machines $NUM_MACHINES \
    --num_processes $NUM_PROCESSES \
    --machine_rank $MACHINE_RANK \
    --main_process_ip $MAIN_PROCESS_IP \
    --main_process_port $MAIN_PROCESS_PORT \
    --use_deepspeed \
    --deepspeed_config_file configs/ds_configs/stage2_no_offloading_accelerate.conf \
    --deepspeed_multinode_launcher standard open_instruct/finetune.py \
    --model_name_or_path $MODEL_NAME \
    --tokenizer_name $MODEL_NAME \
    --use_slow_tokenizer \
    --use_flash_attn \
    --max_seq_length 2048 \
    --preprocessing_num_workers 4 \
    --per_device_train_batch_size $PER_DEVICE_TRAIN_BATCH_SIZE \
    --gradient_accumulation_steps $GRADIENT_ACCUMULATION_STEPS \
    --learning_rate 5e-06 \
    --lr_scheduler_type linear \
    --warmup_ratio 0.03 \
    --weight_decay 0.0 \
    --num_train_epochs 1 \
    --output_dir output/sft_2b \
    --with_tracking \
    --report_to wandb \
    --logging_steps 1 \
    --reduce_loss sum \
    --model_revision main \
    --dataset_mixer_list allenai/tulu-3-sft-mixture 1.0 \
    --checkpointing_steps epoch \
    --dataset_mix_dir output/sft_2b \
    --exp_name tulu-2b-sft \
    --seed 123
关键参数说明
  • --use_deepspeed:启用 DeepSpeed。
  • --deepspeed_config_file:指定配置文件路径。
  • --mixed_precision bf16:启用混合精度训练以节省显存。

使用 ZeRO Stage 2 的优势

  1. 显存优化:
    相较于 Stage 1,进一步减少了梯度显存的需求。

  2. 适配性强:
    在不显著增加通信成本的前提下,支持大规模模型的训练。

  3. 易用性:
    配置简单,适合大部分用户。


总结

DeepSpeed 的 ZeRO 优化技术为深度学习领域提供了显存节省和高效训练的全新工具。从 Stage 1 到 Stage 3,不同阶段适应不同的场景需求。通过本文的介绍,相信你已经了解了 ZeRO 的核心原理、三阶段的特点以及如何在实际训练中使用 ZeRO Stage 2。

DeepSpeed ZeRO Optimization: A Beginner-Friendly Guide to Concepts and Practical Use

Introduction

Training large-scale models often runs into memory bottlenecks due to the limited capacity of GPUs. DeepSpeed introduces the ZeRO (Zero Redundancy Optimizer) optimization technique, a groundbreaking solution to reduce memory usage and improve efficiency during training. This article provides a detailed yet beginner-friendly explanation of ZeRO’s principles, its three optimization stages, and practical guidance on using ZeRO Stage 2, complete with example configurations and scripts.


Core Principles of ZeRO Optimization

In deep learning, significant GPU memory is consumed by:

  1. Model parameters
  2. Gradients
  3. Optimizer states

Typically, this data is replicated across GPUs in distributed training, leading to wasted memory. ZeRO aims to eliminate redundancy by distributing these components across GPUs, enabling efficient utilization of memory.

Key strategies of ZeRO include:

  • Sharding: Splitting model parameters, gradients, and optimizer states across GPUs. Each GPU stores only a portion of the data it is responsible for.
  • Lazy loading: GPUs only access the shards they need, reducing unnecessary data movement and storage.

ZeRO Optimization Stages

ZeRO is implemented in three progressive stages, each targeting different components for memory optimization.

Stage 1: Sharding Optimizer States
  • What it does:
    Splits optimizer states across GPUs, while gradients and model parameters remain fully replicated.
  • Benefits:
    Simple to implement with minimal communication overhead.
  • Best for:
    Medium-sized models where some memory savings suffice.
Stage 2: Sharding Optimizer States and Gradients
  • What it does:
    In addition to optimizer state sharding, gradients are also partitioned among GPUs.
  • Benefits:
    Significant memory savings with moderate communication costs.
  • Best for:
    Most large-scale model training tasks, balancing efficiency and memory use.
Stage 3: Sharding Everything
  • What it does:
    Shards optimizer states, gradients, and model parameters. Communication is required to reconstruct data during training.
  • Benefits:
    Maximum memory savings, suitable for ultra-large models.
  • Best for:
    Extremely large models like GPT-3, where memory limits are critical. However, it demands high network bandwidth.

Practical Guide: Using ZeRO Stage 2

Below is a step-by-step guide to implement ZeRO Stage 2 for optimizing your model training.

Configuration File

Create a DeepSpeed configuration file named stage2_no_offloading_accelerate.conf:

{
    "bf16": {
        "enabled": "auto"
    },
    "zero_optimization": {
        "stage": 2,
        "overlap_comm": true,
        "contiguous_gradients": true,
        "reduce_bucket_size": "auto",
        "sub_group_size": 1e9
    },
    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 1e5,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}
  • stage: 2: Specifies that ZeRO Stage 2 is being used.
  • overlap_comm: true: Overlaps communication with computation for faster training.
  • contiguous_gradients: true: Optimizes gradient memory layout to reduce fragmentation.

Training Script

Below is a sample training script using ZeRO Stage 2 for optimization:

# Define model and training parameters
MODEL_NAME=google/gemma-2-2b
MACHINE_RANK=0
MAIN_PROCESS_IP=127.0.0.1
MAIN_PROCESS_PORT=29400
NUM_MACHINES=1
NUM_PROCESSES=4
PER_DEVICE_TRAIN_BATCH_SIZE=1
GRADIENT_ACCUMULATION_STEPS=2

# Launch training with DeepSpeed
accelerate launch \
    --mixed_precision bf16 \
    --num_machines $NUM_MACHINES \
    --num_processes $NUM_PROCESSES \
    --machine_rank $MACHINE_RANK \
    --main_process_ip $MAIN_PROCESS_IP \
    --main_process_port $MAIN_PROCESS_PORT \
    --use_deepspeed \
    --deepspeed_config_file configs/ds_configs/stage2_no_offloading_accelerate.conf \
    --deepspeed_multinode_launcher standard open_instruct/finetune.py \
    --model_name_or_path $MODEL_NAME \
    --tokenizer_name $MODEL_NAME \
    --use_slow_tokenizer \
    --use_flash_attn \
    --max_seq_length 2048 \
    --preprocessing_num_workers 4 \
    --per_device_train_batch_size $PER_DEVICE_TRAIN_BATCH_SIZE \
    --gradient_accumulation_steps $GRADIENT_ACCUMULATION_STEPS \
    --learning_rate 5e-06 \
    --lr_scheduler_type linear \
    --warmup_ratio 0.03 \
    --weight_decay 0.0 \
    --num_train_epochs 1 \
    --output_dir output/sft_2b \
    --with_tracking \
    --report_to wandb \
    --logging_steps 1 \
    --reduce_loss sum \
    --model_revision main \
    --dataset_mixer_list allenai/tulu-3-sft-mixture 1.0 \
    --checkpointing_steps epoch \
    --dataset_mix_dir output/sft_2b \
    --exp_name tulu-2b-sft \
    --seed 123
Key Arguments Explained
  • --use_deepspeed: Enables DeepSpeed integration.
  • --deepspeed_config_file: Points to the configuration file.
  • --mixed_precision bf16: Uses bfloat16 for reduced precision to save memory and improve speed.

Why Use ZeRO Stage 2?

  1. Memory Optimization:
    Shards optimizer states and gradients, significantly reducing memory usage.

  2. Balanced Trade-Off:
    Achieves considerable memory savings without high communication overhead, unlike Stage 3.

  3. Ease of Use:
    Simple configuration and implementation, making it a great choice for most users.


Conclusion

DeepSpeed’s ZeRO optimization revolutionizes distributed training by tackling memory bottlenecks efficiently. The three stages of ZeRO provide flexibility for different scales and requirements, with Stage 2 being a practical and balanced choice for most large-scale models.

By following this guide, you can confidently implement ZeRO Stage 2 in your projects and take advantage of its memory-saving capabilities. For further exploration, the DeepSpeed documentation is an excellent resource to delve into advanced topics like offloading and custom configurations.

后记

2024年11月27日21点16分于上海。

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/2248983.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

如何将 GitHub 私有仓库(private)转换为公共仓库(public)

文章目录 如何将 GitHub 私有仓库转换为公共仓库步骤 1: 登录 GitHub步骤 2: 导航到目标仓库步骤 3: 访问仓库设置步骤 4: 更改仓库可见性步骤 5: 确认更改步骤 6: 验证更改注意事项 如何将 GitHub 私有仓库转换为公共仓库 在软件开发领域,GitHub 是一个广受欢迎的…

【webrtc】 mediasoup中m77的IntervalBudget及其在AlrDetector的应用

IntervalBudget 用于带宽控制和流量整形 mediasoup中m77 代码的IntervalBudget ,版本比较老IntervalBudget 在特定时间间隔内的比特预算管理,从而实现带宽控制和流量整形。 一。 pacedsender 执行周期: 下一次执行的时间的动态可变的 int64_t PacedSender::TimeUntilNextPr…

Z2400023基于Java+Servlet+jsp+mysql的酒店管理系统的设计与实现 源码 调试 文档

酒店管理系统的设计与实现 1.摘要2.主要功能3. 项目技术栈运行环境 4.系统界面截图5.源码获取 1.摘要 本文介绍了一个基于Java的酒店管理系统,该系统采用Servlet、JSP、JDBC以及c3p0等技术构建,为酒店提供了一个全面的管理平台。该系统不仅适合酒店进行…

《操作系统 - 清华大学》5 -5:缺页异常

文章目录 1. 缺页异常的处理流程2.在何处保存未被映射的页?3. 虚拟内存性能 1. 缺页异常的处理流程 缺页中断的处理过程: CPU读内存单元,在TLB中根据其虚拟地址匹配物理地址,未命中,读页表; 由于页表项的存在位为0,CP…

C++:多态的原理

目录 一、多态的原理 1.虚函数表 2.多态的原理 二、单继承和多继承的虚函数表 1、单继承中的虚函数表 2、多继承中的虚函数表 一、多态的原理 1.虚函数表 首先我们创建一个使用了多态的类&#xff0c;创建一个对象来看其内部的内容&#xff1a; #include<iostre…

Ubuntu 硬盘分区并挂载

一、什么是挂载 1.挂载的定义 在 Ubuntu&#xff08;或其他 Linux 系统&#xff09;中&#xff0c;挂载&#xff08;Mount&#xff09; 是将一个存储设备或分区连接到系统的文件系统层次结构中的过程。挂载后&#xff0c;你可以通过某个目录&#xff08;挂载点&#xff09;访问…

python-docx -- 读取word页眉、页脚

文章目录 sections介绍访问section添加section页眉、页脚综合案例:sections介绍 word支持section的概念,即一个文档的划分部分,不同的部分均包含相同的页面布局设置,如相同的边距、页面方向等;在每个section中可以定义页眉、页脚来应用于该section下的所有页面;大部分wor…

开源加密库mbedtls及其Windows编译库

目录 1 项目简介 2 功能特性 3 性能优势 4 平台兼容性 5 应用场景 6 特点 7 Windows编译 8 编译静态库及其测试示例下载 1 项目简介 Mbed TLS是一个由ARM Maintained的开源项目&#xff0c;它提供了一个轻量级的加密库&#xff0c;适用于嵌入式系统和物联网设备。这个项…

《生成式 AI》课程 第7講:大型語言模型修練史 — 第二階段: 名師指點,發揮潛力 (兼談對 ChatGPT 做逆向工程與 LLaMA 時代的開始)

资料来自李宏毅老师《生成式 AI》课程&#xff0c;如有侵权请通知下线 Introduction to Generative AI 2024 Springhttps://speech.ee.ntu.edu.tw/~hylee/genai/2024-spring.php 摘要 这一系列的作业是为 2024 年春季的《生成式 AI》课程设计的&#xff0c;共包含十个作业。…

公司金融期末考试题目

公司金融期末考试题 选择题 1.现金折扣和信用条件&#xff08;教材P253&#xff09; 题目类似&#xff1a; 下列不属于信用条件的是&#xff08;&#xff09;。 现金折扣 数量折扣信用期限 折扣期限 给定的信用条件为"1/10&#xff0c;n/40"&#xff0c;则其含义…

【前端】JavaScript中的字面量概念与应用详解

博客主页&#xff1a; [小ᶻ☡꙳ᵃⁱᵍᶜ꙳] 本文专栏: 前端 文章目录 &#x1f4af;前言&#x1f4af;字面量1. 数字字面量2. 字符串字面量3. 布尔字面量4. 空值字面量&#xff08;null&#xff09;5. 对象字面量6. 数组字面量7. 正则表达式字面量8. 特殊值字面量9. 函数字…

Kotlin DSL Gradle 指南

本文是关于 Kotlin DSL Gradle 的指南&#xff08;上篇&#xff09;&#xff0c;介绍了 Gradle 作为 Android 开发构建工具的作用及优势&#xff0c;包括初始配置、生命周期、依赖管理、Task 相关内容。如 Task 的创建、自定义、各种方法和属性&#xff0c;以及文件操作等&…

Web开发:使用stackexchange.redis库对redis进行增删改查

一、安装第三方库 二、官网 StackExchange.Redis |通用型 redis 客户端 三、连接示例 private static string redisConnectionString "localhost:6379,passwordyourpassword,defaultDatabase0,allowAdmintrue,asyncTimeout10000";private static string redisConn…

2024年第15届蓝桥杯C/C++组蓝桥杯JAVA实现

目录 第一题握手&#xff0c;这个直接从49累加到7即可&#xff0c;没啥难度&#xff0c;后面7个不握手就好了&#xff0c;没啥讲的&#xff0c;(然后第二个题填空好难&#xff0c;嘻嘻不会&#xff09; 第三题.好数​编辑 第四题0R格式 宝石组合 数字接龙 最后一题:拔河 第…

Django基础之路由

一.前言 前面我们说了django的安装于基础配置&#xff0c;基础知识点我就细分下来&#xff0c;每天和大家讲一点&#xff0c;今天就要和大家说django的基础知识点了&#xff0c;我们今天先来讲路由&#xff0c;内容不多&#xff0c;希望大家记住 二.传统路由 路由就是前面一个…

gitlab ssh-key 绑定

windows环境下配置 gitlab的ssh key&#xff1a; 1.打开本地git bash,使用如下命令生成ssh公钥和私钥对: ssh-keygen -t rsa -C xxxxxx.com 2.一直回车&#xff1b; 3.然后打开公钥文件&#xff1a;C:/Users/Administrator/.ssh/id_rsa.pub文件&#xff0c;复制其中的内容; 4…

26.100ASK_T113-PRO 测试摄像头 输出信息

1.测试代码 读到摄象头参数 输出 video_test.c #include <sys/types.h> #include <sys/stat.h> #include <fcntl.h> #include <sys/ioctl.h> #include <unistd.h> #include <stdio.h> #include <string.h> #include <linux/type…

【人工智能】深入解析GPT、BERT与Transformer模型|从原理到应用的完整教程

在当今人工智能迅猛发展的时代&#xff0c;自然语言处理&#xff08;NLP&#xff09;领域涌现出许多强大的模型&#xff0c;其中GPT、BERT与Transformer无疑是最受关注的三大巨头。这些模型不仅在学术界引起了广泛讨论&#xff0c;也在工业界得到了广泛应用。那么&#xff0c;G…

【Flink-scala】DataStream编程模型之 窗口的划分-时间概念-窗口计算程序

DataStream编程模型之 窗口的划分-时间概念-窗口计算程序 1. 窗口的划分 1.1 窗口分为&#xff1a;基于时间的窗口 和 基于数量的窗口 基于时间的窗口&#xff1a;基于起始时间戳 和终止时间戳来决定窗口的大小 基于数量的窗口&#xff1a;根据固定的数量定义窗口 的大小 这…

虚拟地址空间与物理内存(Linux系统)

个人主页&#xff1a;敲上瘾-CSDN博客 个人专栏&#xff1a;Linux学习、游戏、数据结构、c语言基础、c学习、算法 目录 问题引入 一、什么是虚拟内存 二、虚拟内存的描述与组织 三、页表的优势 四、虚拟内存区域划分 问题引入 为引入今天的话题&#xff0c;我们先来看下面…