deepspeed入门

一、目录

  1. deepspeed 简介
  2. 库安装配置
  3. deepspeed 实现demo
  4. 如何配置deepspeed参数
  5. 案例分析

二、实现

  1. deepspeed 简介
    Deepspeed是微软的大规模分布式训练工具。专门用于训练超大模型。主要目标是降低训练期间的内存占用、通信开销和计算负载,从而使用户能够训练更大的模型并更高效地利用硬件资源。

增加的功能主要有:

  1. Zero:零冗余优化,减少模型的内存占用,让模型可以在显卡上训练,内存占用主要分为Model States和Activation两个部分,Zero主要解决的是Model States的内存占用问题。
  2. Zero offload:零卸载,将训练阶段的某些模型状态放(offload)到内存以及CPU计算。
  3. 混合精度:混合精度训练是指在训练过程中同时使用FP16(半精度浮点数)和FP32(单精度浮点数)两种精度的技术。使用FP16可以大大减少内存占用,从而可以训练更大规模的模型
    Deepspeed 与torchrun 的区别: deepspeed 包含ZeRO零冗余优化器,模型并行、数据并行、混合。
    torchrun 为数据、模型 并行训练。

2.库安装配置
1. pip install deepspeed 。 (直接查看是否存在ds_report, 有的环境不需要配置)
2. 到pyhton 安装目录 python/bin 中查看 ds_report .
3. 建立软连接:

ln -s /usr/local/python3/bin/ds_report /usr/bin/ds_report
ln -s /usr/local/python3/bin/deepspeed /usr/bin/deepspeed

配置教程端口:
https://huggingface.co/docs/transformers/v4.26.1/en/main_classes/deepspeed
https://www.deepspeed.ai/docs/config-json/#fp16-training-options

  1. deepspeed 实现demo
    1. 初始化引擎。初始化分布式环境、分布式数据并行、混合精度训练设置等。可以根据配置文件参数构建和管理训练优化器、数据加载器和学习率调度器。
#Construct distributed model
model= BertMultiTask()
# Construct FP16 optimizer
model, optimizer, _ ,_=deepspeed.initialize(
        args=args, 
        model=model,
        model_parameters=model_parameters)
  1. 训练。引擎初始化后,即可通过3个api训练模型,用于前向传播、后向传播和权重更新。
#Construct distributed model
model= BertMultiTask()
…..
# Construct FP16 optimizer
model_engine, optimizer, _ ,_=deepspeed.initialize(
        args=args,
        model=model,
        model_parameters=model_parameters)
for step,batch in enumerate(data_loader):
    # Forward pass
    loss = model_engine(batch)     #前向传播
    # Backward pass             
    model_engine.backward(loss)      #反向传播
    # weight update
    model_engine.step()               #参数更新
  1. 启动训练程序
    训练过程中的配置参数,可以通过配置文件configjson文件决定某个功能是否启用,如下图中,设置batch_size大校,梯度累积的步数、优化器类型、学习率、训练精度、是否使用零冗余优化等。在这里插入图片描述 1. 使用单节点(一台服务器)启动,如指定gpu worker-2, 0卡和1 卡。
deepspeed --include="worker-2:0,1" train.py --deepspeed --deepspeed_config ds_config.json

1.1 deepspeed 与trainer 接口结合时,可以将配置文件配置到trainer 参数上,启动可为:

