问题:error–CUDA error: device-side assert triggered
先来说问题的根本原因:超出限制!
一、问题背景
- model:
TextCNN(
(embedding): Embedding(199269, 200)
(convs): ModuleList(
(0): Sequential(
(0): Conv2d(1, 100, kernel_size=(3, 200), stride=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=(298, 1), stride=(298, 1), padding=0, dilation=1, ceil_mode=False)
)
(1): Sequential(
(0): Conv2d(1, 100, kernel_size=(4, 200), stride=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=(297, 1), stride=(297, 1), padding=0, dilation=1, ceil_mode=False)
)
(2): Sequential(
(0): Conv2d(1, 100, kernel_size=(5, 200), stride=(1, 1))
(1): ReLU()
(2): MaxPool2d(kernel_size=(296, 1), stride=(296, 1), padding=0, dilation=1, ceil_mode=False)
)
)
(fc): Linear(in_features=300, out_features=6, bias=True)
(dropout): Dropout(p=0.5, inplace=False)
)
- 数据格式
# 注意这里的max_size
TEXT.build_vocab(total_test_data, max_size=230000, vectors='glove.6B.200d')
LABEL.build_vocab(total_test_data)
- 出错代码
with torch.no_grad():
for i, batch in enumerate(test_iterator):
batch.text = batch.text.to(device)
# ------------这里出错--------------------
predict = model(batch.text)
# ------------这里出错--------------------
二、解决方案
仔细查看问题背景,可知出错时batch.text下标溢出。仔细看model和数据编码可知,model的Embedding为(199269, 200),而编码max_size=230000,可知batch.text会出现下标超过199269的数据,故将代码修改如下:
TEXT.build_vocab(total_test_data, max_size=199267, vectors='glove.6B.200d')
# 不改为199269的原因是之前写的在处理编码的时候会添加 pad 和 unk 标识
# len(TEXT.vocab) # 199269
后记: 一定要慎重慎重再慎重,仔细一点就可以避免的错误耗费好几天的气力就debug,嗐