大模型-大模型训练框架-07

news/2024/11/7 15:55:33/文章来源:https://www.cnblogs.com/cavalier-chen/p/18532453

目录
  • 1. 训练框架概述
  • 2. 重点 Deepspeed框架介绍
  • 3. DeepSpeed框架实践
  • 4. debug
  • 5. 扩展

1. 训练框架概述


100亿 10^10 10B 参数量 是模型具备涌现能力的基本门槛

如何充分的利用显卡的能力 充分的使用显存
分布式训练框架对比
Megatron and DeepSpeed是目前主流的训练加速框架

训练框架地址:
Megatron-LM: https://github.com/NVIDIA/Megatron-LM
DeepSpeed: https://github.com/microsoft/DeepSpeed
mesh-tensorflow: https://github.com/tensorflow/mesh
fairscale: https://github.com/facebookresearch/fairscale

megatron - 英伟达
DeepSpeed - 微软

2. 重点 Deepspeed框架介绍

Deepspeed是由微软开发的一款开源深度学习优化库,旨在提高大规模模型训练的效率和可扩展性。该框架采用多种技术手段来加速训练,其中包括模型并行化、梯度累积、动态精度缩放、本地模式混合精度等。
Deepspeed还提供了一些辅助工具,如分布式训练管理、内存优化和模型压缩等,以帮助开发者更好地管理和优化大规模深度学习训练任务。该框架是基于PyTorch构建的,因此可以简单修改以便进行迁移使用。Deepspeed已经在许多大规模深度学习项目中得到了应用,包括语言模型、图像分类、目标检测等领域。在深度学习模型软件体系架构中,Deepspeed扮演着重要的角色。

Deepspeed软件架构主要分为三个部分:

  • APIs:提供简单易用的api接口,使用者只需要调用几个接口就能够完成模型训练和推理任务。
    其中最重要的接口是initialize,用于初始化引擎并配置训练参数和优化技术。配置参数通常保存在config.json文件中。

  • Runtime:运行时组件,是Deepspeed的核心组件,主要用于管理、执行和性能优化。该组件包括将训练任务部署到分布式设备、数据分区和模型分区、系统优化、微调、故障检测、checkpoints保存和加载等功能,并使用Python语言实现。

  • Ops 算子
    使用C++和CUDA优化计算和通信。此组件涵盖了许多关键技术。

Deepspeed是一款高效、可扩展的深度学习优化库,其中一些核心技术如下:

  • ZeRO(Zero Redundancy Optimizer)
    ZeRO是一种内存优化技术,用于大规模分布式深度学习。该技术可以消除数据并行进程中的内存冗余,通过在数据并行进程之间划分模型状态参数、梯度和优化器状态,而不是复制它们。此外,ZeRO还使用动态通信调度在分布式设备之间共享必要的状态,以保持数据并行的计算粒度和通信量。基于ZeRO,DeepSpeed实现了数据并行、流水线并行和张量切片模型并行等方式的训练,以提高显存和计算效率,并能够训练具有万亿个参数的模型。

  • 3D并行
    数据并行和模型并行可能会导致内存冗余,因此DeepSpeed采用基于ZeRO的3D并行来优化显存利用和计算效率。该技术将模型状态参数、梯度和优化器状态按照3D方式划分,并使用动态物理内存分配来减少内存占用。

  • 梯度累积
    DeepSpeed还使用梯度累积来提高批量大小,从而提高训练效率。梯度累积可以通过多次前向传递和反向传递来累积梯度,从而实现较大的批量大小。

3. DeepSpeed框架实践

DeepSpeed框架与ChatGLM微调模型相结合的实践案例

  1. 环境
conda install pytorch==1.12.0 \
torchvision==0.13.0 \
torchaudio==0.12.0 \
cudatoolkit=11.3 -c pytorchpip install deepspeed==0.8.1
sudo yum install openmpi-bin libopenmpi-dev
pip install mpi4py
  1. 下载模型
