相同环境下,两个脚本中 torch 的 gpu显示不同?

新手上路,请多包涵

大家好 情况是这样的,我有一个A.py的脚本,里边打印以下代码是true:
print(1, torch.cuda.is_available(), torch.__version__)
然后在A.py 里执行命令 os.system('python B.py')
然而在B.py import torch 后 依然打印这句话,但返回确实false:
print(1, torch.cuda.is_available(), torch.__version__),在这个过程中,没有执行过任何程序。然后有个警告:UserWarning: CUDA initialization: Unexpected error from cudaGetDeviceCount(). Did you run some cuda functions before calling NumCudaDevices() that might have already set an error? Error 101: invalid device ordinal (Triggered internally at ../c10/cuda/CUDAFunctions.cpp:108.)

请问什么原因,该如何解决。 版本是:2.4.0+cu121 系统是ubuntu24.04

不知道什么原因,从网上没有找到方案

阅读 747
avatarAI BotBETA

这个问题通常是由于CUDA环境配置不当或者多个CUDA环境冲突导致的。在描述的情况下,A.py能够正常访问GPU,但B.py在由A.py通过os.system调用时无法访问,并提示了一个CUDA相关的错误。

以下是一些可能的解决方案:

  1. 检查CUDA环境变量
    确保你的环境变量(如CUDA_VISIBLE_DEVICESPATHLD_LIBRARY_PATH)在A.py和B.py中都是一致的。特别是CUDA_VISIBLE_DEVICES,它可能限制了CUDA设备的使用。
  2. 避免使用os.system
    os.system会启动一个新的shell环境,这可能会导致环境变量的不一致。如果可能,尝试使用Python的subprocess模块来启动B.py,这样你可以更好地控制环境变量。
  3. 检查CUDA驱动和PyTorch版本
    确保你的CUDA驱动和PyTorch版本是兼容的。在你的情况下,PyTorch版本是2.4.0+cu121,它应该与CUDA 12.1兼容。检查你的CUDA驱动版本是否也是CUDA 12.1。
  4. 检查GPU状态
    在A.py执行后,使用nvidia-smi命令来检查GPU的状态。可能有其他进程正在使用GPU,导致B.py无法访问。
  5. 清理CUDA错误
    在某些情况下,CUDA错误可能需要显式清理。尽管Python的PyTorch接口通常会自动处理这些错误,但在某些情况下,你可能需要调用CUDA API来清理错误状态。这通常不是推荐的做法,除非你非常确定这是问题的根源。
  6. 使用虚拟环境
    考虑使用Python的虚拟环境(如conda或venv)来隔离A.py和B.py的依赖。这有助于确保每个脚本都有其自己的依赖集,不会相互干扰。
  7. 调试日志
    增加日志记录,以便在A.py和B.py中捕获更多关于环境设置和GPU初始化的信息。这有助于识别潜在的问题所在。

如果以上解决方案都不能解决问题,你可能需要更深入地检查你的系统配置和PyTorch/CUDA的安装。在某些情况下,重新安装PyTorch或更新CUDA驱动可能会解决问题。

撰写回答
你尚未登录,登录后可以
  • 和开发者交流问题的细节
  • 关注并接收问题和回答的更新提醒
  • 参与内容的编辑和改进,让解决方法与时俱进
推荐问题
宣传栏