如何在conda虚拟环境中配置路径使用环境内安装的指定CUDA版本
问题场景
- 运行环境:Ubuntu 22 LTS
- 部署需求:为TensorFlow 1.x、TensorFlow 2.x、PyTorch分别创建独立conda虚拟环境,每个环境内安装版本匹配的CUDA、cuDNN组件,例如适配TF1.x的环境通过命令
conda create -n tf1 cudnn=7.6.5 cudatoolkit=10.1.243创建 - 异常现象:激活conda环境后,系统默认调用全局安装的CUDA 11.7,执行
nvcc --version返回全局版本信息,未识别conda环境内安装的指定版本CUDA,命令返回示例如下:
nvcc: NVIDIA (R) Cuda compiler driver Copyright (c) 2005-2022 NVIDIA Corporation Built on Tue_May__3_18:49:52_PDT_2022 Cuda compilation tools, release 11.7, V11.7.64 Build cuda_11.7.r11.7/compiler.31294372_0
解决方案
核心原因是conda默认不会自动将环境内自带的CUDA相关路径提到环境变量最高优先级,系统路径下的全局CUDA会被优先调用。通过conda原生的激活/停用钩子配置独立路径,可实现激活环境时自动加载对应版本CUDA、退出环境时自动还原配置,不会出现多环境版本冲突。
前置检查
激活目标conda环境(例如tf1环境执行conda activate tf1),先确认环境内是否存在对应版本的nvcc组件:
执行ls $CONDA_PREFIX/bin/nvcc,如果提示文件不存在,先安装和cudatoolkit版本完全匹配的cuda-nvcc包,例如CUDA10.1版本执行:conda install cuda-nvcc=10.1.243
如果之前在全局~/.bashrc文件中硬编码过系统CUDA的路径配置(例如export PATH=/usr/local/cuda-xx/bin:$PATH类的语句),先注释或删除这类配置,避免全局路径优先级干扰conda环境的配置。
配置环境自动加载脚本
- 创建环境激活时的脚本目录,目录不存在则手动新建:
mkdir -p $CONDA_PREFIX/etc/conda/activate.d - 在激活脚本目录下新建CUDA路径配置文件
cuda_path.sh,写入以下内容:#!/bin/bash # 备份激活环境前的原始路径配置 export OLD_LD_LIBRARY_PATH=$LD_LIBRARY_PATH export OLD_PATH=$PATH # 将conda环境内的CUDA路径设为最高优先级 export CUDA_HOME=$CONDA_PREFIX export LD_LIBRARY_PATH=$CONDA_PREFIX/lib:$LD_LIBRARY_PATH export PATH=$CONDA_PREFIX/bin:$PATH - 给配置文件添加执行权限:
chmod +x $CONDA_PREFIX/etc/conda/activate.d/cuda_path.sh - 创建环境停用时的脚本目录,目录不存在则手动新建:
mkdir -p $CONDA_PREFIX/etc/conda/deactivate.d - 在停用脚本目录下新建路径还原文件
cuda_path_restore.sh,写入以下内容:#!/bin/bash # 还原到激活环境前的路径状态 export LD_LIBRARY_PATH=$OLD_LD_LIBRARY_PATH export PATH=$OLD_PATH # 清理临时变量 unset CUDA_HOME unset OLD_LD_LIBRARY_PATH unset OLD_PATH - 给还原文件添加执行权限:
chmod +x $CONDA_PREFIX/etc/conda/deactivate.d/cuda_path_restore.sh
验证配置生效
执行conda deactivate退出当前环境,再重新执行conda activate 你的环境名激活环境,执行nvcc --version,如果返回信息和你在该环境内安装的cudatoolkit版本一致,即配置生效。
注意事项
- 每个conda环境需要单独执行上述配置流程,脚本仅在对应环境激活时生效,不同环境的CUDA版本不会互相干扰
- 不需要修改全局环境变量配置,不要在
~/.bashrc中固定某一个版本的CUDA路径,否则会覆盖conda环境的路径优先级 - 新版本PyTorch、TensorFlow 2.x自带适配的CUDA运行时库,只要
LD_LIBRARY_PATH优先级配置正确,无需安装系统级CUDA即可正常调用GPU
内容的提问来源于stack exchange,提问作者homa taha
相关产品推荐
相关产品推荐