export NCCL_IB_DISABLE=1; export NCCL_P2P_DISABLE=1; NCCL_DEBUG=INFO deepspeed --include=localhost:0,1 test1.py>output.log 2>&1 &
#日志打印到文件夹
#NCCL_DEBUG :从NCCL显示的调试信息
#NCCL_IB_DISABLE: 是否关闭IB通信   设置成1来启用TCP通信,一般需要设置成0或者默认不动
# NCCL_P2P_DISABLE=1 : p2p通信,为1时禁用。
  1. 如何配置deepspeed参数
    在这里插入图片描述
    4.1 deepspeed 配置主要包括:精度配置模块,优化器模块、零冗余优化器模块、预热调度器模块、batch_size/梯度等模块。
    1 混合精度配置模块对应:“fp16”:{} 部分。 核心 (对应混合精度训练)
    2 优化器配置模块对应:“optimizer”:{}。
    3 零冗余优化器模块对应:“zero_optimization”:{}。 核心:对应ZeRO 技术, 内含 ZeRO-Offload、ZeRO-Infinity。
    4 预热调度器模块:“scheduler”:{}。
    5 其他配置。

    4.2 如何旋转ZeRO冗余优化器模块:在这里插入图片描述 总结:
    1. ZeRO-1、ZeRO-2和ZeRO-3是递进的优化级别,每个级别都在前一个级别的基础上减少更多的内存冗余。
    2. ZeRO-1主要优化优化器的存储,ZeRO-2进一步优化模型参数和优化器状态的存储,而ZeRO-3还包括对激活的优化。
    3. 随着优化级别的提高,能够支持的模型大小也随之增加,但同时对集群的通信和计算能力要求也更高。
    4. 如果其他配置相同,ZeRO-3 可能会比 ZeRO-2 慢,因为除了 ZeRO-2 之外,前者还必须收集模型权重。如果 ZeRO-2 满足您的需求,并且您不需要扩展到几个 GPU 之外,那么您可以选择坚持使用它。重要的是要了解,ZeRO-3 以速度为代价实现了更高的可扩展性。

    速度方面(左边比右边快)
    阶段 0 (DDP) > 阶段 1 > 阶段 2 > 阶段 2 + 卸载 > 阶段 3 > 阶段 3 + 卸载
    GPU 内存使用情况(右侧的 GPU 内存效率高于左侧)
    阶段 0 (DDP) < 阶段 1 < 阶段 2 < 阶段 2 + 卸载 < 阶段 3 < 阶段 3 + 卸载

首先将批量大小设置为 1(您始终可以使用梯度累积来获得任何所需的有效批量大小)。

启用--gradient_checkpointing 1(HF Trainer)或直接model.gradient_checkpointing_enable()- 如果 OOM 那么

首先尝试 ZeRO 第 2 阶段。如果 OOM 那么

尝试 ZeRO 阶段 2 + offload_optimizer- 如果 OOM 那么

切换到 ZeRO 阶段 3 - 如果 OOM 那么

启用offload_param-cpu如果 OOM 那么

启用offload_optimizer-cpu

4.3. 参数详解
每个模块可参考配置文档:DeepSpeed Integration (huggingface.co)

{
  "optimizer": {         #优化器配置模块
        "type": "Adam",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },
  "fp16": {                    #精度配置模块,此处选择float16
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },
  "zero_optimization": {          #零冗余配置
    "stage": 3,                   #zero-3 技术
    "offload_optimizer": {        #内存溢出,将优化器参数卸载到cpu中。        
        "device": "cpu",
        "pin_memory": true
    },
    "offload_param": {                #内存溢出,将模型参数卸载到cpu中。
        "device": "cpu",
        "pin_memory": true
    },
    "overlap_comm": true,                        #性能微调参数
    "contiguous_gradients": true,
    "sub_group_size": 1e9,
    "reduce_bucket_size": "auto",
    "stage3_prefetch_bucket_size": "auto",
    "stage3_param_persistence_threshold": "auto",
    "stage3_max_live_parameters": 1e9,
    "stage3_max_reuse_distance": 1e9,
    "stage3_gather_16bit_weights_on_model_save": true
  },
  "scheduler": {                              #预热调度器配置
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },
   "gradient_accumulation_steps": "auto",          #梯度累积
    "gradient_clipping": "auto",                   #梯度截断
    "steps_per_print": 200,
    "train_batch_size": "auto",                     #batch
    "train_micro_batch_size_per_gpu": "auto",       #每个gpu训练batch_size
    "wall_clock_breakdown": false,
}
  1. 案例分析
    案例1: firefly 框架 ds_z3配置,采用zero-3, fp16精度。
  "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 200,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false,

  "optimizer": {
        "type": "Adam",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },
  "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },
  "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": "auto",
    "stage3_prefetch_bucket_size": "auto",
    "stage3_param_persistence_threshold": "auto",
    "stage3_max_live_parameters": 1e9,
    "stage3_max_reuse_distance": 1e9,
    "stage3_gather_16bit_weights_on_model_save": true
  },
  "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    }
}

