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

相关推荐
十碗饭吃不饱31 分钟前
SSH 密钥认证详解:原理、实操、参数、排错与加固
运维·ssh
女神下凡3 小时前
芯参谋(85):Linux_PPI_NAND_驱动开发指南
linux·运维·arm开发·驱动开发·单片机·嵌入式硬件·设计规范
12.=0.3 小时前
【持续更新】shell脚本 + Linux命令
linux·运维·服务器
Escalating_xu4 小时前
【Linux 网络编程】五种 I/O 模型与非阻塞 I/O:从“等数据”到正确处理 EAGAIN
java·linux·网络
无言听风雨丶4 小时前
Linux 容器本质探秘:Cgroup 与 Namespace 深度解析与实战
linux·运维·服务器·kubernetes
万联WANFLOW4 小时前
CVE-2026-98432 等漏洞自查:AI 查出的 Linux、Windows 漏洞,运维怎么确认受不受影响
linux·运维·windows·网络安全
debugdynamo4 小时前
Netcatty:把 SSH 客户端做回工作台
运维·其他·ssh
时空无限4 小时前
ssh 直接免密输入 sudo 密码
运维·ssh
OPEN-F4 小时前
Ubuntu 自动登录后 GNOME 远程桌面连不上?一次登录钥匙环锁定的排查与永久修复
linux·运维·ubuntu
硅基手札4 小时前
【Linux 内核专栏 19】20 · 嵌入式子系统 — GPIO·pinctrl·clock·regulator
linux·运维·单片机·linux内核·嵌入式开发·调试定位