https://huggingface.co/THUDM/chatglm-6b/tree/main
  1. 准备训练样本
    训练数据通常由三个部分组成:prompt、response和history。
{"prompt": "什么事。\n[姓名]:张三\n[年龄]:45.0\n[性别]:男士\n[省份]:湖北","response": "打扰您了,给您介绍下近期的优惠活动?","history": [["","您好,请问是张先生吗?"],["是。","喂,您好,我这是您专属客服顾问。"]]
}    
  1. 代码准备
git clone https://github.com/THUDM/ChatGLM-6B.git
  1. 核心代码
import torch
import deepspeed
from torch.utils.data import RandomSampler, DataLoader
from torch.utils.data.distributed import DistributedSampler...# 一、初始化DeepSpeed引擎
model_engine, optimizer, _, _ = deepspeed.initialize(args=cmd_args,model=model,model_parameters=params)
# 二、分布式环境设置
deepspeed.init_distributed()....# 三、预加载模型和训练数据
model = ChatGLMForConditionalGeneration.from_pretrained(args.model_dir)
tokenizer = ChatGLMTokenizer.from_pretrained(args.model_dir)
# DataLoaders creation:
train_dataloader = DataLoader(train_dataset,batch_size=conf["train_micro_batch_size_per_gpu"],sampler=RandomSampler(train_dataset),collate_fn=coll_fn,drop_last=True,num_workers=0)....# 四、训练循环
for step, batch in enumerate(train_dataloader):#用于向前传播和损失计算loss = model_engine(batch)#向后传播model_engine.backward(loss)#优化器更新model_engine.step()
  1. 注意
    启动训练前需要配置机器之间免登、.deepspeed_env环境变量、调整训练参数

  2. 启动

cd ./ChatGLM-6B/ptuning/nohup deepspeed --hostfile=myhostfile --master_port 9000 main.py \--deepspeed deepspeed.json \--do_train \--train_file /data/train.json \--test_file /data/dev.json \--prompt_column prompt \--response_column response \--history_column history \--overwrite_cache \--model_name_or_path /data/pre_model/chatglm/chatglm-6b \--output_dir ./output/out-chatglm-6b-ft-le-4 \--overwrite_output_dir \--max_source_length 64 \--max_target_length 64 \--per_device_train_batch_size 4 \--per_device_eval_batch_size 1 \--gradient_accumulation_steps 1 \--predict_with_generate \--max_steps 50000 \--logging_steps 10 \--save_steps 10000 \--learning_rate $LR \--fp16 &
  1. 推理演示
pip install fastapi uvicorn
python api.py

调用

curl -X POST "http://127.0.0.1:8000" \-H 'Content-Type: application/json' \-d '{"prompt": "你好", "history": []}'

相应:

{"response":"你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。","history":[["你好","你好👋!我是人工智能助手 ChatGLM-6B,很高兴见到你,欢迎问我任何问题。"]],"status":200,"time":"2023-06-03 21:38:40"
}

4. debug

  1. 多机多卡跑不起来,多机间不能通信
Call to connect returned Connection refused, retrying

解决办法:deepspeed环境依赖问题,重新装pytorch依赖

conda install pytorch==1.12.0 \
torchvision==0.13.0 \
torchaudio==0.12.0 \
cudatoolkit=11.3 -c pytorch
  1. 使用官方ChatGLM-6B 代码训练的时候 loss不降不明显
    通过换为ChatGLM-Finetuning的训练框架,loss下降平稳
    git clone https://github.com/liucongg/ChatGLM-Finetuning.git

  2. ChatGLM-Finetuning官方代码采样器的时候用的是随机采样,导致8卡单机只能跑6卡;
    改源码,调整成支持对训练数据分布式采样

# 改成分布式采样
# DataLoaders creation:
if args.local_rank == -1:train_sampler = RandomSampler(train_dataset)
else:train_sampler = DistributedSampler(train_dataset)train_dataloader = DataLoader(train_dataset,batch_size=conf["train_micro_batch_size_per_gpu"],sampler=train_sampler,collate_fn=coll_fn,drop_last=True,num_workers=0)      
  1. 将代码改成支持分布式采样之后,分布式跑10万级训练数据没问题,扩大到100万级训练数据之后依旧只能跑6卡的问题
    训练100万级训练数据时,向量化数据需要4个小时左右,向量化后的数据占用内存在140G左右,默认情况下分布式训练每个进程都需要加载完整数据集,在当前单机8卡机器内存总共只有1T的情况下,最多只能使用6卡,有1/4的资源空闲。

