禁用CUDA后PyTorch仍调用GPU 如何强制其仅使用CPU运行
强制PyTorch仅使用CPU运行的方法
首先澄清一个认知偏差:你测试代码里a.add_(1)后变量b同步更新的现象和CUDA无关,这是PyTorch张量浅拷贝+原地操作的正常表现,纯CPU环境下运行也会出现完全相同的结果。
你之前执行set CUDA_VISIBLE_DEVICES ''后仍检测到CUDA可用,核心原因是Windows Cmd下将环境变量设为空字符串不会屏蔽CUDA设备,且环境变量配置必须在导入torch前完成才会生效。
以下是经过验证的可行方案:
1. 代码层面全局禁用(最稳定,不受运行环境影响)
在文件最开头导入torch后,立刻执行以下配置,强制屏蔽CUDA检测:
import torch torch.cuda.is_available = lambda: False cpu_device = torch.device("cpu")
后续所有创建张量、加载模型的操作,都显式指定device=cpu_device即可完全在CPU上运行。
2. 正确配置环境变量(启动Python前设置)
注意不同终端的配置语法存在差异,必须在启动Python进程、导入torch之前执行对应命令:
- Windows Cmd终端:
set CUDA_VISIBLE_DEVICES=-1 - Windows PowerShell终端:
$env:CUDA_VISIBLE_DEVICES="-1" - Linux/macOS终端:
export CUDA_VISIBLE_DEVICES=-1
配置完成后启动Python,执行torch.cuda.is_available()会返回False,此时PyTorch不会调用GPU资源。
3. 设置全局默认张量类型
如果不想在每处代码都手动指定设备,可以在导入torch后设置全局默认浮点张量为CPU类型:
import torch torch.set_default_tensor_type(torch.FloatTensor)
*注意:该配置仅对浮点类型张量生效,其他数据类型的张量建议配合显式指定device的方式使用。
关于你测试代码里的同步更新问题补充说明:
写
b = a时并没有复制张量,只是给同一个内存中的张量对象加了一个新的变量引用。所有带_后缀的PyTorch方法都是原地操作,会直接修改张量本身的内存值,因此所有指向该张量的变量都会同步变化。如果需要得到独立不联动的新张量,要写成b = a.clone()。
内容的提问来源于stack exchange,提问作者Salih
相关产品推荐
相关产品推荐

