DeepSpeed 配置文件(DeepSpeed Configuration Files)详解:中英文解释

news2024/11/28 11:10:58

中文版

本文详细介绍 DeepSpeed 配置文件,结合 4 卡 3090 的实际使用场景,重点解释各个参数的含义,并提供应对爆显存的方案。


DeepSpeed 配置文件详解:从基础到实战

DeepSpeed 是用于加速大规模分布式训练的重要工具,其灵活的配置文件是实现高效训练的关键。在本篇博客中,我们将深入解读 DeepSpeed 配置文件的结构和关键参数,结合 4 卡 3090 的实际训练场景,探讨如何优化配置,解决爆显存问题。


1. 配置文件的结构

DeepSpeed 的配置文件一般以 JSON 格式定义,包括以下几个核心部分:

  • bf16/fp16 配置:决定是否启用混合精度训练。
  • ZeRO 优化配置:用于控制内存优化策略。
  • 训练相关参数:例如批量大小、梯度累积步数等。

以下是一个典型的配置文件示例:

{
    "bf16": {
        "enabled": true
    },
    "zero_optimization": {
        "stage": 2,
        "overlap_comm": true,
        "contiguous_gradients": false,
        "reduce_bucket_size": 5e5,
        "sub_group_size": 5e5
    },
    "gradient_accumulation_steps": 4,
    "train_micro_batch_size_per_gpu": 1,
    "gradient_clipping": 1.0
}

2. 关键参数解析
bf16.enabled
  • 含义:启用 BF16 混合精度训练。
  • 影响:显著减少显存占用,提升训练速度。
zero_optimization.stage
  • 含义:指定 ZeRO 优化的阶段。
    • Stage 1:优化梯度存储。
    • Stage 2:进一步优化优化器状态存储。
    • Stage 3:支持模型分片。
  • 推荐:对于 4 卡 3090,优先选择 Stage 2,在显存允许的情况下使用 Stage 3
overlap_comm
  • 含义:启用通信与计算的重叠,减少通信开销。
  • 建议:在多卡场景中始终开启。
contiguous_gradients
  • 含义:是否在内存中存储连续梯度。
  • 优点:开启后可减少内存碎片化,提高通信效率。
  • 缺点:增加显存开销。
  • 建议:若显存不足,可将其设置为 false
reduce_bucket_size
  • 含义:定义一次通信中参数分片的最大大小。
  • 单位:字节。
  • 默认值:5e6(即 5 MB)。
  • 调整:
    • 若显存不足,减小值至 1e55e5
    • 如果通信瓶颈明显,可适当增大值。
sub_group_size
  • 含义:设置通信子组的参数分片大小。
  • 默认值:1e8(即 100 MB)。
  • 调整:
    • 小模型:5e5 或更低。
    • 大模型:可根据显存容量调试,通常 1e61e7
gradient_accumulation_steps
  • 含义:设置梯度累积步数,减少单步的显存压力。
  • 建议:逐步增加值(如从 48),但需注意总批量大小的变化。
train_micro_batch_size_per_gpu
  • 含义:每张 GPU 的微批量大小。
  • 建议:在显存不足时减小,如从 4 降为 1
gradient_clipping
  • 含义:限制梯度范数,防止梯度爆炸。
  • 推荐值:1.0

3. 针对 4 卡 3090 的优化建议
  • 显存不足问题解决方法:

    1. 减小 reduce_bucket_sizesub_group_size
      "reduce_bucket_size": 1e5,
      "sub_group_size": 5e5
      
    2. 降低 train_micro_batch_size_per_gpu
      "train_micro_batch_size_per_gpu": 1
      
    3. 增大 gradient_accumulation_steps
      "gradient_accumulation_steps": 8
      
    4. 禁用 contiguous_gradients
      "contiguous_gradients": false
      
  • 检查 NCCL 环境变量
    确保以下变量已正确设置,避免通信问题导致显存不足。

    export NCCL_BLOCKING_WAIT=1
    export NCCL_ASYNC_ERROR_HANDLING=1
    export NCCL_TIMEOUT=10800
    
  • 启用 CPU Offloading(如果必要)
    对于显存严重不足的场景,可将部分优化器状态卸载至 CPU。

    "offload_optimizer": {
        "device": "cpu",
        "pin_memory": true
    }
    

