Linux服务器 TensorFlow找不到GPU

记录一下这次长达两天的心累Debug:Could not find cuda drivers on your machine, GPU will not be used.,先说一下我的项目情况

使用VSCode ssh连接实验室服务器,无root权限,不能使用sudo指令,Linux系统,Jupyter项目

使用Anaconda创建虚拟环境

主要抗争的内容是Cuda,cudnn,TensorFlow

先直接说痛点,和我情况类似的朋友出问题的方向可能有两个

1.1 cuda,cudnn,TensorFlow版本不匹配

我最终跑通的版本是cuda11.8,cudnn8.9,tensorflow2.10

验证手段:CodeCell输入

复制代码
import tensorflow as tf
gpus = tf.config.experimental.list_physical_devices(device_type='GPU')
cpus = tf.config.experimental.list_physical_devices(device_type='CPU')
print(gpus, cpus)
print(tf.sysconfig.get_build_info())

显示如下

复制代码
[] [PhysicalDevice(name='/physical_device:CPU:0', device_type='CPU')]
OrderedDict([('cpu_compiler', '/usr/lib/llvm-16/bin/clang'), ('cuda_compute_capabilities', ['sm_35', 'sm_50', 'sm_60', 'sm_70', 'sm_75', 'compute_80']), ('cuda_version', '11.8'), ('cudnn_version', '8'), ('is_cuda_build', True), ('is_rocm_build', False), ('is_tensorrt_build', True)])

尤其这个部分

可以卸载当前的cuda,cudnn重新下载试一下

参考Could not find cuda drivers on your machine, GPU will not be used. - 知乎 (zhihu.com)

1.2VS Code 启动的 Jupyter/Python 进程并不会再次 source ~/.bashrc,所以拿不到那些环境变量

在 VS Code 的 Interactive(Code Cell)里,Python 进程往往并不会走你在终端里"登录时"自动加载的 ~/.bashrc(或 ~/.bash_profile)那一套流程。换句话说,即使你在 ~/.bashrc 里把 CUDA 11.8/CuDNN 8.8 路径都导出了,VS Code 启动的 Jupyter/Python 进程并不会再次 source ~/.bashrc,所以拿不到那些环境变量,自然就"看不到"GPU。

验证的方法也很简单,在相应虚拟环境的终端里跑以下代码

bash 复制代码
python - <<EOF
import tensorflow as tf
print("Built with CUDA:", tf.test.is_built_with_cuda())
print("Physical GPUs:", tf.config.list_physical_devices('GPU'))
EOF

然后若显示True以及有GPU,则验证CodeCell,跑以下代码,结果发现没有GPU的话,说明大概率就是这个问题

python 复制代码
import tensorflow as tf
print("Built with CUDA:", tf.test.is_built_with_cuda())
print("Physical GPUs:", tf.config.list_physical_devices('GPU'))

1.2.1 找到虚拟环境的根目录

我的虚拟环境叫Karyo_env,在终端输入

复制代码
conda activate Karyo_env
echo $CONDA_PREFIX

假设输出/data5/chensx/downEnv/Anaconda/envs/Karyo_env

下面我都以我的环境为例,具体使用的时候需要替换掉其中的内容

1.2.2 创建 activate.d 目录

python 复制代码
mkdir -p /data5/chensx/downEnv/Anaconda/envs/Karyo_env/etc/conda/activate.d
mkdir -p /data5/chensx/downEnv/Anaconda/envs/Karyo_env/etc/conda/deactivate.d

1.2.3 在 activate.d 里写一个脚本,把所有 export 放进去

建议文件名叫 env_vars_cuda.sh,内容示例:

python 复制代码
#!/bin/bash
# ~/.conda/envs/Karyo_env/etc/conda/activate.d/env_vars_cuda.sh

export CUDA_HOME=/data5/chensx/cuda11.8
export PATH=$CUDA_HOME/bin:$PATH

export CUDNN_HOME=/data5/chensx/cudnn-linux-x86_64-8.8.1.3_cuda11-archive

export LD_LIBRARY_PATH=$CUDA_HOME/lib64:$CUDNN_HOME/lib64:/data5/chensx/downEnv/Anaconda/lib
export CPATH=$CUDNN_HOME/include:$CPATH

然后保存,并确保它可执行:

python 复制代码
chmod +x /data5/chensx/downEnv/Anaconda/envs/Karyo_env/etc/conda/activate.d/env_vars_cuda.sh

1.2.4 在 deactivate.d 里写一个脚本,清理这些变量

否则当你切换到其他环境时,上一次的路径还会留在 LD_LIBRARY_PATH 里。可以在 deactivate.d 下新建 env_vars_cuda_cleanup.sh,内容:

python 复制代码
#!/bin/bash
# ~/.conda/envs/Karyo_env/etc/conda/deactivate.d/env_vars_cuda_cleanup.sh

unset CUDA_HOME
unset CUDNN_HOME
unset CPATH
# 如果你需要保留 Anaconda/lib 路径,可以不用去掉
unset LD_LIBRARY_PATH

chmod +x

python 复制代码
chmod +x /data5/chensx/downEnv/Anaconda/envs/Karyo_env/etc/conda/deactivate.d/env_vars_cuda_cleanup.sh

1.2.5 验证

关闭所有 VS Code 窗口,重新打开一个 Remote-SSH 会话,打开任何一个终端,执行:

python 复制代码
conda activate Karyo_env
echo $LD_LIBRARY_PATH
  • 确保里面包含 /data5/chensx/cuda11.8/lib64/data5/chensx/cudnn-linux-x86_64-8.8.1.3_cuda11-archive/lib64,且没有 /data5/chensx/cuda12.1/lib64

  • 在同一个 VS Code 里,重新选一次 Python Interpreter(点左下角 "Python: ...",选对 Karyo_env)。

  • 新开一个 Jupyter Notebook 或者 Code Cell,执行:

python 复制代码
import tensorflow as tf
print("GPU 列表:", tf.config.list_physical_devices('GPU'))

如果输出里包含 GPU:0, GPU:1,证明 VS Code 的 Python Process(Jupyter Kernel)已经拿到了和终端里一模一样的环境变量。

关于前面环境具体怎么配,之后再补坑吧,先去睡觉了

cuDNN Archive | NVIDIA Developer

CUDA Toolkit Archive | NVIDIA Developer

相关推荐
Ribou26 分钟前
Ubuntu 24.04.2安装k8s 1.33.4 配置cilium
linux·ubuntu·kubernetes
tan180°1 小时前
Boost搜索引擎 网络库与前端(4)
linux·网络·c++·搜索引擎
Mr. Cao code2 小时前
Docker:颠覆传统虚拟化的轻量级革命
linux·运维·ubuntu·docker·容器
抓饼先生2 小时前
Linux control group笔记
linux·笔记·bash
挺6的还3 小时前
25.线程概念和控制(二)
linux
您的通讯录好友3 小时前
conda环境导出
linux·windows·conda
代码AC不AC4 小时前
【Linux】vim工具篇
linux·vim·工具详解
码农hbk4 小时前
Linux signal 图文详解(三)信号处理
linux·信号处理
bug攻城狮4 小时前
Skopeo 工具介绍与 CentOS 7 安装指南
linux·运维·centos
宇宙第一小趴菜4 小时前
08 修改自己的Centos的软件源
linux·运维·centos