添加print语句改变模型推理结果?CUDA同步问题排查
问题分析与结论
这完全是CUDA同步问题导致的,具体原因和逻辑如下:
- PyTorch中CUDA操作默认是异步执行的:当你在GPU上运行模型推理、张量计算时,这些操作不会阻塞CPU主线程,CPU会继续执行后续代码,GPU则在后台异步完成计算任务。
- 原代码的核心问题:你直接将GPU上的结果张量存入列表时,GPU可能还没完成前2个batch的计算,列表里存的只是未完成计算的张量占位符,后续读取时这些张量的值还没被正确写入,因此表现为全0。
- 三种修复操作的本质都是触发了CUDA同步:
.cpu():将GPU张量迁移到CPU的操作会强制触发CUDA同步,必须等GPU完成当前计算后才能执行数据拷贝,确保拿到的是计算完成的有效结果。print():打印GPU张量时,PyTorch会隐式触发同步操作,等待GPU计算完成后再获取张量值进行输出。torch.cuda.synchronize():这是显式的CUDA同步指令,直接强制CPU等待GPU完成所有待处理的操作,保证后续读取的张量是计算完成后的有效数据。
结合你使用的PyTorch 1.12.0、CUDA 11.7环境,这个版本的PyTorch严格遵循CUDA异步执行的默认逻辑,这类因异步导致的结果未就绪问题属于常见场景。
内容的提问来源于stack exchange,提问作者Sinπ
相关产品推荐
相关产品推荐

