【Hugging Face 开源库】Accelerate 库 —— 大模型训练框架

大模型训练框架 Accelerate 库

Hugging Face 的 Accelerate 是一个用于 简化和加速深度学习模型训练 的库,它 支持在多种硬件配置上进行分布式训练,包括 CPU、GPU、TPU 等。

Accelerate 库的设计目标是 简化多 GPU 和 TPU 的训练过程,同时 支持混合精度训练。混合精度训练是指 同时使用单精度(float32)和半精度(float16)进行训练,以提高训练速度和降低内存消耗。

Accelerate 使用步骤

Accelerate 只需添加四行代码,即可使 相同的 PyTorch 代码在任何分布式配置下运行
让大规模训练和推理变得简单、高效且适应性强。

+ from accelerate import Accelerator
+ accelerator = Accelerator()  # 导入并创建一个 Accelerator 实例

+ model, optimizer, training_dataloader, scheduler = accelerator.prepare(
+     model, optimizer, training_dataloader, scheduler
+ )

  for batch in training_dataloader:
      optimizer.zero_grad()
      inputs, targets = batch
      inputs = inputs.to(device)
      targets = targets.to(device)
      outputs = model(inputs)
      loss = loss_function(outputs, targets)
+     accelerator.backward(loss)
      optimizer.step()
      scheduler.step()
  • 首先 导入并创建一个 Accelerator 实例

  • Accelerator 还 知道将 PyTorch 对象移动到哪个设备,因此建议让加速器为我们处理此操作。

    - device = "cuda"
    + device = accelerator.device
      model.to(device)
    
  • 接下来,为分布式训练 准备 PyTorch 对象(模型、优化器、调度器等)

    prepare() 方法负责 将模型放置在适当的容器中(如单个 GPU 或多 GPU) 以适应训练设置,将优化器和调度器调整为使用 Accelerate 的 AcceleratedOptimizerAcceleratedScheduler,并创建一个新的数据加载器,该加载器可以在进程之间进行分片

    • NOTE: Accelerate 只 prepare() 继承自相应 PyTorch 类的对象,例如 torch.optim.Optimizer
    • 可以 prepare() 自定义的 模型对象,如 diffusion_model需要满足 PyTorch Module 的要求);Accelerate 将对其进行包装,以确保模型在后续调用中能够正确地使用 Accelerate 提供的功能。
  • 最后,在训练循环中移除对输入和目标的 to(device) 调用,因为 Accelerate 的 DataLoader 类会自动将它们放置在正确的设备上。还应该用 Accelerate 的 backward() 方法替换常规的 backward(),该方法 缩放梯度并使用适当的 backward() 方法(例如,DeepSpeed 或 Megatron)。

    -   inputs = inputs.to(device)
    -   targets = targets.to(device)
        outputs = model(inputs)
        loss = loss_function(outputs, targets)
    -   loss.backward()
    +   accelerator.backward(loss)
    

将一切整合起来,新 Accelerate 训练循环现在应该看起来像这样!

from accelerate import Accelerator
accelerator = Accelerator()

device = accelerator.device
model, optimizer, training_dataloader, scheduler = accelerator.prepare(
    model, optimizer, training_dataloader, scheduler
)

for batch in training_dataloader:
    optimizer.zero_grad()
    inputs, targets = batch
    outputs = model(inputs)
    loss = loss_function(outputs, targets)
    accelerator.backward(loss)
    optimizer.step()
    scheduler.step()

Accelerate 提供额外功能——如梯度累积、梯度裁剪、混合精度训练等——可以将这些功能添加到脚本中以改善训练运行。

梯度累积(Gradient accumulation)

梯度累积 通过 在更新权重之前累积多个批次的梯度在更大的批次大小上进行训练。这可以用来克服内存限制。

要在 Accelerate 中启用此功能,请在 Accelerator 类中指定 gradient_accumulation_steps 参数,并将 accumulate() 上下文管理器添加到脚本中。

+ accelerator = Accelerator(gradient_accumulation_steps=2)
  model, optimizer, training_dataloader = accelerator.prepare(model, optimizer, training_dataloader)

  for input, label in training_dataloader:
+     with accelerator.accumulate(model):
          predictions = model(input)
          loss = loss_function(predictions, label)
          accelerator.backward(loss)
          optimizer.step()
          scheduler.step()
          optimizer.zero_grad()

梯度裁剪(Gradient clipping)

梯度裁剪是一种 防止“梯度爆炸” 的技术,Accelerate 提供了:

  • clipgrad_value() 用于将梯度限制在最小和最大值之间

  • clipgrad_norm() 用于将梯度规范化到特定值

混合精度(Mixed precision)

混合精度通过使用较低精度的数据类型如 fp16(半精度)来计算梯度,从而 加速训练

