DeepSpeed 配置文件(DeepSpeed Configuration Files)详解:中英文解释
中文版
本文详细介绍 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)。 - 调整:
- 若显存不足,减小值至
1e5或5e5。 - 如果通信瓶颈明显,可适当增大值。
- 若显存不足,减小值至
sub_group_size
- 含义:设置通信子组的参数分片大小。
- 默认值:
1e8(即 100 MB)。 - 调整:
- 小模型:
5e5或更低。 - 大模型:可根据显存容量调试,通常
1e6至1e7。
- 小模型:
gradient_accumulation_steps
- 含义:设置梯度累积步数,减少单步的显存压力。
- 建议:逐步增加值(如从
4到8),但需注意总批量大小的变化。
train_micro_batch_size_per_gpu
- 含义:每张 GPU 的微批量大小。
- 建议:在显存不足时减小,如从
4降为1。
gradient_clipping
- 含义:限制梯度范数,防止梯度爆炸。
- 推荐值:
1.0。
3. 针对 4 卡 3090 的优化建议
-
显存不足问题解决方法:
- 减小
reduce_bucket_size和sub_group_size:"reduce_bucket_size": 1e5, "sub_group_size": 5e5 - 降低
train_micro_batch_size_per_gpu:"train_micro_batch_size_per_gpu": 1 - 增大
gradient_accumulation_steps:"gradient_accumulation_steps": 8 - 禁用
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
falseif 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.
- Smaller values (e.g.,
(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
5e5or lower for better memory efficiency.
- Default: A large value (e.g.,
(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.
- Recommendation: Start with a small value (e.g.,
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
1and only increase if memory allows.
(2) Lower reduce_bucket_size and sub_group_size
- Decrease both to
1e5or5e4. 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
bf16for 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: truein 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大模型。
相关文章:
DeepSpeed 配置文件(DeepSpeed Configuration Files)详解:中英文解释
中文版 本文详细介绍 DeepSpeed 配置文件,结合 4 卡 3090 的实际使用场景,重点解释各个参数的含义,并提供应对爆显存的方案。 DeepSpeed 配置文件详解:从基础到实战 DeepSpeed 是用于加速大规模分布式训练的重要工具,…...
前端JavaScript(一)---基本介绍
Javascript是一种由Netscape(网景)的LiveScript发展而来的原型化继承的面向对象的动态类型的区分大小写的客户端脚本语言,主要目的是为了解决服务器端语言,比如Perl,遗留的速度问题,为客户提供更流畅的浏览效果。当时服务端需要对…...
文本处理之sed
1、概述 sed是文本编辑器,作用是对文本的内容进行增删改查。 和vim不一样,sed是按行进行处理。 sed一次处理一行内容,处理完一行之后紧接着处理下一行,一直到文件的末尾 模式空间:临时储存,修改的结果临…...
uniapp在App端定义全局弹窗,当打开关闭弹窗会触发onShow、onHide生命周期怎么解决?
在uniapp(App端)中实现自定义弹框,可以通过创建一个透明页面来实现。点击进入当前页面时,页面背景会变透明,用户可以根据自己的需求进行自定义,最终效果类似于弹框。 遇到问题:当打开弹窗(进入弹窗页面)就会触发当前页…...
计算机网络 实验七 NAT配置实验
一、实验目的 通过本实验理解网络地址转换的原理和技术,掌握扩展NAT/NAPT设计、配置和测试。 二、实验原理 NAT配置实验的原理主要基于网络地址转换(NAT)技术,该技术用于将内部私有网络地址转换为外部公有网络地址,从…...
数据结构——排序算法第二幕(交换排序:冒泡排序、快速排序(三种版本) 归并排序:归并排序(分治))超详细!!!!
文章目录 前言一、交换排序1.1 冒泡排序1.2 快速排序1.2.1 hoare版本 快排1.2.2 挖坑法 快排1.2.3 lomuto前后指针 快排 二、归并排序总结 前言 继上篇学习了排序的前面两个部分:直接插入排序和选择排序 今天我们来学习排序中常用的交换排序以及非常稳定的归并排序 快排可是有多…...
【kafka04】消息队列与微服务之Kafka 图形工具
Kafka 在 ZooKeeper 里面的存储结构 topic 结构 /brokers/topics/[topic] partition结构 /brokers/topics/[topic]/partitions/[partitionId]/state broker信息 /brokers/ids/[o...N] 控制器 /controller 存储center controller中央控制器所在kafka broker的信息 消费者 /c…...
剖析前后端 API 接口参数设计:JSON 数据结构化全攻略
在当今软件开发领域,前后端分离架构已成为主流趋势。而 API 接口作为前后端之间数据交互的桥梁,其设计的合理性对系统的可维护性和扩展性起着至关重要的作用。JSON(JavaScript Object Notation)作为一种轻量级的数据交换格式&…...
vue3 多种方式接受props,定义ref,reactive
定义props 1 第一种 interface AddType { dialogStudyVisible: boolean; } const props defineProps<AddType>(); 第二种 // const props defineProps({ // dialogStudyVisible:{ // type:Boolean, // default:false // } // }) 第三种 // const …...
逻辑处理器核心指纹修改
navigator.hardwareConcurrency的属性,可以用来获取CPU的逻辑处理器核心数。 1、navigator.hardwareConcurrency接口定义: third_party\blink\renderer\core\frame\navigator_concurrent_hardware.idl // https://html.spec.whatwg.org/C/#navigator.hardwarecon…...
如何制作项目网页
一、背景 许多论文里经常会有这样一句话Supplementary material can be found at https://hri-eu.github.io/Lami/,这个就是将论文中的内容或者补充视频放到一个网页上,以更好的展示他们的工作。因此,这里介绍下如何使用前人提供的模板制作我…...
mongodb/redis/neo4j 如何自己打造一个 web 数据库可视化客户端?
随笔 从千万粉丝“何同学”抄袭开源项目说起,为何纯技术死路一条? 数据源的统一与拆分 监控报警系统的指标、规则与执行闭环 我们的系统应该配置哪些监控报警项? 监控报警系统如何实现自监控? java 老矣,尚能饭否ÿ…...
1、正则表达式
grep匹配 grep用来过滤文本内容,以匹配要查询的结果。 grep root /etc/passwd:匹配包含root的行 -m 数字:匹配几次后停止 -v:取反-i:忽略字符的大小写,默认的,可以不加-n:…...
Airsim安装问题:This project was made with a different version of the Unreal Engine.
本文记录如何在 Ubuntu 18.04 系统中配置 AirSim 和 Unreal Engine 4.27,并成功打开默认的 Blocks 环境项目。 环境说明 系统:Ubuntu 18.04Unreal Engine 版本:4.27AirSim:主分支文件路径: Unreal Engine:…...
java八股-分布式服务的接口幂等性如何设计?
文章目录 接口幂等token Redis分布式锁 原文视频链接:讲解的流程特别清晰,易懂,收获巨大 【新版Java面试专题视频教程,java八股文面试全套真题深度详解(含大厂高频面试真题)】 https://www.bilibili.com/…...
vscode python code runner执行乱码
打开vscode code runner插件配置,如图所示: 然后在setting.json修改运行python的默认命令: 将原来 替换成 "python":"set PYTHONIOENCODINGutf8 && python", 参考:Vscode——python环境输出中文乱…...
Java中的继承详解
在Java编程中,继承(Inheritance)是一种面向对象编程(OOP)的核心概念,它允许一个类(称为子类或派生类)继承另一个类(称为父类或基类)的属性和方法。通过继承&a…...
kafka进阶_2.存储消息
文章目录 一、存储消息介绍二、副本同步2.1、数据一致性2.2、HW在副本之间的传递 如果想了解kafka基础架构和生产者架构可以参考 kafka基础和 Kafka进阶_1.生产消息。 一、存储消息介绍 数据已经由生产者Producer发送给Kafka集群,当Kafka接收到数据后,…...
如何启用本机GPU硬件加速猿大师播放器网页同时播放多路RTSP H.265 1080P高清摄像头RTSP视频流?
目前市面上主流播放RTSP视频流的方式是用服务器转码方案,这种方案的好处是兼容性更强,可以用于不同的平台,比如:Windows、Linux或者手机端,但是缺点也很明显:延迟高、播放高清或者同时播放多路视频视频容易…...
如何更好地设计SaaS系统架构
SaaS(Software as a Service)架构设计的核心目标是满足多租户需求、支持弹性扩展和高性能,同时保持低成本和高可靠性。一个成功的SaaS系统需要兼顾技术架构、资源利用、用户体验和商业目标。本文从以下几个方面探讨如何更好地设计SaaS系统架构…...
day52 ResNet18 CBAM
在深度学习的旅程中,我们不断探索如何提升模型的性能。今天,我将分享我在 ResNet18 模型中插入 CBAM(Convolutional Block Attention Module)模块,并采用分阶段微调策略的实践过程。通过这个过程,我不仅提升…...
Qwen3-Embedding-0.6B深度解析:多语言语义检索的轻量级利器
第一章 引言:语义表示的新时代挑战与Qwen3的破局之路 1.1 文本嵌入的核心价值与技术演进 在人工智能领域,文本嵌入技术如同连接自然语言与机器理解的“神经突触”——它将人类语言转化为计算机可计算的语义向量,支撑着搜索引擎、推荐系统、…...
AGain DB和倍数增益的关系
我在设置一款索尼CMOS芯片时,Again增益0db变化为6DB,画面的变化只有2倍DN的增益,比如10变为20。 这与dB和线性增益的关系以及传感器处理流程有关。以下是具体原因分析: 1. dB与线性增益的换算关系 6dB对应的理论线性增益应为&…...
NPOI Excel用OLE对象的形式插入文件附件以及插入图片
static void Main(string[] args) {XlsWithObjData();Console.WriteLine("输出完成"); }static void XlsWithObjData() {// 创建工作簿和单元格,只有HSSFWorkbook,XSSFWorkbook不可以HSSFWorkbook workbook new HSSFWorkbook();HSSFSheet sheet (HSSFSheet)workboo…...
【LeetCode】算法详解#6 ---除自身以外数组的乘积
1.题目介绍 给定一个整数数组 nums,返回 数组 answer ,其中 answer[i] 等于 nums 中除 nums[i] 之外其余各元素的乘积 。 题目数据 保证 数组 nums之中任意元素的全部前缀元素和后缀的乘积都在 32 位 整数范围内。 请 不要使用除法,且在 O…...
MyBatis中关于缓存的理解
MyBatis缓存 MyBatis系统当中默认定义两级缓存:一级缓存、二级缓存 默认情况下,只有一级缓存开启(sqlSession级别的缓存)二级缓存需要手动开启配置,需要局域namespace级别的缓存 一级缓存(本地缓存&#…...
Python 高级应用10:在python 大型项目中 FastAPI 和 Django 的相互配合
无论是python,或者java 的大型项目中,都会涉及到 自身平台微服务之间的相互调用,以及和第三发平台的 接口对接,那在python 中是怎么实现的呢? 在 Python Web 开发中,FastAPI 和 Django 是两个重要但定位不…...
C++ 类基础:封装、继承、多态与多线程模板实现
前言 C 是一门强大的面向对象编程语言,而类(Class)作为其核心特性之一,是理解和使用 C 的关键。本文将深入探讨 C 类的基本特性,包括封装、继承和多态,同时讨论类中的权限控制,并展示如何使用类…...
基于谷歌ADK的 智能产品推荐系统(2): 模块功能详解
在我的上一篇博客:基于谷歌ADK的 智能产品推荐系统(1): 功能简介-CSDN博客 中我们介绍了个性化购物 Agent 项目,该项目展示了一个强大的框架,旨在模拟和实现在线购物环境中的智能导购。它不仅仅是一个简单的聊天机器人,更是一个集…...
【Zephyr 系列 16】构建 BLE + LoRa 协同通信系统:网关转发与混合调度实战
🧠关键词:Zephyr、BLE、LoRa、混合通信、事件驱动、网关中继、低功耗调度 📌面向读者:希望将 BLE 和 LoRa 结合应用于资产追踪、环境监测、远程数据采集等场景的开发者 📊篇幅预计:5300+ 字 🧭 背景与需求 在许多 IoT 项目中,单一通信方式往往难以兼顾近场数据采集…...