案例2: chatglm3 采用zero-3与bf16。

{
  "train_micro_batch_size_per_gpu": "auto",
  "zero_allow_untested_optimizer": true,
  "bf16": {
    "enabled": "auto"
  },
  "optimizer": {
    "type": "AdamW",
    "params": {
      "lr": "auto",
      "betas": "auto",
      "eps": "auto",
      "weight_decay": "auto"
    }
  },
  "zero_optimization": {
    "stage": 3,
    "allgather_partitions": true,              #每个step 结束时,收集gpus 更新后的参数
    "allgather_bucket_size": 5e8,              #搜集元素的数量,将张量分成较小的桶有助于在通信中更高效的传输数据。这个值越大,每个桶的大小就越大,通信操作可能会变得更快。
    "reduce_scatter": true,                     #平均梯度
    "contiguous_gradients": true,                 #默认为True
    "overlap_comm": true,                      #推荐设置为True,deepspeed将在梯度计算时尝试并执行梯度通信。可以有效的减少通信时间,从而加速整个训练过程。
    "sub_group_size": 1e9,                    #控制在优化器步骤中参数更新的粒度。当出现omm时,减小该值;当优化器迭代较缓慢时,也可以考虑增大该值,默认值是1e9
    "reduce_bucket_size": "auto",             
    "stage3_prefetch_bucket_size": "auto",     #预取参数的固定缓冲区大小。较小的值使用的内存较少,但也可能会因为通信而增加停顿。默认值是5e8。        
    "stage3_param_persistence_threshold": "auto",
    "stage3_max_live_parameters": 1e9,       #保留在gpu上的完整参数数量的上限。默认值是1e9
    "stage3_max_reuse_distance": 1e9,         #根据参数在未来何时再次使用的指标来决定是舍弃还是保留参数。如遇omm,可减小stages_max_live_parameters和stages_max_reuse_distance           
    "stage3_gather_16bit_weights_on_model_save": true    #在保存模型时启用模型fp16权重合
  }
}

案例3,qwen1.5 ,采用bf16与fp16混合精度 zero-3 训练

{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },
    "bf16": {
        "enabled": "auto"
    },
    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 3,
        "offload_optimizer": {
            "device": "none",
            "pin_memory": true
        },
        "offload_param": {
            "device": "none",
            "pin_memory": true
        },
        "overlap_comm": true,
        "contiguous_gradients": true,
        "sub_group_size": 1e9,
        "reduce_bucket_size": "auto",
        "stage3_prefetch_bucket_size": "auto",
        "stage3_param_persistence_threshold": "auto",
        "stage3_max_live_parameters": 1e9,
        "stage3_max_reuse_distance": 1e9,
        "stage3_gather_16bit_weights_on_model_save": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 100,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}
{
    "fp16": {
        "enabled": "auto",
        "loss_scale": 0,
        "loss_scale_window": 1000,
        "initial_scale_power": 16,
        "hysteresis": 2,
        "min_loss_scale": 1
    },
    "bf16": {
        "enabled": "auto"
    },
    "optimizer": {
        "type": "AdamW",
        "params": {
            "lr": "auto",
            "betas": "auto",
            "eps": "auto",
            "weight_decay": "auto"
        }
    },

    "scheduler": {
        "type": "WarmupLR",
        "params": {
            "warmup_min_lr": "auto",
            "warmup_max_lr": "auto",
            "warmup_num_steps": "auto"
        }
    },

    "zero_optimization": {
        "stage": 2,
        "offload_optimizer": {
            "device": "none",
            "pin_memory": true
        },
        "allgather_partitions": true,
        "allgather_bucket_size": 2e8,
        "overlap_comm": true,
        "reduce_scatter": true,
        "reduce_bucket_size": 2e8,
        "contiguous_gradients": true
    },

    "gradient_accumulation_steps": "auto",
    "gradient_clipping": "auto",
    "steps_per_print": 100,
    "train_batch_size": "auto",
    "train_micro_batch_size_per_gpu": "auto",
    "wall_clock_breakdown": false
}

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

如若内容造成侵权/违法违规/事实不符,请联系我们进行投诉反馈qq邮箱809451989@qq.com,一经查实,立即删除!

