目录
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微调模型相结合的实践案例
- 环境
conda install pytorch==1.12.0 \
torchvision==0.13.0 \
torchaudio==0.12.0 \
cudatoolkit=11.3 -c pytorch
pip install deepspeed==0.8.1
sudo yum install openmpi-bin libopenmpi-dev
pip install mpi4py
- 下载模型
https://huggingface.co/THUDM/chatglm-6b/tree/main
- 准备训练样本
训练数据通常由三个部分组成:prompt、response和history。
{
"prompt": "什么事。\n[姓名]:张三\n[年龄]:45.0\n[性别]:男士\n[省份]:湖北",
"response": "打扰您了,给您介绍下近期的优惠活动?",
"history": [
[
"",
"您好,请问是张先生吗?"
],
[
"是。",
"喂,您好,我这是您专属客服顾问。"
]
]
}
- 代码准备
git clone https://github.com/THUDM/ChatGLM-6B.git
- 核心代码
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()
-
注意
启动训练前需要配置机器之间免登、.deepspeed_env环境变量、调整训练参数 -
启动
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 &
- 推理演示
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":"你好
标签:07,训练,--,模型,并行,框架,train,model
From: https://www.cnblogs.com/cavalier-chen/p/18532453