Tensorflow Gpu in Not Detected in Jupyter Notebook but in Terminal
非 root 用户安装 cuda/cudnn 环境后,通过修改 PATH 和 LD_LIBRARY_PATH 变量,可以使 tensorflow 成功识别调用 GPU。但是,运行 jupyterhub notebook 后发现 GPU 调用失败...
首先,在 jupyter notebook 环境中运行以下命令,可以查看 tensorflow 识别出的硬件。
import tensorflow as tf
tf.config.list_physical_devices()
看到输出结果中并未包含 GPU。但是在 terminal 环境的 Python 中运行相同的命令,看到的结果是包含 GPU 的。
刚开始以为是 cuda 没安装正确,重新安装了一下,依然无法识别。
接着运行以下命令查看 Python 识别到的系统环境变量,看到其中没有了自定义的
LD_LIBRARY_PATH
。
import os
print(os.environ)
~~初步猜测是 Jupyter notebook 运行是忽略了 ~/.zshrc
中的配置。~~但是,可以看到
PATH
变量显示的是修改过的内容。
因此打算生成 jupyter 的配置文件(命令如下)后,强制指定 LD_LIBRARY_PATH
。
jupyterhub notebook --generate-config
仔细阅读了下配置文件(jupyterhub_config.py),留意到其中有这么一段话:
## Whitelist of environment variables for the single-user server to inherit from
# the JupyterHub process.
#
# This whitelist is used to ensure that sensitive information in the JupyterHub
# process's environment (such as `CONFIGPROXY_AUTH_TOKEN`) is not passed to the
# single-user server's process.
# Default: ['PATH', 'PYTHONPATH', 'CONDA_ROOT', 'CONDA_DEFAULT_ENV', 'VIRTUAL_ENV', 'LANG', 'LC_ALL']
# c.Spawner.env_keep = ['PATH', 'PYTHONPATH', 'CONDA_ROOT', 'CONDA_DEFAULT_ENV', 'VIRTUAL_ENV', 'LANG', 'LC_ALL']
推测原因出在这里,single -user 的 JupyterHub 会隐藏掉系统的环境变量,只留下 whitelist 中的这几个。
因此把 LD_LIBRARY_PATH
加入 .env_keep 列表,
c.Spawner.env_keep = ['PATH', 'PYTHONPATH', 'CONDA_ROOT', 'CONDA_DEFAULT_ENV', 'VIRTUAL_ENV', 'LANG', 'LC_ALL', "LD_LIBRARY_PATH"]
关闭 notebook server 进程后,重新开启,经测试,tensorflow 终于识别出 GPU 了。
jupyterhub notebook -f ~/jupyterhub_config.py
Last modified on 2023-11-01