pytorch单精度、半精度、混合精度、单卡、多卡(DP / DDP)、FSDP、DeepSpeed模型训练

本文主要是介绍pytorch单精度、半精度、混合精度、单卡、多卡(DP / DDP)、FSDP、DeepSpeed模型训练,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

pytorch单精度、半精度、混合精度、单卡、多卡(DP / DDP)、FSDP、DeepSpeed模型训练、模型保存、模型推理、onnx导出、onnxruntime推理等示例代码,并对比不同方法的训练速度以及GPU内存的使用。

代码:pytorch_model_train


FairScale(你真的需要FSDP、DeepSpeed吗?)

在了解各种训练方式之前,先来看一下 FairScale 给出的一个模型训练方式选择的流程,选择适合自己的方式,就是最好的。

在这里插入图片描述


训练环境设置

  • 模型:预训练的Resnet50
  • 数据集:Cifar10
  • 硬件资源:一台4卡Tesla P40
  • 训练设置:5 epoch、128 batch size
  • 观察指标:显存占用、GPU使用率、训练时长、模型训练结果

备注:

  1. 由于P40硬件限制,不支持半精度fp16的训练,在fp16条件下训练的速度会受到影
  2. ResNet50模型较小,batch_size=1时单卡仅占用 0.34G显存,绝大部分显存都被输入数据,以及中间激活占用

测试基准(batch_size=1)

  • 单卡显存占用:0.34 G
  • 单卡GPU使用率峰值:60%

单卡单精度训练

  • 代码文件:pytorch_SingleGPU.py
  • 单卡显存占用:11.24 G
  • 单卡GPU使用率峰值:100%
  • 训练时长(5 epoch):1979 s
  • 训练结果:准确率85%左右

在这里插入图片描述


单卡半精度训练

  • 代码文件:pytorch_half_precision.py
  • 单卡显存占用:5.79 G
  • 单卡GPU使用率峰值:100%
  • 训练时长(5 epoch):1946 s
  • 训练结果:准确率75%左右

在这里插入图片描述

备注: 单卡半精度训练的准确率只有75%,单精度的准确率在85%左右


单卡混合精度训练

AUTOMATIC MIXED PRECISION PACKAGE - TORCH.AMP

CUDA AUTOMATIC MIXED PRECISION EXAMPLES

PyTorch 源码解读之 torch.cuda.amp: 自动混合精度详解

如何使用 PyTorch 进行半精度、混(合)精度训练

如何使用 PyTorch 进行半精度训练

pytorch模型训练之fp16、apm、多GPU模型、梯度检查点(gradient checkpointing)显存优化等

Working with Multiple GPUs

  • 代码文件:pytorch_auto_mixed_precision.py
  • 单卡显存占用:6.02 G
  • 单卡GPU使用率峰值:100%
  • 训练时长(5 epoch):1546 s
  • 训练结果:准确率85%左右

在这里插入图片描述

  • 混合精度训练过程

在这里插入图片描述

  • 混合精度训练基本流程
  1. 维护一个 FP32 数值精度模型的副本
  2. 在每个iteration
    • 拷贝并且转换成 FP16 模型
    • 前向传播(FP16 的模型参数)
    • loss 乘 scale factor s
    • 反向传播(FP16 的模型参数和参数梯度)
    • 参数梯度乘 1/s
    • 利用 FP16 的梯度更新 FP32 的模型参数
  • autocast结合GradScaler用法
# Creates model and optimizer in default precision
model = Net().cuda()
optimizer = optim.SGD(model.parameters(), ...)# Creates a GradScaler once at the beginning of training.
scaler = GradScaler()for epoch in epochs:for input, target in data:optimizer.zero_grad()# Runs the forward pass with autocasting.with autocast(device_type='cuda', dtype=torch.float16):output = model(input)loss = loss_fn(output, target)# Scales loss.  Calls backward() on scaled loss to create scaled gradients.# Backward passes under autocast are not recommended.# Backward ops run in the same dtype autocast chose for corresponding forward ops.scaler.scale(loss).backward()# scaler.step() first unscales the gradients of the optimizer's assigned params.# If these gradients do not contain infs or NaNs, optimizer.step() is then called,# otherwise, optimizer.step() is skipped.scaler.step(optimizer)# Updates the scale for next iteration.scaler.update()
  • 基于GradScaler进行梯度裁剪
