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

pytorch单精度、半精度、混合精度、单卡、多卡(DP / DDP)、FSDP、DeepSpeed(环境没搞起来)模型训练代码,并对比不同方法的训练速度以及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大小

在这里插入图片描述

  • 代码启动命令(单机 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):
  • 训练结果:

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

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

相关文章

[工业自动化-22]:西门子S7-15xxx编程 - 软件编程 - 如何PLC建立用户界面: SIMATIC 面板式HMI 或工控机PC HMI

目录 前言: 一、PLC(可编程逻辑控制器)的用户界面支持方式 1.1 概述 1.2 西门子(Siemens)的人机界面(HMI)支持多种类型 1.3 PC HMI VS SIMATIC HMI 二、PC—HMI—PLC连接架构的实现 三、…

Go——一、Go语言安装及介绍

Go 一、Windows下安装Go1、下载Go2、配置环境变量3、下载Jetbrain下的GoLang4、编写hello world5、编译和执行 二、Go语言介绍1、开发文档2、Go语言核心开发团队3、为什么要创建Go4、Go语言发展史5、Go语言特点6、Golang执行过程6.1 执行过程分析6.2 编译是什么 7、开发注意事项…

WinForms C# 导入和导出 CSV 文件 Spread.NET

使用 WinForms C# 和 VB.NET 导入和导出 CSV 文件 2023 年 11 月 17 日 使用 Spread.NET 直接在 .NET WinForms 应用程序中处理 CSV 文件。 Spread.NET可帮助您创建电子表格、网格、仪表板和表单。它包括一个强大的计算引擎,具有 450 多个函数以及导入和导出 Micros…

【OpenCV】仿射变换中cv2.estimateAffine2D 的原理

目录 一、介绍 二、仿射变换矩阵 (M) 1.M中六个元素的说明 2.计算旋转角度 3.M的计算过程 三、输出状态 (inliers) 四、错切参数 一、介绍 cv2.estimateAffine2D 是 OpenCV 库中的一个函数,用于估计两个二维点集之间的仿射变换矩阵。即第一个点集经仿射变换转…

解决Requests中使用httpbin服务器问题:自定义URL的实现与验证

问题背景 在使用Python的Requests模块进行单元测试时,可能会遇到无法使用本地运行的httpbin服务器进行测试的问题。这是因为测试脚本允许通过环境变量HTTPBIN_URL指定用于测试的本地httpbin实例,但在某些测试用例中,URL是硬编码为httpbin.or…

成都瀚网科技有限公司抖音带货可靠么

近年来,随着抖音等短视频平台的兴起,越来越多的企业开始利用这些平台进行产品推广和销售。成都瀚网科技有限公司也紧跟这一趋势,通过抖音开展带货业务。那么,成都瀚网科技有限公司的抖音带货是否可靠呢?本文将对此进行…

KylinOSv10修改ulimit值

问题 ulimit 值过小,可能导致压力测试遇到瓶颈,比如通过nginx建立tcp长链接时,链接数量受限。需要修改ulimit值,Linux默认为1024。 解决 使用root或sudo权限,编辑文件/etc/security/limits.conf,新增以下…

pipeline + node +jenkins+kubernetes部署yarn前端项目

1、编写Dockerfile文件 # Set the base image FROM node:16.10.0# WORKDIR /usr/src/app/ WORKDIR /home/option# Copy files COPY ./ /home/option/# Build arguments LABEL branch${BRANCH} LABEL commit${COMMIT} LABEL date${BUILD_DATE} ARG ENV# Set ENV variables ENV …

基于C++实现循环赛日程表(分治算法)

一、问题描叙 设有n2^k个运动员,要进行网球循环赛。现在要设计一个满足以下要求的比赛日程表 每个选手必须与其他n-1个选手各赛一场每个选手一天只能赛一次循环赛一共进行n-1天 二、问题分析 按此要求可将比赛日程表设计成n行n-1列的表,在表中第 i 行…

金属压块液压打包机比例阀放大器