为了在 Accelerate 中获得最佳性能,损失应该在模型内部计算(如 Transformers 模型),因为 模型外部的计算是以全精度进行的

+ accelerator = Accelerator(mixed_precision="fp16")
+ with accelerator.autocast():
      loss = complex_loss_function(outputs, target)

如果在创建 Accelerator 时就会将 mixed_precision 参数设置为 'no',则 autocast() 仅起到一个透明包装的作用,不会进行混合精度计算。
NOTE: 只需要在前向计算中用 autocast() 包裹那些需要混合精度处理的操作,而 accelerator.backward() 会根据 mixed_precision 的设置自动处理梯度缩放。

  • Accelerate 会根据 mixed_precision 的设置自动管理 AMP 相关的梯度缩放(scaling),也就是说在调用 accelerator.backward(loss) 时,如果混合精度被启用(例如设置为 'fp16'),梯度缩放已经自动集成进去了。
  • autocast() 的主要作用是在 前向计算过程中控制操作的数据类型,从而获得混合精度的加速效果。所以,如果没有额外需要低精度执行的操作,backward() 内部的自动缩放已经足够,不需要额外手动处理混合精度。

训练对象

哪些是需要更新的训练参数

  • 模型参数:例如自定义的 diffusion_model 中的所有权重和偏置等,这些参数在每一步梯度下降时都会更新。

  • 优化器状态:例如 Adam 优化器中维护的动量项、学习率调整等,都会随着训练更新。

  • EMA 模型的状态:虽然 EMA 的更新是一种滑动平均,但它的状态会在训练过程中定期根据模型参数进行更新。

哪些是不需要更新的配置参数(超参数)

  • 训练超参数:这些参数 在训练过程中是不变的,只用来控制训练流程和优化器行为。

    • train_batch_size:每个训练批次的样本数,决定每步梯度更新时使用的样本量
    • gradient_accumulate_every:梯度累积步数,用于模拟更大的批次训练,减少显存消耗
    • train_lr:学习率,控制参数更新的步长
    • train_num_steps:总的训练步数,决定整个训练过程的迭代次数
    • ema_update_every:每隔多少步更新一次 EMA 模型
    • ema_decay:EMA 衰减系数,用于平滑模型权重
    • adam_betas:Adam 优化器的动量参数
    • save_and_sample_every:每隔多少步保存模型和进行采样
    • num_samples:用于采样时生成的样本总数,需满足整数平方根条件(便于组织采样输出)
    • max_grad_norm:梯度剪裁阈值,用于防止梯度爆炸
  • 调度器设置scheduler,学习率调度器,用于动态调整学习率,它的配置也是在训练开始前设定的。

  • 数据加载和日志记录配置:例如数据集、DataLoader 的设置以及结果保存的路径等,都属于配置项,不会参与梯度更新。

Adam 优化器

如何理解“梯度下降法”?

基于 随机梯度下降(SGD) 的优化算法用于 对目标函数进行最小化 的问题。

梯度下降(Gradient Descent)就好比一个人想从高山上奔跑到山谷最低点,用最快的方式(steepest)奔向最低的位置(minimum)。

在这里插入图片描述

随机梯度下降、牛顿法、动量法、Nesterov、AdaGrad、RMSprop、Adam

Momentum

在使用 SGD 算法时,我们有时会遇到震荡的问题,导致模型收敛过慢。如下图所示:

在这里插入图片描述

但是横轴上的分量一直在向前,所以震荡的原因是 纵轴上的分量在震荡

这种现象是由于每次迭代后梯度变化过大导致的,而解决这个问题的方法就是引入 动量(Momentum) 的概念。

在这里插入图片描述

可以看到,它会去看历史的数据,历史数据在纵轴上的分量是向下的,所以它在纵轴上的分量减小了,在横轴上的分量增加了。

在这里插入图片描述

调度器

