ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

把BERT模型从单GPU训练转换到多GPU训练但出现StopIteration: Caught StopIteration in replica 0 on device 0.

2021-07-04 10:02:12  阅读:1397  来源: 互联网

标签:attention 训练 args torch StopIteration gpu device GPU model


# Prepare model
 model = BertForMultipleChoice.from_pretrained(args.bert_model,
        cache_dir=PYTORCH_PRETRAINED_BERT_CACHE / 'distributed_{}'.format(args.local_rank),
        num_choices=4)
 model.to(device)
import torch.nn as nn
    # Prepare model
model = BertForMultipleChoice.from_pretrained(args.bert_model,
        cache_dir=PYTORCH_PRETRAINED_BERT_CACHE / 'distributed_{}'.format(args.local_rank),
        num_choices=4)
        
if torch.cuda.device_count() > 1:    # Returns the number of GPUs available
   logger.info("***** GPUsnum *****")
   logger.info("device: {} ({}) {}".format(device, torch.cuda.get_device_name(0), n_gpu))
   logger.info(type(n_gpu))
   model = nn.DataParallel(model)
model.to(device)

其实也没花多少功夫,但在找这个方法的时候花了不少时间,看了其他人的解决方案,如何进行单机多GPU训练,如上代码,主要是加入了并行nn.DataParallel。
但在训练时发现出现以下问题,之前也遇到这个问题,当时是修改了pytorch中的源码中的某行代码解决。

问题如下: 

原因
问题是多gpu进行模型训练的时候产生的,具体为,不能够用多gpu加载预训练的bert。应该是torch版本的问题。其中torch1.5以上版本都可能会出现这个问题,据解决方案替换为torch1.4可以解决该问题。

解决办法
最后我采用的是将报错的那行代码进行修改,
进入到报错的最后一行,

extended_attention_mask = extended_attention_mask.to(dtype=next(self.parameters()).dtype) # fp16 compatibility

改为:

 

extended_attention_mask = extended_attention_mask.to(dtype=torch.float32)

 

 

标签:attention,训练,args,torch,StopIteration,gpu,device,GPU,model
来源: https://blog.csdn.net/anshiquanshu/article/details/118458088

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有