目录
项目场景
在自己手搓transformer架构时遇到了如题的问题;
问题描述
具体报错如下图
原因分析
由于GPU上运行,报错只能提示 CUDA error: device-side assert triggered,而且按照提示设置 CUDA_LAUNCH_BLOCKING=1 也并未返回特定的报错细节,所以我们先在CPU上进行调试,调试正常后再返回GPU上运行!!
去掉 .to(device) 后立刻产生了明确的报错:
于是返回查看,博主报错在embedding
层,这通常是因为输入的索引超出了嵌入(embedding)层权重的范围。我们输出所有的层大小,检查维度问题:
print("Source input indices:", src)
print("Target input indices:", tgt)
print("Max index in source input:", src.max())
print("Max index in target input:", tgt.max())
print(f"Embedding weight shape: {model.encoder_embed.weight.shape}") # 对于 source embedding
print(f"Embedding weight shape: {model.decoder_embed.weight.shape}") # 对于 target embedding
这一来问题就很明显了:
源输入和目标输入中的最大索引分别为 45797 和 48411,这显然都超出了嵌入层定义的索引范围32000!!
解决方案
修改维度的设置即可
总结下来,核心就是先让程序在CPU上运行,找到问题并调好后,再放回GPU上运行即可,祝大家调试顺利!