【分布式训练】Accelerate 多卡训练,单卡评测,进程卡住的解决办法

作者在将模型转换为多卡训练时遇到困难,起初尝试使用Transformers的Trainer但失败。后来发现accelerate库更适合其需求,但单卡评测时遇到卡顿问题。通过调试发现评测时直接使用模型会引发问题,改用`model.module(**inputs)`解决。还需注意在单卡评测中不必传递dev_dataloader给accelerate。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

最近想把之前的一个模型的改成多卡训练的。我并不懂DDP,DP。一开始打算使用Transformers的Trainer,但是配置的过程踩了很多坑也没有弄成功。【我是自己写的评测方法,但是我找不到能让触发Trainer去用我的方法评测的路劲】,后来偶然的机会知道了accelerate库,这个库没有Trainer那么高级抽象,正适合我。

按照官方的教程随便更改就可以了。但是因为我这个项目的特殊性,我决定不多卡评测,也没必要,因为之前单卡评测就两分钟就出结果了。于是我决定使用多卡训练+单卡评测。

但是单卡评测的时候又踩坑了,就是评测结束后,就卡住了,卡住了……不往下接着训练了。

于是我开始写print 观察这几个进程在哪里停住了,删掉评测部分看能不能正常运行(结果正常运行了),后来最终定位出了原因:只要在评测部分使用模型,例如 model(**input)就会在评测结束后卡住,评测的过程倒很正常。

网上查找到了解决办法:在评测过程中,一直使用 

model.module(**inputs)

就解决了。

其他的一些注意事项:

因为是单卡评测,所以不用将dev_dataloader交给 accelerate。


 

### 解决PyTorch单机训练中的性能瓶颈 #### 使用`DistributedDataParallel`替代`DataParallel` 为了提高效率并减少潜在的性能瓶颈,建议采用`DistributedDataParallel`(DDP)来代替`DataParallel`(DP)[^1]。 DDP通过进程中各自管理一块GPU的方式工作,在每块GPU上启动独立Python进程,并利用分布式通信库如NCCL实现高效的数据交换。 ```python import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP def setup(rank, world_size): dist.init_process_group("nccl", rank=rank, world_size=world_size) model = Model().to(device) ddp_model = DDP(model, device_ids=[device]) ``` #### 配置环境变量优化网络传输 适当调整环境变量可以显著改善跨设备间数据同步的速度: - `OMP_NUM_THREADS`: 设置为较小值(通常等于CPU核心数),防止过线程竞争资源。 - `NCCL_DEBUG`: 开启调试模式有助于排查可能存在的问题。 - `CUDA_VISIBLE_DEVICES`: 明确指定可见的GPU编号以便更好地分配任务给不同硬件单元[^3]. ```bash export OMP_NUM_THREADS=8 export NCCL_DEBUG=INFO export CUDA_VISIBLE_DEVICES="0,1,2,3" ``` #### 调整批处理大小与梯度累积策略 增加batch size能够充分利用显存空间从而加快前向传播过程;当内存不足时可考虑实施gradient accumulation技术——即次反向传播后再更新权重参数,这样既保持了大批次带来的好处又不会超出物理限制[^2]. ```python accumulation_steps = 4 optimizer.zero_grad() for i, data in enumerate(dataloader): outputs = model(data) loss = criterion(outputs, labels) / accumulation_steps loss.backward() if (i + 1) % accumulation_steps == 0: optimizer.step() optimizer.zero_grad() ``` #### 减轻全局解释器锁(GIL)影响 由于CPython存在GIL机制,即使是在核环境中也可能因频繁切换上下文而导致效率低下。对于I/O密集型操作或者需要大量调用外部C函数的情况,可以通过引入进程线程编程模型来进行并发执行,以此绕过GIL造成的阻碍.
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值