scaler.scale(loss).backward()
scaler.unscale_(optimizer)
torch.nn.utils.clip_grad_norm_(model.parameters(), max_norm)
scaler.step(optimizer)
scaler.update()
  • autocast用法
# Creates some tensors in default dtype (here assumed to be float32)
a_float32 = torch.rand((8, 8), device="cuda")
b_float32 = torch.rand((8, 8), device="cuda")
c_float32 = torch.rand((8, 8), device="cuda")
d_float32 = torch.rand((8, 8), device="cuda")with torch.autocast(device_type="cuda"):# torch.mm is on autocast's list of ops that should run in float16.# Inputs are float32, but the op runs in float16 and produces float16 output.# No manual casts are required.e_float16 = torch.mm(a_float32, b_float32)# Also handles mixed input typesf_float16 = torch.mm(d_float32, e_float16)# After exiting autocast, calls f_float16.float() to use with d_float32
g_float32 = torch.mm(d_float32, f_float16.float())
  • autocast嵌套使用
# Creates some tensors in default dtype (here assumed to be float32)
a_float32 = torch.rand((8, 8), device="cuda")
b_float32 = torch.rand((8, 8), device="cuda")
c_float32 = torch.rand((8, 8), device="cuda")
d_float32 = torch.rand((8, 8), device="cuda")with torch.autocast(device_type="cuda"):e_float16 = torch.mm(a_float32, b_float32)with torch.autocast(device_type="cuda", enabled=False):# Calls e_float16.float() to ensure float32 execution# (necessary because e_float16 was created in an autocasted region)f_float32 = torch.mm(c_float32, e_float16.float())# No manual casts are required when re-entering the autocast-enabled region.# torch.mm again runs in float16 and produces float16 output, regardless of input types.g_float16 = torch.mm(d_float32, f_float32)

4卡 DP(Data Parallel)

  • 代码文件:pytorch_DP.py
  • 单卡显存占用:3.08 G
  • 单卡GPU使用率峰值:99%
  • 训练时长(5 epoch):742 s
  • 训练结果:准确率85%左右

在这里插入图片描述


4卡 DDP(Distributed Data Parallel)

pytorch-multi-gpu-training
/ddp_train.py

DISTRIBUTED COMMUNICATION PACKAGE - TORCH.DISTRIBUTED

  • 代码文件:pytorch_DDP.py
  • 单卡显存占用:3.12 G
  • 单卡GPU使用率峰值:99%
  • 训练时长(5 epoch):560 s
  • 训练结果:准确率85%左右

在这里插入图片描述

  • 代码启动命令(单机 4 GPU)
python -m torch.distributed.launch --nproc_per_node=4 --nnodes=1 pytorch_DDP.py    

基于accelerate的 DDP

huggingface/accelerate

Hugging Face开源库accelerate详解

  • 代码文件:accelerate_DDP.py
  • 单卡显存占用:3.15 G
  • 单卡GPU使用率峰值:99%
  • 训练时长(5 epoch):569 s
  • 训练结果:准确率85%左右

在这里插入图片描述

  • accelerate配置文件default_DDP.yml
compute_environment: LOCAL_MACHINE
distributed_type: MULTI_GPU
downcast_bf16: 'no'
gpu_ids: all
machine_rank: 0
main_training_function: main
mixed_precision: 'no'
num_machines: 1
num_processes: 4
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false
  • 代码启动命令(单机 4 GPU)
accelerate launch --config_file ./config/default_DDP.yml accelerate_DDP.py    

Pytorch + FSDP(Fully Sharded Data Parallel)

Pytorch FULLY SHARDED DATA PARALLEL (FSDP) 初识

2023 年了,大模型训练还要不要用 PyTorch 的 FSDP ?

GETTING STARTED WITH FULLY SHARDED DATA PARALLEL(FSDP)

  • batch_size == 1

    • 单卡显存占用:0.19 G,相比基准测试的 0.34G 有减少,但是没有达到4倍
    • 单卡GPU使用率峰值:60%
  • batch_size == 128

    • 单卡显存占用:2.88 G
    • 单卡GPU使用率峰值:99%
  • 代码文件:pytorch_FSDP.py

  • 训练时长(5 epoch):581 s

  • 训练结果:准确率85%左右

备注: pytorch里面的FSDP的batchsize是指单张卡上的batch大小
注意: to save the FSDP model, we need to call the state_dict on each rank then on Rank 0 save the overall states.翻译过来就是使用下面形式的代码来保存FSDP模型(否则,保存模型的时候会卡主):

