conda环境独立管理cudatoolkit
在使用工作站跑不同的深度学习项目时,由于项目之间可能需要使用不同版本的python和pytorch,这间接影响了不同版本的pytorch必须兼容工作站上安装的同一个cudatoolkit。然而这很难做到,比如,一个项目可能需要CUDA 10.1,而另一个项目需要CUDA 11.3。如果在全局安装的话,版本冲突会导致问题。
后来查阅资料发现,在不同的 Conda 环境中可以安装不同版本的 cudatoolkit
,并让 PyTorch 仅依赖当前环境中的 CUDA 工具包,并且让PyTorch正常使用,而不依赖操作系统全局安装的cudatoolkit。
1. 核心原理
-
Conda 环境是完全隔离的,每个环境可以独立管理 CUDA 工具包(
cudatoolkit
)和其他依赖。 -
PyTorch 的官方 Conda 包会自动绑定对应版本的 CUDA,因此你无需在操作系统中全局安装 CUDA。
-
通过 Conda 安装的
cudatoolkit
是一个轻量级的 CUDA 运行时,仅包含必要的库文件,与系统全局的 CUDA 驱动无关。
2. 操作步骤
(1) 创建并激活新环境
conda create -n my_env python=3.9 # 示例环境名 `my_env`
conda activate my_env
(2) 安装指定版本的 cudatoolkit
通过 Conda 直接安装目标版本的 CUDA 工具包:
conda install cudatoolkit=11.3 # 例如 CUDA 11.3
(3) 安装 PyTorch
根据 PyTorch 官方提供的 Conda 命令安装对应版本(确保与 cudatoolkit
版本兼容):
# 例如 PyTorch 1.12.1 + CUDA 11.3
conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch
或使用 pip
(如果 Conda 源不可用):
pip install torch==1.12.1+cu113 torchvision==0.13.1+cu113 torchaudio==0.12.1 --extra-index-url https://download.pytorch.org/whl/cu113
3. 验证环境
在 Python 中运行以下代码检查 CUDA 是否可用:
import torch
print(torch.__version__) # 输出 PyTorch 版本
print(torch.cuda.is_available()) # 应返回 True
print(torch.version.cuda) # 输出当前 PyTorch 使用的 CUDA 版本
4. 注意事项
-
CUDA 驱动兼容性:虽然 Conda 环境中的
cudatoolkit
是独立的,但系统的 NVIDIA 驱动版本必须支持所需的 CUDA 版本。例如,CUDA 11.x 通常需要 NVIDIA 驱动版本 ≥ 450.80.02。-
查看驱动支持的 CUDA 版本:
nvidia-smi
-
-
PyTorch 与 CUDA 版本映射:需确保 PyTorch 版本和
cudatoolkit
版本兼容。参考 PyTorch 官方版本表。 -
优先使用 Conda 安装:避免混用
conda
和pip
安装 PyTorch,可能导致依赖冲突。
5. 示例场景
假设你需要两个项目:
-
项目 A:使用 PyTorch 1.10 + CUDA 11.3
-
项目 B:使用 PyTorch 1.13 + CUDA 11.7
操作流程:
# 为项目 A 创建环境
conda create -n project_a python=3.8
conda activate project_a
conda install pytorch torchvision torchaudio cudatoolkit=11.3 -c pytorch# 为项目 B 创建环境
conda create -n project_b python=3.9
conda activate project_b
conda install pytorch torchvision torchaudio cudatoolkit=11.7 -c pytorch
6. 常见问题
-
CUDA unavailable
错误:检查系统 NVIDIA 驱动是否支持当前cudatoolkit
版本(通过nvidia-smi
查看支持的 CUDA 版本)。 -
依赖冲突:使用
conda install
时若报错,可尝试先安装cudatoolkit
,再安装 PyTorch。
通过这种方式,你可以完全隔离不同项目的 CUDA 环境,避免全局依赖冲突。