相关文章

上班不想用脑子写代码了怎么办?那就试试Baidu Comate啊宝贝

本文目录 前言1、视频编程实战1.1、熟悉代码库中的代码1.2、参考现有代码编写新代码 2、下载使用教程3、使用体验3.1、AutoWork 产品测评3.2、解决有关ajax请求后重定向问题3.3、询问编程相关知识3.3.1、cookie和session的区别与联系3.3.2、数据库中主键外键的相关知识 4、问题…

ARTS Week 26

Algorithm 本周的算法题为 35. 搜索插入位置 给定一个排序数组和一个目标值&#xff0c;在数组中找到目标值&#xff0c;并返回其索引。如果目标值不存在于数组中&#xff0c;返回它将会被按顺序插入的位置。 请必须使用时间复杂度为 O(log n) 的算法。 示例 1:输入: nums [1,…

基于MSOGI的交叉对消谐波信号提取网络MATLAB仿真

微❤关注“电气仔推送”获得资料&#xff08;专享优惠&#xff09; 模型简介&#xff1a; 此模型利用二阶广义积分器&#xff08;SOGI&#xff09;对基波电流和相应次的谐波电流进行取 &#xff0c;具体是通过多个基于二阶广义积分器的正交信号发生器 &#xff08; S&#xf…

python魔法方法是什么

魔法方法是python内置方法&#xff0c;不需要主动调用&#xff0c;存在的目的是为了给python的解释器进行调用&#xff0c;几乎每个魔法方法都有一个对应的内置函数&#xff0c;或者运算符&#xff0c;当我们对这个对象使用这些函数或者运算符时就会调用类中的对应魔法方法&…

可视化-实验四- seaborn工具包绘图基础及关系

一、任务一 1.1 开发环境 多种选择方案&#xff08;大家根据自己的编程习惯&#xff0c;选择适合自己的工具&#xff09;&#xff0c;老师授课如下&#xff1a;Anaconda3Jupter 1.2 特殊包 导入工具包设置中文显示&#xff1a; import matplotlib.pyplot as plt import p…

在做ESP32-S3模组物联网项目时无法烧录下载怎么排查原因?分享经验

ESP32-S3模组在物联网中非常好用&#xff0c;可以做带屏小音箱、温控器、智能86盒、泳池清洁机器人等等&#xff0c;在烧录的时候经常会遇到一些问题&#xff0c;这里分享一些烧录失败的原因或者烧录遇到的问题&#xff0c;教大家怎么排查原因&#xff0c;希望能帮到大家&#…

参数化建模系列-cityengine篇之:如何基于GIS数据快速构建道路三维建模模型

结合上期介绍的基于GIS数据自动化构建城市三维建筑模型&#xff0c;本期在上期的知识点上继续介绍道路模型的自动化构建方法。 数据获取 本期道路自动化建模从获取道路数据开始。 首先打开“QuickOSM”插件&#xff0c;在“Key”中选择“highway”&#xff1b;其次选择数据范…

Python程序设计 函数(三)

练习十一 函数 第1关&#xff1a; 一元二次方程的根 定义一个函数qg&#xff0c;输入一元二次方程的系数a,b,c 当判别式大于0&#xff0c;返回1和两个根 当判别式等于0&#xff0c;返回0和两个根 当判别式小于0&#xff0c;访问-1和两个根 在主程序中&#xff0c;根据函数返回…

数据结构(四)—— 堆和二叉树(上)

制作不易&#xff0c;三连支持一下呗&#xff01;&#xff01;&#xff01; 文章目录 前言一、树的概念及结构二、二叉树的概念及结构总结 前言 这篇博客我们将进行更加复杂的一种数据结构的学习——树形结构。 一、树的概念及结构 树是一种非线性的数据结构&#xff0c;它是…

如何把多个文件(夹)平均复制到多个文件夹中

首先&#xff0c;需要用到的这个工具&#xff1a; 度娘网盘 提取码&#xff1a;qwu2 蓝奏云 提取码&#xff1a;2r1z 假定的情况是&#xff0c;共有20个兔兔的图片&#xff0c;想要平均的复制4个文件夹里&#xff0c;那么每个文件夹里面就有5个图片 &#xff08;如果是5个&a…