states = model.state_dict()if rank == 0:torch.save(states, "model.pt")

在这里插入图片描述

  • 代码启动命令(单机 4 GPU)
python -m torch.distributed.launch --nproc_per_node=4 --nnodes=1 pytorch_FSDP.py    
  • FSDP包装后的模型

代码中指定对Resnet50中的Linear和Conv2d层应用FSDP。

在这里插入图片描述


基于accelerate的 FSDP(Fully Sharded Data Parallel)

  • batch_size == 1

    • 单卡显存占用:0.38 G,相比基准测试的 0.34G 并没有减少
    • 单卡GPU使用率峰值:60%
  • batch_size == 128

    • 单卡显存占用:2.90 G
    • 单卡GPU使用率峰值:99%
  • 代码文件:accelerate_FSDP.py

  • 训练时长(5 epoch):576 s,对于这个小模型速度和DDP相当

  • 训练结果:准确率85%左右

在这里插入图片描述

  • accelerate配置文件default_FSDP.yml
compute_environment: LOCAL_MACHINE
distributed_type: FSDP
downcast_bf16: 'no'
fsdp_config:fsdp_auto_wrap_policy: SIZE_BASED_WRAPfsdp_backward_prefetch_policy: BACKWARD_PREfsdp_forward_prefetch: truefsdp_min_num_params: 1000000fsdp_offload_params: falsefsdp_sharding_strategy: 1fsdp_state_dict_type: SHARDED_STATE_DICTfsdp_sync_module_states: truefsdp_use_orig_params: true
machine_rank: 0
main_training_function: main
mixed_precision: 'no'
num_machines: 1
num_processes: 4
rdzv_backend: static
same_network: true
tpu_env: []
tpu_use_cluster: false
tpu_use_sudo: false
use_cpu: false
  • 代码启动命令(单机 4 GPU)
accelerate launch --config_file ./config/default_FSDP.yml accelerate_FSDP.py    

Pytorch + DeepSpeed(环境没搞起来,哈哈哈)

[BUG] error: unrecognized arguments: --deepspeed ./ds_config.json #3961

fused_adam.so: cannot open shared object file: No such file or directory #119

DeepSpeedExamples/training/cifar/

Getting Started

  • 代码文件:pytorch_DeepSpeed.py

  • 单卡显存占用:

  • 单卡GPU使用率峰值:

  • 训练时长(5 epoch):

  • 训练结果:

  • 代码启动命令(单机 4 GPU)

deepspeed pytorch_DeepSpeed.py --deepspeed_config ./config/zero_stage2_config.json    

基于accelerate的 DeepSpeed(环境没搞起来,哈哈哈)

DeepSpeed介绍

深度解析:如何使用DeepSpeed加速PyTorch模型训练

DeepSpeed

  • 代码文件:accelerate_DeepSpeed.py
  • 单卡显存占用:
  • 单卡GPU使用率峰值:
  • 训练时长(5 epoch):
  • 训练结果:

模型保存

详见各方法的训练代码文件。

  • 单卡训练保存
torch.save(model.state_dict(), model_name)
  • 多卡训练保存
torch.save(model.module.state_dict(), model_name)
  • FSDP训练保存
states = model.state_dict()if rank == 0:torch.save(states, model_name)

模型推理

详见model_inference.py代码文件


onnx模型导出 / onnxruntime推理

pytorch.onnx.export方法参数详解,以及onnxruntime-gpu推理性能测试

详见model_inference.py代码文件

这篇关于pytorch单精度、半精度、混合精度、单卡、多卡(DP / DDP)、FSDP、DeepSpeed模型训练的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/527988

相关文章

大模型研发全揭秘:客服工单数据标注的完整攻略

在人工智能(AI)领域,数据标注是模型训练过程中至关重要的一步。无论你是新手还是有经验的从业者,掌握数据标注的技术细节和常见问题的解决方案都能为你的AI项目增添不少价值。在电信运营商的客服系统中,工单数据是客户问题和解决方案的重要记录。通过对这些工单数据进行有效标注,不仅能够帮助提升客服自动化系统的智能化水平,还能优化客户服务流程,提高客户满意度。本文将详细介绍如何在电信运营商客服工单的背景下进行

hdu4826(三维DP)

