transformers库中的Trainer运行出现CUDA out of memory

环境:
多张4090卡

问题:
利用transformers库中的Trainer训练一个Bert模型。


from transformers import TrainingArguments, Trainer

trainer = Trainer(
    model=model,
    args=training_args,
    train_dataset=train_dataset,
    eval_dataset=test_dataset,
    compute_metrics=compute_metrics,
    data_collator=data_collator
)

出现out of memory现象,检查发现加载过程中所有的卡都被占满。

原因
没有指定显卡!
如果你不指定 CUDA_VISIBLE_DEVICES,则默认情况下,程序将会看到系统中的所有可用 GPU,并可能根据不同的配置和库的设置情况出现以下几种情况:

自动选择 GPU:

有些深度学习框架(如 TensorFlow、PyTorch)会自动选择一个空闲的 GPU 进行计算。如果第一个 GPU 设备(编号为 0)是空闲的,它通常会被优先选择。
占用所有可用 GPU:

有些情况下,程序可能会占用所有可用的 GPU 设备资源,甚至即使它只在一个 GPU 上运行计算任务。这可能会导致其他用户或进程在尝试使用这些 GPU 时遇到资源冲突。
多 GPU 训练:

如果程序本身支持并配置为使用多 GPU(如分布式训练或数据并行),它可能会自动在所有可用的 GPU 上分配计算任务。
可能的错误或效率低下:

如果你的程序没有有效管理和利用多个 GPU,可能会导致一些不必要的计算资源浪费或效率低下。在某些情况下,如果多个进程试图访问同一 GPU,而 GPU 资源已满,可能会导致程序报错或性能下降。

解决

os.environ["CUDA_VISIBLE_DEVICES"]='2'

os.environ[“CUDA_VISIBLE_DEVICES”]=‘2’ 这行代码的作用是指定使用哪个 GPU 设备进行计算。

CUDA_VISIBLE_DEVICES 是一个环境变量,用于控制哪些 GPU 设备对程序可见。在多 GPU 环境下,你可以通过设置这个变量来指定程序只使用某些 GPU。
os.environ[“CUDA_VISIBLE_DEVICES”] 设置这个环境变量,‘2’ 是你指定的 GPU 的编号。
作用效果:
通过设置 os.environ[“CUDA_VISIBLE_DEVICES”]=‘2’,你的程序会认为只有编号为 2 的 GPU 存在,并且只会在这个 GPU 上运行计算任务。其他 GPU 将对这个程序不可见。
示例:
假设你有 4 个 GPU,编号为 0, 1, 2, 3。如果你设置了 os.environ[“CUDA_VISIBLE_DEVICES”]=‘2’,那么程序会将编号为 2 的 GPU 映射为程序中的 GPU 0,从而只使用这一块 GPU。

使用场景:
在多用户共享 GPU 资源的环境中,可能需要手动指定 GPU,以避免冲突。
如果一个程序只需要一个 GPU,你可以指定一个特定的 GPU 而不是默认使用全部可用 GPU。

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值