一般产品:功能、质量、结构

**一般产品&#xff1a;**功能、质量、结构 通用工程&#xff1a; 收益-风险&#xff1b;过程-结果&#xff1b;少数-多数 风险 vs 收益 过程 vs 结果 少数 vs 多数 工程师的特点&#xff1a; 人道无害雇主实事求是&#xff0c;恪守公心&#xff0c;严守纪律&#xff0c;…

信创 | 信创基础设施建设:国内外对比分析研究

信创基础设施建设在国内外的比较分析涉及到多个方面&#xff0c;包括政策支持、产业发展现状、技术进步、市场应用等。通过综合分析&#xff0c;我们可以得出以下结论&#xff1a; 政策支持与发展方向&#xff1a;中国自2019年以来&#xff0c;陆续出台了一系列政策支持信创产业…

RS485空调系统到BACnet江森楼宇系统的高效整合攻略

智慧城市的每一栋建筑都在追求更高的能效与更佳的居住体验&#xff0c;而这一切的实现离不开强大且灵活的楼宇自动化系统。其中&#xff0c;协议转换网关作为连接不同设备的纽带&#xff0c;扮演着至关重要的角色。本文将以一个典型的商业综合体为例&#xff0c;揭秘BACnet协议…

北交所佣金费率标准是多少?北交所相关信息科普

北交所的佣金费率并非固定不变&#xff0c;而是可以根据投资者的需求和证券公司的政策进行调整。目前北交所的佣金费率最低是万分之二。 一般来说&#xff0c;北交所的佣金费率默认在万分之三左右&#xff0c;但这不是固定的费率。根据证券公司的不同&#xff0c;佣金费率可以…

语义分割——前列腺分割数据集

引言 亲爱的读者们&#xff0c;您是否在寻找某个特定的数据集&#xff0c;用于研究或项目实践&#xff1f;欢迎您在评论区留言&#xff0c;或者通过公众号私信告诉我&#xff0c;您想要的数据集的类型主题。小编会竭尽全力为您寻找&#xff0c;并在找到后第一时间与您分享。 …

微服务学习笔记

微服务学习笔记 文章目录 微服务学习笔记认识微服务微服务技术栈微服务学习要点微服务远程调用1)注册RestTemplate2) 服务远程调用RestTemplate Eureka注册中心简介操作过程搭建EurekaServer注册user-service在order-service完成服务拉取 Ribbon负载均衡IRule负载均衡策略饥饿加…

Electron学习笔记(二)

文章目录 相关笔记笔记说明 三、引入现代前端框架1、配置 webpack&#xff08;1&#xff09;安装 webpack 和 electron-webpack&#xff1a;&#xff08;2&#xff09;自定义入口页面 2、引入 Vue&#xff08;1&#xff09;安装 Vue CLI &#xff08;2&#xff09;调试配置 -- …

【Micropython Pitaya Lite教程】烧录固件

文章目录 前言一、编译固件源码二、烧录固件总结 前言 MicroPython是一种精简的Python 3解释器&#xff0c;可以在微控制器和嵌入式系统上运行。Pitaya Lite是一款基于ESP32的微控制器开发板&#xff0c;它结合了低功耗、Wi-Fi和蓝牙功能。结合MicroPython和Pitaya Lite&#…

Python AI库pandas读写数据库的应用操作——以sqlite3为例

Python AI库pandas读写数据库的应用操作——以sqlite3为例 本文默认读者具备以下技能&#xff1a; 熟悉python基础知识&#xff0c;vscode或其它编辑工具 已阅读Pandas基础操作文章,了解pandas常见操作 具备自主扩展学习能力 在数据分析和人工智能领域&#xff0c;pandas库和s…

Ruby中的字符串转换方法

在Ruby中&#xff0c;你可以使用各种方法来转换字符串。下面是一些常用的方法&#xff0c;当然选择哪种适用的方法还得更具具体项目来做调整。日常使用中下面的错误也是比较常见的&#xff0c;看看我们怎么处理哈。 1、问题背景 在Python中&#xff0c;内置的数据结构都有一个…