PyTorch下,使用list放置模块,导致计算设备不一的报错

报错

在复现 Transformer 代码的训练阶段时,发生报错:

bash 复制代码
RuntimeError: Expected all tensors to be on the same device, but found at least two devices, cuda:0 and cpu!

解决方案

通过next(linear.parameters()).device确定 model 已经在 cuda:0 上了,同时输入 model.forward()的张量也位于 cuda:0。输入的张量没什么好推敲的,于是考虑到模型具有多层结构,遂输出每层结构的设备信息,model.encoder -> model.encoder.sublayer[0] ··· ···

测试发现,model.encoder.sublayer[0] 之后的模块的设备信息均位于 cpu,原因是构造这部分模块时,由于需要多个相同的模块,使用了 list 来存放模块:

python 复制代码
# module: 需要深拷贝的模块
# n: 拷贝的次数
# return: 深拷贝后的模块列表
def clones(module, n: int) -> list:
    return [copy.deepcopy(module) for _ in range(n)]

显然 list 不支持 GPU,需要用 PyTorch 提供的代替:

python 复制代码
def clones(module, n: int):
    return nn.ModuleList([copy.deepcopy(module) for _ in range(n)])

ModuleList 把子模块存入列表,能像 Python 里普通的列表被索引,最重要的是能使内部的模块被正确注册,并对所有的 Module 方法可见。[Source]

成功解决!

相关环境

bash 复制代码
python                    3.11.7               he1021f5_0
pytorch                   2.1.2           py3.11_cuda12.1_cudnn8_0    
相关推荐
觉醒大王14 分钟前
如何让综述自然引出你的理论框架?
论文阅读·深度学习·学习·自然语言处理·学习方法
素心如月桠28 分钟前
cmd 输入 python --version 输出为空(windows11系统安装python后执行python --version没反应)
python
飞Link35 分钟前
深度解析 HyperLPR:高性能中文车牌识别框架从入门到实战
python
Yngz_Miao1 小时前
【深度学习】交叉熵损失函数Cross-Entropy Loss
人工智能·深度学习·损失函数·交叉熵·ce
QQ588501981 小时前
Python_uniapp-心理健康测评服务微信小程序的设计与实现
python·微信小程序·uni-app
奔袭的算法工程师1 小时前
CRN源码详细解析(4)-- 图像骨干网络之DepthNet和ViewAggregation
人工智能·pytorch·深度学习·目标检测·自动驾驶
APIshop2 小时前
Java获取item_get-获得某书商品详情接口
java·开发语言·python
SNAKEpc121383 小时前
深入理解PyQtGraph核心组件交互
python·qt·pyqt
落雨盛夏3 小时前
深度学习|李哥考研2
人工智能·深度学习
人工智能AI技术3 小时前
【Agent从入门到实践】25 主流向量数据库速览:Pinecone、Chroma、Milvus,本地/云端选型建议
人工智能·python