解决方案:
改源码,重写dataset逻辑为:
1.均分完整数据集到所有进程;
2.训练时每个进程同一时间只加载单个分段大小(batch_size)数据集;
3.token转向量后的内存数据dump到文件,重新训练的时候加载向量化后的数据。
4.模型训练过程中,训练数据质量比较关键,扩充训练样本的特征提示,可以提升模型训练效果。
5.多机训练时,每台机器的训练代码和环境务必一致。

5. 扩展

ZeRO链接: https://zhuanlan.zhihu.com/p/618865052?utm_id=0

  1. Data Parallelism (DP)数据并行
    将模型复制到多个GPU设备,每张GPU当中都存放了一个复制的GPU版本。每个设备都可以并行接受输入的 data batches 。

特点:数据并行策略并不能节省总的训练内存,这是好理解的,因为在训练过程中,模型被分配到了每个 GPU 一份,这就意味着产生了很多额外的内存消耗。另外,如果模型本身的权重大小难以保存在一张 GPU 时。数据并行的算法将不能使用,无论你扩大自己的计算资源到 8张 还是 100张,都无法展开训练。
使用数据并行带来的好处在于,数据并行将极大提高训练速度,因为每个设备只需在总训练数据的一小部分上进行训练。不过,由于设备间梯度交换会带来通信开销,速度提升并不与设备数量成线性关系。

  1. Model Parallelism (MP)模型并行
    当模型自身参数量很大时,数据并行过程将无法使用,因此, Model Parallel (MP) 模型并行在这样的背景下应运而生,MP 算法不同于 DP 将模型复制到每个设备上,MP 选择将模型拆开,每个 GPU 设备只保存模型权重的一部分,在 forward 前向传递过程中,数据将依次通过各个设备,一个设备的输出作为另外一个设备的输入。

    特点:模型并行的优势在于面对参数量很大的模型,能够有效减少模型对显存的占用。
    缺点很明显,假设我们有三个 GPU 设备,数据并行会同时使用这三个 GPU 进行训练,而模型并行用这三个设备执行一次训练,带来的时间损耗很大。

  2. Pipeline Parallelism (PP)流水线并行
    将batch拆分micro-batches
    通过将每批输入数据拆分成若干较小的 "micro-batches",来减少设备的空闲时间。只有在整个模型处理完每个micro-batches后,才会更新模型参数,这意味着当其他设备仍在处理上一个 micro-batches 时,每个设备就可以开始处理下一个 micro-batches 。

    PyTorch 通过 torch.distributed.pipeline.sync.Pipe 类内置了对流水线并行性的支持。不过,该类的两个主要限制是:
    (1) 它只在模型作为 torch.nn.Sequential 模块实现时起作用;
    (2) 它要求每个模块的输入和输出要么是单个张量,要么是张量的元组

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

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

值班空岗睡岗识别智慧矿山一体机过路车辆识别视频智能监测功能解析

随着工业4.0的推进和智能化技术的飞速发展,矿山行业正面临着转型升级的关键时刻。传统的矿山作业方式存在诸多安全隐患和效率瓶颈,特别是在安全监控、设备维护和灾害预警等方面。为了提升矿山作业的安全性和效率,迫切需要一种集成化的智能化解决方案,以科技手段强化安全管理…

组合数学初步

组合数学初步 基本计数原理 加法原理:若完成一个事件 \(A\) 有 \(n\) 类方法,第 \(i\) 类有 \(s_i\) 种不同的方案,则完成事件 \(A\) 有 \(\sum^{n}_{i=1} s_i\) 种方案。 乘法原理:若完成一个事件 \(A\) 需要 \(n\) 步,第 \(i\) 步有 \(k_i\) 种不同的方式,则完成事件 \…

84_api_intro_stock_hk_stockhkindexhistory