<think>好的,用户现在问的是Hugging Face是什么。之前他们问过Transformers是厂家还是框架,我已经解释了Transformers的两种含义:架构和Hugging Face。现在用户进一步询问Hugging Face本身,这说明他们可能在使用Transformers时遇到了这个公司名字,想深入了解。 首先,我需要确定用户的背景。他们可能是刚开始接触NLP的开发者,或者是想了解工具背后公司的技术爱好者。不管怎样,用户的需求是明确了解Hugging Face的角色和提供的服务。 接下来,我需要整理Hugging Face的主要信息。Hugging Face不仅仅是一个公司,他们提供了多个产品和服务,比如Transformers、Datasets、模型中心、推理API等。需要分点解释,确保用户能理解每个部分的作用。 同时,用户可能混淆了Hugging Face和Transformers的关系,需要明确区分。Hugging Face是公司,Transformers是他们的开源库之一。另外,用户可能对Hugging Face Hub和模型托管不太清楚,需要举例说明,比如提到BERT或GPT-2的模型页面,这样更直观。 还要考虑用户可能的实际应用场景。比如,如果他们想快速部署模型,可以介绍Spaces和Inference API。如果是数据管理,Datasets就很重要。要确保回答覆盖不同使用场景,帮助用户找到适合他们需求的工具。 另外,用户可能对开源社区和商业化模式感兴趣,需要简要提到Hugging Face的开源贡献和盈利方式,比如企业服务。这能帮助他们理解公司的运作模式。 最后,总结部分要强调Hugging Face在NLP领域的重要性,以及推荐资源,方便用户进一步学习。确保语言简洁明了,避免技术术语过多,适合不同层次的读者理解。</think>**Hugging Face** 是一家专注于自然语言处理(NLP)和机器学习领域的科技公司,同时也是**开源社区和平台**的构建者。它的核心目标是为开发者和研究者提供便捷的工具、模型和资源,推动AI技术的民主化应用。以下是关键信息的梳理: --- ### **一、Hugging Face 的核心定位** - **本质**: - 一家成立于2016年的**AI技术公司**,总部位于纽约。 - 以开源社区为核心,提供工具、模型和协作平台。 - **核心价值**: **“AI的GitHub”** —— 构建模型、数据集和代码的共享生态,降低AI开发门槛。 --- ### **二、Hugging Face 的主要产品与服务** #### 1. **Transformers 开源库** - **功能**: 提供数千种预训练模型(如BERT、GPT-2、T5等)和统一API,支持文本生成、翻译、分类等任务。 - **代码示例**: ```python from transformers import pipeline generator = pipeline("text-generation", model="gpt2") print(generator("人工智能的未来是")) ``` #### 2. **模型中心(Model Hub)** - **功能**: 类似“模型应用商店”,托管超过50万个开源模型,支持用户**上传、下载、共享**模型。 - **举例**: - [BERT](https://huggingface.co/bert-base-uncased) - [Stable Diffusion](https://huggingface.co/stabilityai/stable-diffusion-2)(图像生成) #### 3. **数据集(Datasets)** - **功能**: 提供数万个公开数据集(文本、图像、音频等),支持一键加载和预处理。 - **代码示例**: ```python from datasets import load_dataset dataset = load_dataset("glue", "mrpc") # 加载语义相似度数据集 ``` #### 4. **Spaces(AI应用托管)** - **功能**: 允许用户快速部署AI应用(如聊天机器人、图像生成工具),提供免费GPU资源。 - **案例**: [ChatGPT克隆](https://huggingface.co/spaces/merve/chatgpt-clone) | [语音合成](https://huggingface.co/spaces/facebook/MusicGen) #### 5. **Inference API(商业化服务)** - **功能**: 提供付费的云端模型推理API,企业可直接调用预训练模型,无需本地部署。 --- ### **三、Hugging Face 的生态角色** | **角色** | **说明** | |------------------|-------------------------------------------------------------------------| | **开源贡献者** | 维护Transformers、Datasets、Accelerate等核心,推动社区协作。 | | **模型托管平台** | 集中管理开源模型,支持版本控制、文档化和在线演示。 | | **企业服务商** | 为大型公司提供私有模型托管、安全部署和定制化支持(如AWS、微软合作)。 | --- ### **四、Hugging Face 的特点** 1. **开源优先** - 几乎所有工具和均开源(Apache 2.0或MIT协议)。 2. **社区驱动** - 开发者可贡献模型、数据集和代码,形成活跃的协作生态。 3. **多模态支持** - 从文本扩展到图像、音频、视频(如支持Stable Diffusion、Whisper语音模型)。 4. **易用性** - 提供高阶API,几行代码即可调用复杂模型。 --- ### **五、常见问题解答** 1. **“Hugging Face 是免费的吗?”** - 基础功能(模型下载、使用)免费,但企业级服务(如Inference API、私有部署)需付费。 2. **“Hugging Face 和 OpenAI 的区别?”** - OpenAI 是闭源商业公司(如ChatGPT),Hugging Face 是开源平台,提供基础设施。 3. **“为什么叫Hugging Face?”** - 名字灵感来源于表情符号🤗(拥抱笑脸),代表友好和开放的社区文化。 --- ### **六、学习与使用建议** - **入门路径**: 1. 学习 `transformers` 的[官方文档](https://huggingface.co/docs/transformers)。 2. 在 Model Hub 上探索现成模型(如 `bert-base-uncased`)。 3. 通过 Spaces 部署自己的AI应用。 - **资源推荐**: - [Hugging Face 官方课程](https://huggingface.co/learn)(免费实践教程) - 《Natural Language Processing with Transformers》(O'Reilly书籍) 如果需要更具体的功能演示(如下载模型或训练自定义模型),可以随时告诉我! 🤗
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

一杯水果茶!

谢谢你的水果茶啦~

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值