Hugging Face开源库accelerate详解

官网:https://huggingface.co/docs/accelerate/package_reference/accelerator

Accelerate使用步骤

  1. 初始化accelerate对象accelerator = Accelerator()
  2. 调用prepare方法对model、dataloader、optimizer、lr_schedluer进行预处理
  3. 删除掉代码中关于gpu的操作,比如.cuda()、.to(device)等,让accelerate自行判断硬件设备的分配
  4. 将loss.backbard()替换为accelerate.backward(loss)
  5. 当使用超过1片GPU进行分布式训练时,在主进程中使用gather方法收集其他几个进程的数据,然后在计算准确率等指标

Accelerator对象初始化参数

  1. device_placement (bool, optional, defaults to True) — 是否让accelerate来确定tensor应该放在哪个device
  2. split_batches (bool, optional, defaults to False) — 分布式训练时是否对dataloader产生的batch进行split,如果True,那么每个进程使用的batch size = batch size / GPU数量,如果是False,那么每个进程使用就是batch size,总的batch size = batch size * GPU数量
  3. mixed_precision (str, optional) — 是否使用混合精度训练
  4. gradient_accumulation_steps (int, optional, default to 1) — 梯度累加的步数,也可以使用GradientAccumulationPlugin插件进行详细配置
  5. cpu (bool, optional) — 是否强制使用CPU执行
  6. deepspeed_plugin (DeepSpeedPlugin, optional) — 使用此参数调整与DeepSpeed相关的参数,也可以使用accelerate config直接配置
  7. fsdp_plugin (FullyShardedDataParallelPlugin, optional) — 使用此参数调整FSDP(Fully Sharded Data Parallel)相关参数,也可以使用accelerate config直接配置
  8. megatron_lm_plugin (MegatronLMPlugin, optional) — 使用此参数调整与MegatronLM相关的参数,可以使用accelerate config直接配置
  9. step_scheduler_with_optimizer (bool, *optional, defaults to True) – lr_scheduler是否和optimizer同步更新
  10. gradient_accumulation_plugin (GradientAccumulationPlugin, optional) — 梯度累积插件

Accelerate常用高阶用法

  1. accelerator.print()
    当使用多片GPU训练时,打印每个进程的信息,替换python的print函数,这样在每个server上只打印一次,其实就是先使用is_local_main_process判断的print。
    在这里插入图片描述
  2. accelerator.is_local_main_process
    可以当做装饰器使用,在一个具有多片GPU的server上只执行一次,local表示每台机器。与is_local_main_process对应的是is_main_process,is_local_main_process每个server上的主进程,is_main_process是所有server的主进程。
    在这里插入图片描述
    在这里插入图片描述
  3. wait_for_everyone()
    同步控制,确保在后续操作之前所有前提操作已完成
  4. accelerator.save_model() / load_state_dict /
    load_checkpoint_in_model
    模型保存,自动去除掉由于分布式训练在模型上做的包装(调用unwrap_model),保存state_dict,并且可以对大模型文件进行分块存储。并加载保存的模型
  5. Accelerate与Transformers库搭配使用进行模型保存
    在这里插入图片描述
    在这里插入图片描述
  6. 使用accelerator做梯度裁剪:
    在这里插入图片描述
    在这里插入图片描述
  7. 梯度累加gradient accumulation
    尤其对于超大规模的模型,模型参数本来就已经很大了,如果再用很大的batch size进行训练,硬件资源吃不消,但是如果用很小的batch size训练的话模型稳定性很差,所以梯度累加gradient accumulation是一个这种的解决方案,其实就是连续执行多次forward前向过程,在多次执行期间不进行反向传播,每次都是很小的batch size,多次就累积成了比较大的batch size,然后在累积的结果上做反向传播。Accelerate在梯度累加期间暂停在不同GPU之间的梯度同步,进一步减少了通信数据量。
    在这里插入图片描述
    GradientAccumulationPlugin提供了更灵活梯度累加操作,除了能指定累加的步数,还能指定在累计过程中是否更新lr_scheduler调节器。
    在这里插入图片描述
  8. autocast混合精度训练
    对处于with上下文管理中的模块使用混合精度训练
    在这里插入图片描述
  9. gather、gather_for_metrics
    分布式训练时,在不同进程之间回收结果数据
  10. Prepare
    为分布式训练和混合精度做准备,然后以相同的顺序返回它们。
  11. reduce:跨进程做tensor的reduce操作
  12. save_state / load_state:保存、加载模型的状态数据
  13. unscale_gradients:混合训练过程中不对梯度进行缩放
    在这里插入图片描述
  14. unwrap_model
    去掉模型上由prepare加上的用于做分布式训练的包装层,在保存模型的时候比较有用
    在这里插入图片描述