港股指数历史行情数据 API 接口 所有港股指数历史交易行情数据,港指历史数据,支持日期范围筛选。1. 产品功能支持根据指数代码和日期范围查询港股指数历史交易数据 返回历史交易数据的日期、港股指数代码、开盘价、最高价、最低价和收盘价 毫秒级查询性能; 支持传递港股指数…

83_api_intro_stock_hk_stockhkindexrealtime

港股指数实时行情数据 API 接口 所有港股指数实时交易行情数据,港指实时数据,支持代码筛选。1. 产品功能支持所有港股指数实时交易数据查询; 包含港股实时交易多项指标数据; 毫秒级查询性能; 支持传递港股指数代码,筛选某一支港股指数的实时交易数据; 全接口支持 HTTPS(…

82_api_intro_websitetools_favicon

获取任意站点标题与图标 API 接口 解析站点的 title 与 favicon。1. 产品功能支持获取任意站点的标题和 favicon; 返回的 favicon 为站点链接; 全接口支持 HTTPS(TLS v1.0 / v1.1 / v1.2 / v1.3); 全面兼容 Apple ATS; 全国多节点 CDN 部署; 接口极速响应,多台服务器构…

算法网关视频分析网关车辆违停在安防项目中的应用及特点

一、行业背景 随着社会和经济的发展,公共安全和私人安全的需求都在不断增长。人们需要更高效、更准确的安防手段来保障生命财产安全,而人工智能技术正好可以提供这种可能、人工智能在安防领域有哪些应用? 据数据显示,预计2029年全球智能视频分析市场规模将达到71.7亿美元,…

38_api_intro_stock_cn_stockcnindexperminutes

A 股指数分时行情数据 API 数据接口 多维度分时指标,指数分时,多时间区间查询参数。1. 产品功能支持所有指数数据查询; 支持指数分时数据查询; 多时间维度分时数据; 多维度的统计时间以及数据结果; 秒级查询性能; 数据持续更新与维护; 全接口支持 HTTPS(TLS v1.0 / v1…

37_api_intro_stock_cn_stockcnindexhistory

A 股指数历史数据 API 数据接口 股指历史数据,支持指数列表获取,返回所有指数历史数据。1. 产品功能支持所有指数数据查询; 支持全量指数历史数据查询; 多维度的统计时间以及数据结果; 秒级查询性能; 数据持续更新与维护; 全接口支持 HTTPS(TLS v1.0 / v1.1 / v1.2 / v…

教你使用win10实现电脑的定时任务执行

制作定时任务: 步骤一、按下win+s 输入“任务计划程序”如下图: 提示:最好以管理员身份运行,避免任务无权限失败的情况。步骤二、进入到任务计划程序界面 可以看到很多以往程序设置的任务计划信息。 步骤三、新建一个任务文件夹,用来放入我们的自定义任务信息 这里我们取名…

33_api_intro_stock_cn_options

期权实时行情数据 API 数据接口 所有期权实时行情数据,期权实时数据,支持代码筛选。1. 产品功能支持所有期权实时行情数据查询; 包含期权实时行情交易多项指标数据; 毫秒级查询性能; 数据持续更新与维护; 全接口支持 HTTPS(TLS v1.0 / v1.1 / v1.2 / v1.3); 全面兼容 …

32_api_intro_stock_cn_kcb

科创板历史行情数据 API 接口 全量科创板历史行情,全量历史数据 / 支持代码筛选。1. 产品功能支持所有科创板历史交易数据查询; 包含科创板交易多项指标数据; 毫秒级查询性能; 全接口支持 HTTPS(TLS v1.0 / v1.1 / v1.2 / v1.3); 全面兼容 Apple ATS; 全国多节点 CDN 部…

31_api_intro_stock_cn_history

A 股历史行情数据 API 接口 所有A股历史交易行情数据,全量历史交易 / 包含前后复权数据。1. 产品功能支持所有 A 股全量历史(天)交易查询; 包含上交所和深交所所有股票数据; 每日 A 股收盘后更新当日交易数据,停牌不更新; 支持一次查询多个股票历史数据; 支持任意时间段…