Starcoder训练时NVIDIA Tesla T4多GPU未切换引发OOM问题求助
问题描述
在GCP实例上部署了4张16GB的NVIDIA Tesla T4 GPU,用于微调Starcoder大语言模型。已安装nvitop监控GPU使用情况,且通过nvcc --version确认CUDA toolkit已安装。但当前所有计算仅在GPU0上进行,导致模型所需显存超过16GB时触发CUDA OutOfMemoryError。报错信息如下:
OutOfMemoryError: CUDA out of memory. Tried to allocate 144.00 MiB (GPU 0; 14.62 GiB total capacity; 13.16 GiB already allocated;
103.38 MiB free; 13.96 GiB reserved in total by PyTorch) If reserved memory is >> allocated memory try setting max_split_size_mb
to avoid fragmentation. See documentation for Memory Management and PYTORCH_CUDA_ALLOC_CONF
需解决:
- 如何实现4张GPU的负载均衡?
- 是否需要在虚拟机层面进行额外配置?
解决方案
一、虚拟机层面配置检查(无需额外复杂操作)
- 确认GPU识别状态:执行
nvidia-smi,检查输出是否显示4张T4 GPU且状态均为Active。若有GPU未识别,直接重启GCP实例即可(GCP GPU实例默认自动加载驱动,无需手动配置)。 - 验证CUDA与PyTorch兼容性:执行
python -c "import torch; print(torch.version.cuda)"查看PyTorch绑定的CUDA版本,确保和nvcc --version输出的版本一致或兼容(比如PyTorch 2.x适配CUDA 11.7+)。
二、代码层面实现多GPU负载均衡(核心操作)
基于PyTorch框架,有两种主流实现方式:
方式1:DataParallel(入门友好)
在模型初始化后添加以下代码,自动实现数据拆分与多GPU并行计算:
import torch from torch.nn import DataParallel # 初始化你的Starcoder模型 model = ... # 将模型部署到所有可用GPU model = DataParallel(model)
- 特点:无需修改数据加载逻辑,适合快速验证多GPU效果,但并行效率略低于DistributedDataParallel。
方式2:DistributedDataParallel(推荐,效率更高)
这是PyTorch官方推荐的多GPU并行方案,步骤如下:
- 修改训练脚本,添加分布式初始化逻辑:
import torch import torch.distributed as dist from torch.nn.parallel import DistributedDataParallel as DDP from torch.utils.data.distributed import DistributedSampler # 初始化分布式通信环境(NCCL为GPU间最优通信后端) dist.init_process_group(backend='nccl') local_rank = dist.get_rank() torch.cuda.set_device(local_rank) # 加载模型并部署到当前GPU model = ... model = model.cuda(local_rank) model = DDP(model, device_ids=[local_rank]) # 用DistributedSampler拆分数据集,确保每个GPU拿到不同数据分片 train_sampler = DistributedSampler(train_dataset) train_loader = torch.utils.data.DataLoader( train_dataset, batch_size=your_batch_size, sampler=train_sampler )
- 用
torchrun启动脚本,指定GPU数量:
torchrun --nproc_per_node=4 your_train_script.py
- 特点:每个GPU对应一个独立进程,负载均衡更均匀,并行效率更高,适合大规模微调场景。
三、显存优化辅助技巧
配合多GPU使用,进一步降低显存压力:
- 启用混合精度训练:通过
torch.cuda.amp.GradScaler()和autocast()上下文管理器,用半精度计算减少显存占用。 - 梯度累积:累积多个小批次的梯度后再更新参数,降低单批次显存需求。
- 缓解显存碎片化:启动脚本前设置环境变量
export PYTORCH_CUDA_ALLOC_CONF=max_split_size_mb:128。
内容的提问来源于stack exchange,提问作者Aadesh Kulkarni
相关产品推荐
相关产品推荐