4. 实验结果分析与日志监控

在训练过程中,通过以下设置获取详细的资源占用信息:

"wall_clock_breakdown": true

并结合 DeepSpeed 的日志分析显存使用、通信效率等关键指标。


通过合理配置 DeepSpeed 配置文件,结合具体的硬件资源和任务需求,可以显著提升训练效率,减少显存压力。

英文版

This article is about explaining DeepSpeed configuration files, focusing on practical usage with a 4x 3090 GPU setup. This includes a breakdown of key parameters like contiguous_gradients, reduce_bucket_size, and sub_group_size, as well as solutions for handling out-of-memory (OOM) errors.


DeepSpeed Configuration Files: A Comprehensive Guide

DeepSpeed offers advanced optimization features like ZeRO (Zero Redundancy Optimizer) to enable efficient large-scale model training. This post will delve into configuring DeepSpeed for optimal performance, with examples and tips tailored to a 4x NVIDIA 3090 GPU setup.


1. Key Parameters in a DeepSpeed Configuration File

Below is an example configuration file for ZeRO Stage 2 optimization, designed for fine-tuning large models:

{
    "zero_optimization": {
        "stage": 2,
        "overlap_comm": true,
        "contiguous_gradients": false,
        "reduce_bucket_size": 5e5,
        "sub_group_size": 5e5
    },
    "gradient_accumulation_steps": 4,
    "train_micro_batch_size_per_gpu": 1,
    "gradient_clipping": 1.0
}

Let’s break down the parameters:

(1) zero_optimization.stage
  • Defines the ZeRO optimization stage:
    • Stage 2: Optimizes optimizer states and gradients across GPUs, reducing memory usage.
    • Use Stage 3 for more aggressive memory savings by offloading parameters to CPU, if applicable.
(2) overlap_comm
  • Default: true
  • Enables overlapping communication with computation, improving efficiency during distributed training.
(3) contiguous_gradients
  • Default: false
  • When true, all gradients are stored contiguously in memory.
    • Benefit: Faster gradient reductions.
    • Drawback: Increases memory usage.
    • Recommendation: Set to false if facing OOM issues.
(4) reduce_bucket_size
  • Defines the size of gradient buckets for all-reduce operations.
    • Smaller values (e.g., 5e5) reduce memory pressure but may slightly slow down training.
    • Larger values improve speed but require more memory.
(5) sub_group_size
  • Controls sub-grouping of gradients during communication.
    • Default: A large value (e.g., 1e9), meaning no sub-grouping.
    • Recommendation: Reduce to 5e5 or lower for better memory efficiency.
(6) gradient_accumulation_steps
  • Number of steps to accumulate gradients before performing a backward pass.
    • Higher values effectively increase the batch size without increasing per-GPU memory load.
(7) train_micro_batch_size_per_gpu
  • Batch size per GPU per step.
    • Recommendation: Start with a small value (e.g., 1) and scale up gradually.

2. Handling Out-of-Memory (OOM) Errors

Training large models like Google Gemma-2-2B on GPUs with limited memory (24 GB, such as NVIDIA 3090) often results in OOM errors. Here are optimization strategies:

(1) Reduce train_micro_batch_size_per_gpu
  • Start with 1 and only increase if memory allows.
(2) Lower reduce_bucket_size and sub_group_size
  • Decrease both to 1e5 or 5e4. This reduces the memory footprint during gradient reduction at the cost of slightly increased communication overhead.
(3) Enable offload_optimizer or offload_param (for ZeRO Stage 3)
  • Offload optimizer states or parameters to CPU if memory remains insufficient.
  • Example configuration for optimizer offloading:
    {
        "zero_optimization": {
            "stage": 3,
            "offload_optimizer": {
                "device": "cpu",
                "pin_memory": true
            }
        }
    }
    
(4) Use Gradient Checkpointing
  • Activates checkpointing for intermediate activations to save memory during backpropagation.
    from deepspeed.runtime.activation_checkpointing import checkpointing_config
    checkpointing_config(
        partition_activations=True,
        contiguous_memory_optimization=False
    )
    