4、使用accelerate执行分布式训练

  • 执行accelerate config根据提问和实际硬件情况设置配置文件
  • 执行accelerate test --config_file path_to_config.yaml验证环境配置是否正常
  • 执行进行命令进行分布式训练,accelerate launch --config_file path_to_config.yaml path_to_script.py --args_for_the_script

5、使用Accelerate在低资源环境下加载大的模型

  • 参考:https://huggingface.co/docs/accelerate/usage_guides/big_modeling

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

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

相关文章

【C++ 重要知识点总结】表达式

表达式 1 基础 组合运算 优先级结合律 类型转换 运算符重载 左值和右值 2 算数运算符 3 逻辑和关系运算法 短路求值 逻辑与,当第一个判定为否的时候,不再执行第二个判定,可以用来屏蔽第二步的计算,代替条件判断&#xff0…

String类

String类 String类是Java中的字符串类型,它是引用类型 三种常用的字符串构造 public class Test {public static void main(String[] args){String str1 "hello";String str2 new String("hello");char[] array {h,e,l,l,o};String str3 new String(…

【Rust 基础篇】Rust 树形结构:实现与应用

导言 树形结构是计算机科学中一种常见的数据结构,它具有层级结构和递归特性。在 Rust 中,我们可以使用结构体和枚举等语言特性来定义树形结构,并通过引用和所有权等机制有效地管理数据。本篇博客将详细介绍 Rust 中树形结构的实现和应用&…

云计算——虚拟化层架构

作者简介:一名云计算网络运维人员、每天分享网络与运维的技术与干货。 座右铭:低头赶路,敬事如仪 个人主页:网络豆的主页​​​​​ 前言 本章将会讲解云计算的虚拟化层架构,了解云计算虚拟化层都有哪些架构模式…

WPF嵌入外部exe应用程序-实现基本的嵌入

WPF嵌入外部exe应用程序 使用场景功能实现嵌入基本功能实现1.导入windows API2.运行外部程序3. 获取窗体句柄4. 嵌入窗体5.设置子窗体位置整个代码 嵌入存在的问题: 使用场景 在WPF桌面应用程序开发过程中,有时候需要将其他程序结合到一起,让…

mssql 以xml类型为存储过程传递不确定数量的参数

mssql 以xml类型传递不确定数量的参数 存储过程xml 处理在存储过程中参数在存储过程中使用 xml 作为参数存储过程 相信各位小伙伴在使用数据库的过程中,或多或少的建立了一些存储过程,并且带有一些参数,用来增加存储过程的适用性。 类似老顾的截图这样的,通常,我们需要将…

Flutter开发实战:妙用策略模式(Strategy Pa

拓维信息-品牌营销专员(24届) 岗位名:品牌营销专员(24届) 岗位类型:品牌专员 岗位职责: 1、参与公司品牌系统建设、负责展厅建设、媒体公关、自媒体运营、网络营销等工作,协同公司各…

Ocean Base-Oracle 查询表、表注释、字段、字段注释

Ocean Base-Oracle 查询所有表或视图、注释 SELECT * from user_tab_comments;Ocean Base-Oracle 查询一个表所有的字段、注释 SELECT u.column_name,c.comments,u.data_type FROM user_tab_columns uINNER JOIN user_col_comments c ON u.table_namec.table_name AND u.colu…

Redis基本全局命令(含key过期策略)

Redis基本全局命令 KEYEXISTSDELEXPIRETTLRedis的key过期策略TYPE KEY 返回所有满⾜样式(pattern)的key。⽀持如下统配样式。 h?llo 匹配 hello , hallo 和 hxlloh*llo 匹配 hllo 和 heeeelloh[ae]llo 匹配 hello 和 hallo 但不匹配 hilloh[^e]llo 匹配…

每日一题(set集合)-874. 模拟行走机器人

题目 874. 模拟行走机器人 题解思路 初始方向朝y轴正方向,遇到指令command -1 则向右转, 若为 -2 则向左转 定义方向[-1,0]、[0,1]、[1,0]、[0,-1] 分别为朝x轴负方向, y轴正方向, x轴正方向,y轴负方向初始方向为[…

Debian 系统安装中文输入法-iTOP3588开发板

Debian 系统烧写完成之后,并没有中文输入功能。本文档将介绍如何安装 ibus pinyin 输入法。 首先安装 fcitx 对应的工具,如下图所示: apt-get install fcitx fcitx-tools fcitx-config* fcitx-frontend* fcitx-module* fcitx-ui-* presage …

2023-7-13-第十八式观察者模式

🍿*★,*:.☆( ̄▽ ̄)/$:*.★* 🍿 💥💥💥欢迎来到🤞汤姆🤞的csdn博文💥💥💥 💟💟喜欢的朋友可以关注一下&#xf…

【LeetCode 算法】Walking Robot Simulation 模拟行走机器人 - 哈希

文章目录 Walking Robot Simulation 模拟行走机器人问题描述:分析代码哈希 Tag Walking Robot Simulation 模拟行走机器人 问题描述: 机器人在一个无限大小的 XY 网格平面上行走,从点 (0, 0) 处开始出发,面向北方。该机器人可以…

opencv-06 使用numpy.array 操作图片像素值

opencv-06 使用numpy.array 操作图片像素值 **1.二值图像及灰度图像****利用item 读取某一个像素值****利用itemset 修改像素值****彩色图像numpy.arry 像素值操作** numpy.array 提供了 item()和 itemset()函数来访问和修改像素值,而且这两个函数都是经…

基于MATLAB的无人机遥感数据预处理与农林植被性状估算

查看原文>>>基于MATLAB的无人机遥感数据预处理与农林植被性状估算 在新一轮互联网信息技术大发展的现今,无人机、大数据、人工智能、物联网等新兴技术在各行各业都处于大爆发的前夜。为了将人工智能方法引入农业生产领域。首先在种植、养护等生产作业环节…

Offset Explorer2 监视kafka的利器

kafka作为一个生产者和消费者集为一体的框架,消费者必须一直保持打开的状态,并且每隔一段时间接收一次数据,才能够保持生产者放入的数据及时被处理掉,而生产者则可以每隔一段时间发送一波数据,这样消费者就能够接收到了…

layui入门增删改查

layui入门增删改查 创建Lauiyi对象1.后台准备1.dao方法2.子实现类 2.R工具类的使用3.查询前端代码实现前端页面 4.增删改实现2.浮层3分离的js代码1.userManage.js2.userEdit.js3.index.js 5.运行效果 作为一名开发人员,我们经常需要对数据库中的数据进行增删改查&am…

前端node.js入门

(创作不易,感谢有你,你的支持,就是我前行的最大动力,如果看完对你有帮助,请留下您的足迹) 目录 Node.js 入门 什么是 Node.js? 什么是前端工程化? Node.js 为何能执行 JS&…

kafka无消息丢失配置

目录 前言: 消息丢失的场景 生产者消息丢失 Broker消息丢失 消费者消息丢失 消息丢失问题排查 无消息丢失配置: 参考资料: 前言: 使用消息中间件时,我们遇到最头疼的事就消息丢失,小则影响程序错误&…

【数据结构】二叉树详解(2)

⭐️ 前言 ✨ 往期文章链接:二叉树的概念性质 上一篇我们讲了二叉树的结构定义,以及前序/中序/后序的递归遍历,还有一些二叉树的接口实现,本篇我们补充一个二叉树的接口 BinaryTreeDepth。✨上一篇文章链接:二叉树详…