这是一个百度之星的资格赛第四题 题目链接:http://acm.hdu.edu.cn/contests/contest_showproblem.php?pid=1004&cid=500 题意:从左上角的点到右上角的点,每个点只能走一遍,走的方向有三个:向上,向下,向右,求最大值。 咋一看像搜索题,先暴搜,TLE,然后剪枝,还是TLE.然后我就改方法,用DP来做,这题和普通dp相比,多个个向上

Andrej Karpathy最新采访:认知核心模型10亿参数就够了,AI会打破教育不公的僵局

夕小瑶科技说 原创  作者 | 海野 AI圈子的红人,AI大神Andrej Karpathy,曾是OpenAI联合创始人之一,特斯拉AI总监。上一次的动态是官宣创办一家名为 Eureka Labs 的人工智能+教育公司 ,宣布将长期致力于AI原生教育。 近日,Andrej Karpathy接受了No Priors(投资博客)的采访,与硅谷知名投资人 Sara Guo 和 Elad G

hdu1011(背包树形DP)

没有完全理解这题, m个人,攻打一个map,map的入口是1,在攻打某个结点之前要先攻打其他一个结点 dp[i][j]表示m个人攻打以第i个结点为根节点的子树得到的最优解 状态转移dp[i][ j ] = max(dp[i][j], dp[i][k]+dp[t][j-k]),其中t是i结点的子节点 代码如下: #include<iostream>#include<algorithm

hdu4865(概率DP)

题意:已知前一天和今天的天气概率,某天的天气概率和叶子的潮湿程度的概率,n天叶子的湿度,求n天最有可能的天气情况。 思路:概率DP,dp[i][j]表示第i天天气为j的概率,状态转移如下:dp[i][j] = max(dp[i][j, dp[i-1][k]*table2[k][j]*table1[j][col] )  代码如下: #include <stdio.h>#include

usaco 1.1 Broken Necklace(DP)

直接上代码 接触的第一道dp ps.大概的思路就是 先从左往右用一个数组在每个点记下蓝或黑的个数 再从右到左算一遍 最后取出最大的即可 核心语句在于: 如果 str[i] = 'r'  ,   rl[i]=rl[i-1]+1, bl[i]=0 如果 str[i] = 'b' ,  bl[i]=bl[i-1]+1, rl[i]=0 如果 str[i] = 'w',  bl[i]=b

Retrieval-based-Voice-Conversion-WebUI模型构建指南

一、模型介绍 Retrieval-based-Voice-Conversion-WebUI(简称 RVC)模型是一个基于 VITS(Variational Inference with adversarial learning for end-to-end Text-to-Speech)的简单易用的语音转换框架。 具有以下特点 简单易用:RVC 模型通过简单易用的网页界面,使得用户无需深入了

透彻!驯服大型语言模型(LLMs)的五种方法,及具体方法选择思路

引言 随着时间的发展,大型语言模型不再停留在演示阶段而是逐步面向生产系统的应用,随着人们期望的不断增加,目标也发生了巨大的变化。在短短的几个月的时间里,人们对大模型的认识已经从对其zero-shot能力感到惊讶,转变为考虑改进模型质量、提高模型可用性。 「大语言模型(LLMs)其实就是利用高容量的模型架构(例如Transformer)对海量的、多种多样的数据分布进行建模得到,它包含了大量的先验

图神经网络模型介绍(1)

我们将图神经网络分为基于谱域的模型和基于空域的模型,并按照发展顺序详解每个类别中的重要模型。 1.1基于谱域的图神经网络         谱域上的图卷积在图学习迈向深度学习的发展历程中起到了关键的作用。本节主要介绍三个具有代表性的谱域图神经网络:谱图卷积网络、切比雪夫网络和图卷积网络。 (1)谱图卷积网络 卷积定理:函数卷积的傅里叶变换是函数傅里叶变换的乘积,即F{f*g}

秋招最新大模型算法面试,熬夜都要肝完它

💥大家在面试大模型LLM这个板块的时候,不知道面试完会不会复盘、总结,做笔记的习惯,这份大模型算法岗面试八股笔记也帮助不少人拿到过offer ✨对于面试大模型算法工程师会有一定的帮助,都附有完整答案,熬夜也要看完,祝大家一臂之力 这份《大模型算法工程师面试题》已经上传CSDN,还有完整版的大模型 AI 学习资料,朋友们如果需要可以微信扫描下方CSDN官方认证二维码免费领取【保证100%免费