液压打包机是机电一体化产品,主要由机械系统、液压控制系统、上料系统与动力系统等组成。整个打包过程由压包、回程、提箱、转箱、出包上行、出包下行、接包等辅助时间组成。市场上液压打包机主要分为卧式与立式两种,立式废纸打包机的体积比较小&#xf…

Hive数据表操作--学习笔记

1,Hive数据表操作 1,建表语句和内外部表 ①创建内部表 create [external] table [if not exists] 表名( 字段名 字段类型 [comment 注释], 字段名 字段类型 [comment 注释], ... ) [row format delimited fields terminated by 指定分隔符];&#xff0…

如何简单挖掘公益SRC?

目录 1、寻找漏洞 1)谷歌语法 2)fofa 2、挖掘漏洞 3、提交报告 第一步:“标题”和“厂商信息”和“所属域名” 第二步:其它内容 第三步:复现步骤 0、IP域名归属证明 1、漏洞页 2、该干啥 3、注入的结果 4、上榜吉时 时间&#x…

【开源】基于JAVA的快递管理系统

项目编号: S 007 ,文末获取源码。 \color{red}{项目编号:S007,文末获取源码。} 项目编号:S007,文末获取源码。 目录 一、摘要1.1 项目介绍1.2 项目录屏 二、研究内容2.1 数据中心模块2.2 快递类型模块2.3 快…

Springboot 对于数据库字段加密方案(此方案是对字符串处理的方案)

背景:在erp开发中,有些用户比较敏感数据库里的数据比较敏感,系统给用户部署后,公司也不想让任何人看到数据,所以就有了数据库字段加密方案。 技术 spring boot mybatisplus 3.3.1 mybatisplus 实际提供了 字段加密方案 第一 他…

Java智慧工地SaaS管理平台源码:AI/云计算/物联网

智慧工地是指运用信息化手段,围绕施工过程管理,建立互联协同、智能生产、科学管理的施工项目信息化生态圈,并将此数据在虚拟现实环境下与物联网采集到的工程信息进行数据挖掘分析,提供过程趋势预测及专家预案,实现工程…

Elastic Search的RestFul API入门:index索引的增删改查

在我们开始深入探讨Elasticsearch的Restful API之前,有一点非常重要,那就是Elasticsearch存储的数据是JSON结构的。JSON,全称JavaScript Object Notation,是一种轻量级的数据交换格式,易于人阅读和编写,同时…

拜耳阵列(Bayer Pattern)以及常见彩色滤波矩阵(CFA)

一、拜耳阵列的来源 图像传感器将光线转化成电流,光线越亮,电流的数值就越大;光线越暗,电流的数值就越小。图像传感器只能感受光的强弱,无法感受光的波长。由于光的颜色由波长决定,所以图像传播器无法记录…

解决 VS2022 关于 c++17 报错: C2131 表达式必须含有常量值

使用 VS2022 编译 ORB-SLAM3 加载Vocabulary 二进制ORBvoc.bin 时,在 DBOW2 里修改 TemplatedVocabulary.h 代码显示这样的错误: 编译器错误 C2131 表达式的计算结果不是常数 定位到我的代码中: char buf [size_node] ; 原因 : …

Vatee万腾科技创新之舟:Vatee数字化力量引领未来的独特路径

在数字化的大潮中,Vatee万腾如一艘科技创新之舟,在未来的海洋中翱翔。vatee万腾以强大的数字化力量为桨,引领着行业向着新的、独特的路径前行,塑造着数字时代的未来。 Vatee万腾不仅仅是一家科技公司,更是一艘创新之舟…

(八)、基于 LangChain 实现大模型应用程序开发 | 基于知识库的个性化问答 (检索 Retrieval)

检索增强生成(RAG)的整体工作流程如下: 在构建检索增强生成 (RAG) 系统时,信息检索是核心环节。检索是指根据用户的问题去向量数据库中搜索与问题相关的文档内容,当我们访问和查询向量数据库时可能会运用到如下几种技术…