(5) Mixed Precision Training (bf16 or fp16)
  • Use bf16 for better memory efficiency with minimal precision loss.
(6) Increase gradient_accumulation_steps
  • Accumulate gradients over more steps to reduce the batch size processed per GPU.
(7) Reduce max_seq_length
  • Shorten sequence length (e.g., 512 or 768 tokens) to decrease memory usage.

3. Practical Example: Fine-Tuning on 4x NVIDIA 3090 GPUs

The following accelerate command illustrates how to combine the above settings for fine-tuning a large model:

accelerate launch \
    --mixed_precision bf16 \
    --num_machines 1 \
    --num_processes 4 \
    --machine_rank 0 \
    --main_process_ip 127.0.0.1 \
    --main_process_port 29400 \
    --use_deepspeed \
    --deepspeed_config_file configs/ds_config.json \
    --model_name_or_path google/gemma-2-2b \
    --tokenizer_name google/gemma-2-2b \
    --max_seq_length 768 \
    --per_device_train_batch_size 1 \
    --gradient_accumulation_steps 4 \
    --learning_rate 5e-6 \
    --num_train_epochs 1 \
    --output_dir output/sft_gemma2

4. Debugging Tips

  • Enable Detailed Logs: Set wall_clock_breakdown: true in the config file to identify bottlenecks.
  • NCCL Tuning: Add environment variables to handle communication errors:
    export NCCL_BLOCKING_WAIT=1
    export NCCL_ASYNC_ERROR_HANDLING=1
    

Conclusion

DeepSpeed’s configuration is highly flexible, but tuning requires balancing memory efficiency and computational speed. By adjusting parameters like reduce_bucket_size, gradient_accumulation_steps, and leveraging ZeRO’s offloading capabilities, you can effectively train large models even on memory-constrained GPUs like the NVIDIA 3090.

后记

2024年11月27日22点08分于上海,基于GPT4o大模型。

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

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

相关文章

【Linux】—简单实现一个shell(myshell)

大家好呀,我是残念,希望在你看完之后,能对你有所帮助,有什么不足请指正!共同学习交流哦! 本文由:残念ing原创CSDN首发,如需要转载请通知 个人主页:残念ing-CSDN博客&…

基于 Flask 和 RabbitMQ 构建高效消息队列系统:从数据生成到消费

简介 在构建 Web 应用时,处理和传输大量数据是不可避免的。对于需要高效、可扩展的消息处理和异步任务执行的场景,使用 RabbitMQ(一种流行的消息队列中间件)与 Flask(一个轻量级的 Python Web 框架)结合&a…

Linux:文件管理(一)——文件描述符fd

目录 一、文件基础认识 二、C语言操作文件的接口 1.> 和 >> 2.理解“当前路径” 三、相关系统调用 1.open 2.文件描述符 3.一切皆文件 4.再次理解重定向 一、文件基础认识 文件 内容 属性。换句话说,如果在电脑上新建了一个空白文档&#xff0…

机器学习模型——线性回归

文章目录 前言1.基础概念2.代价函数3.单变量线性回归3.1加载数据3.2初始化超参数3.3梯度下降算法3.3.1初次梯度下降3.3.2 多次梯度下降3.3.3结果可视化 前言 随着互联网数据不断累积,硬件不断升级迭代,在这个信息爆炸的时代,机器学习已被应用…

如何安全高效地打开和管理动态链接库(DLL)?系统提示dll丢失问题的多种有效修复指南

动态链接库(DLL)文件是Windows操作系统中非常重要的一部分,它们包含了程序运行所需的代码和数据。当系统提示DLL文件丢失时,可能会导致应用程序无法正常运行。以下是一些安全高效地打开和管理DLL文件以及修复DLL丢失问题的方法&am…

数据结构(初阶7)---七大排序法(堆排序,快速排序,归并排序,希尔排序,冒泡排序,选择排序,插入排序)(详解)

排序 1.插入排序2.希尔排序3.冒泡排序4.选择排序(双头排序优化版)5.堆排序6.快速排序1). 双指针法2).前后指针法3).非递归法 7.归并排序1).递归版本(递归的回退就是归并)2).非递归版本(迭代版本) 计算机执行的最多的操作之一就有排序,排序是一项极其重要的技能 接下…

