HuggingFace Transformer库如何在训练时降低GPU显存


0. 引言

Hugging Face Transformers 是一个非常流行的库,用于处理自然语言处理任务。在使用该库进行模型训练时,可能会遇到显存(GPU内存)不足的问题。本文介绍可以尝试的方法来降低显存占用,

1. 减少批次大小 (Batch Size)

批次大小是影响显存占用的主要因素之一。减小批次大小可以显著减少显存消耗,但可能会延长训练时间。

TrainingArguments(
	per_device_train_batch_size=2/4/...  # 每个设备上的训练批次大小
)

如果你有多个GPU,则实际的每轮训练批次大小将是每个设备上的批次大小乘以GPU的数量。

2. 使用 Gradient Accumulation

当你减小了批次大小但仍然希望保持较大的有效批次大小时,可以使用梯度累积(Gradient Accumulation)。这意味着在更新权重之前,会累积多个小批次的梯度。

TrainingArguments(
	gradient_accumulation_steps=2/4/...  # 每个设备上的训练批次大小
)

比如我们设置了 per_device_train_batch_size 为4,表示每个 GPU 设备上的批次大小为4。同时,我们设置了 gradient_accumulation_steps 为2,这意味着在更新权重之前,会累积两个小批次的梯度。因此,尽管每个设备上的实际批次大小为4,但通过累积两个批次的梯度,我们可以得到一个相当于每轮训练8个样本的效果。

3. 混合精度训练 (Mixed Precision Training)

使用 FP16 或 BF16 进行混合精度训练可以在保证训练效果的同时大幅减少显存占用。Hugging Face 提供了与 PyTorch 和 TensorFlow 的混合精度训练支持。

4. 序列长度 (Sequence Length)

减小输入序列的长度也可以降低显存消耗。可以通过截断或摘要等方法来实现。

5. 使用 DeepSpeed

DeepSpeed 是一个深度学习优化库,特别适合大规模模型训练。它提供了许多功能,如 ZeRO、ZeRO-Offload 和 Pipeline Parallelism,这些都可以帮助减少显存需求。

ZeRO 的原理请参考:《大模型训练ZeRO内存优化原理详解》

6. 减少CUDA内存分配块的大小

设置 PyTorch 中 CUDA 分配器的行为,告诉 PyTorch 在分配 GPU 内存时采用一种特定的策略,以减少碎片化并提高内存管理效率。

os.environ["PYTOCH_CUDA_ALLOC_CONF"]="max_split_size_mb:128"

max_split_size_mb:128 这意味着当请求的内存小于 128MB 时,PyTorch 将尝试将内存分配成最大不超过128MB 的块。

默认情况下,PyTorch 会尽可能地分配一个连续的大块内存来满足请求,但这可能导致碎片化问题。通过限制分配的最大块大小,可以使得较小的内存请求更容易找到可用的空间,从而减少碎片化的发生。

但太小的 max_split_size_mb 可能会引发频繁分配内存,会降低工作效率。


欢迎关注本人,我是喜欢搞事的程序猿; 一起进步,一起学习;

欢迎关注知乎/CSDN:SmallerFL

也欢迎关注我的wx公众号(精选高质量文章):一个比特定乾坤

在这里插入图片描述

Hugging Face 的 `SFTTrainer` 可以通过配置适当的设备以及利用 PyTorch 或 Transformers 提供的功能来进行 GPU 加速。以下是具体的步骤说明: ### 使用 GPU 加速的步骤 1. **确认系统是否有可用的 GPU** 首先需要检查你的环境中是否已经安装了支持 CUDA 的 PyTorch,并且有可用的 NVIDIA GPU。可以运行以下代码检测: ```python import torch print(torch.cuda.is_available()) # 如果返回 True,则表示有可用的 GPU ``` 2. **设置模型加载到 GPU 上** 确保你在初始化 Hugging Face 模型将它移动到 GPU 设备上。例如: ```python from transformers import AutoModelForCausalLM model = AutoModelForCausalLM.from_pretrained("your_model_name") device = "cuda" if torch.cuda.is_available() else "cpu" model.to(device) ``` 3. **使用 SFTTrainer 并指定训练参数** 当实例化 `SFTTrainer` 类,可以通过传入合适的参数让其自动分配任务到 GPU 进行计算。示例代码如下: ```python from peft import SFTTrainer from datasets import load_dataset dataset = load_dataset('your_dataset') trainer = SFTTrainer( model=model, train_dataset=dataset['train'], eval_dataset=dataset['validation'], use_gpu=torch.cuda.is_available(), # 显式启用 GPU batch_size=8 # 根据显存调整批量大小 ) ``` 4. **优化性能(可选)** - 利用混合精度 (`fp16`) 训练加快速度并减少内存占用: ```python training_args = TrainingArguments(output_dir="./results", fp16=True) # 启用 FP16 浮点数运算 trainer.train(training_args) ``` - 将数据预处理操作放在 GPU 上完成。 5. **验证效果** 开始训练后观察控制台日志信息,如果显示“Using cuda”或其他相关的 GPU 调度消息,则表明成功启用了 GPU 加速。 --- ### 注意事项 - 确保所有依赖版本兼容(如 Torch 和 Transformer 版本匹配)。 - 对于大型模型,注意监控显卡温度及功耗情况避免过热损坏硬件。
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

打赏作者

SmallerFL

你的鼓励将是我创作的最大动力

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

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

打赏作者

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

抵扣说明:

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

余额充值