transformers库与DDP多卡训练冲突
·
本人想要在自己的模型训练中中使用大模型产生的结果,所以借助transformer库导入模型,报错如下:
[rank0]: return forward_call(*args, **kwargs)
[rank0]: File "/data/anaconda3/envs/DUTrack/lib/python3.8/site-packages/accelerate/hooks.py", line 170, in new_forward
[rank0]: output = module._old_forward(*args, **kwargs)
[rank0]: File "/data/anaconda3/envs/DUTrack/lib/python3.8/site-packages/torch/utils/_contextlib.py", line 116, in decorate_context
[rank0]: return func(*args, **kwargs)
[rank0]: File "/data/anaconda3/envs/DUTrack/lib/python3.8/site-packages/transformers/models/llama/modeling_llama.py", line 158, in forward
[rank0]: freqs = (inv_freq_expanded.float() @ position_ids_expanded.float()).transpose(1, 2)
[rank0]: RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cuda:3! (when checking argument for argument mat2 in method wrapper_CUDA_bmm)
经检查,发现是HuggingFace 的模型并行(model parallel)机制与PyTorch 的 DDP 冲突
self.language_model = LlavaNextForConditionalGeneration.from_pretrained(
"/data/seg/llama3-llava-next-8b-hf",
device_map="auto", torch_dtype=torch.float16
)
device_map="auto"是 HuggingFace 提供的一种 自动模型并行(Model Parallelism)机制,它会自动将大型模型拆分并分布加载到多张 GPU 上
self.XMem = nn.parallel.DistributedDataParallel(
XMem(config).cuda(),
device_ids=[local_rank], output_device=local_rank, broadcast_buffers=False, find_unused_parameters=True)
而 DDP 是把同一个模型的多个副本分别放在不同的 GPU 上,靠梯度同步。
因此两者不能混用。
不使用 device_map="auto",改成手动 .to(f"cuda:{local_rank}")。
这时候,在每个进程里跑的都是一个模型副本,用的是单 GPU,这和 DDP 是兼容的。
魔乐社区(Modelers.cn) 是一个中立、公益的人工智能社区,提供人工智能工具、模型、数据的托管、展示与应用协同服务,为人工智能开发及爱好者搭建开放的学习交流平台。社区通过理事会方式运作,由全产业链共同建设、共同运营、共同享有,推动国产AI生态繁荣发展。
更多推荐


所有评论(0)