【JavaEE初阶 — 网络原理】初识网络原理

目录 1. 网络发展史 1.1 独立模式 1.2 网络互连 1.2.1 网络互联的背景 1.2.2 网络互联的定义 1.3 局域网LAN 1.4 广域网WAN 2. 网络通信基础 2.1 IP地址 2.2 端口号 2.3 认识协议 2.4 五元组 2.5 协议分层 2.5.1 分…

【C++习题】15.滑动窗口_串联所有单词的子串

文章目录 题目链接&#xff1a;题目描述&#xff1a;解法C 算法代码&#xff1a;图解 题目链接&#xff1a; 30. 串联所有单词的子串 题目描述&#xff1a; 解法 滑动窗口哈希表 这题和第14题不同的是&#xff1a; 哈希表不同&#xff1a;hash<string,int>left与right指…

【学术讲座】视觉计算中的深度学习方法 AIGC图像视频生成模型的推理加速

视觉计算中的深度学习方法 发展历程 backbone 强化学习、LLM等&#xff1a;有监督 && 无监督的结合 目标检测 图像分割 网络结构搜索 搜索方法 1&#xff1a;强化学习 2&#xff1a;强化学习 3&#xff1a;梯度算法 结构选择的作用 1&#xff1a;开放环境感知网络…

【VLANPWN】一款针对VLAN的安全研究和渗透测试工具

关于VLANPWN VLANPWN是一款针对VLAN的安全研究和渗透测试工具&#xff0c;该工具可以帮助广大研究人员通过对VLAN执行渗透测试&#xff0c;来研究和分析目标VLAN的安全状况。该工具专为红队研究人员和安全学习爱好者设计&#xff0c;旨在训练网络工程师提升网络的安全性能&…

机器学习之数据预处理理论——基于表格数据分析

一、机器学习中数据预处理的作用与目的 对于机器学习而言&#xff0c;数据预处理是指在数据挖掘、数据分析、模型构建训练等过程中&#xff0c;对原始数据进行一系列的处理&#xff0c;以提高数据质量、减少噪声、提取有用信息等。数据预处理的主要目的是将原始数据转换为有用的…

如何写出好证明(支持思想的深入数学写作)

不断的修改和精炼是写作过程中的重要环节&#xff0c;数学写作最终目的是提供对问题的深刻洞察而非仅仅陈述细节。 根据harvey mudd college Francis Su教授的《GUIDELINES FOR GOOD MATHEMATICAL WRITING》讲稿&#xff0c;总结出撰写好的数学证明需要注意以下几个要点&#x…

中英双语介绍DeepSpeed 的 ZeRO 优化

DeepSpeed 的 ZeRO 优化&#xff1a;通俗易懂的原理与实践指南 引言 在深度学习的大规模模型训练中&#xff0c;显存瓶颈是常见的挑战。DeepSpeed 提供了革命性的 ZeRO (Zero Redundancy Optimizer) 优化技术&#xff0c;为大模型训练节省显存、提高效率提供了强有力的工具。…

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

文章目录 如何将 GitHub 私有仓库转换为公共仓库步骤 1: 登录 GitHub步骤 2: 导航到目标仓库步骤 3: 访问仓库设置步骤 4: 更改仓库可见性步骤 5: 确认更改步骤 6: 验证更改注意事项 如何将 GitHub 私有仓库转换为公共仓库 在软件开发领域&#xff0c;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的酒店管理系统&#xff0c;该系统采用Servlet、JSP、JDBC以及c3p0等技术构建&#xff0c;为酒店提供了一个全面的管理平台。该系统不仅适合酒店进行…

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

文章目录 1. 缺页异常的处理流程2.在何处保存未被映射的页&#xff1f;3. 虚拟内存性能 1. 缺页异常的处理流程 缺页中断的处理过程: CPU读内存单元&#xff0c;在TLB中根据其虚拟地址匹配物理地址&#xff0c;未命中&#xff0c;读页表; 由于页表项的存在位为0&#xff0c;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…