从 conda + venv 双层隔离,再到安装与 CUDA 版本匹配的torch、torchvision以及环境导出,一文掌握干净、可复现的 Python 环境搭建。
为什么学这个
最近要在新的服务器上部署一个 PyTorch 项目,服务器 CUDA 版本是 12.6。但 PyTorch 官方预编译包最高只支持到 CUDA 12.1,我需要搞清楚到底怎么装才能让 torch 正常调用 GPU。同时,项目后期还要把环境分享给同事,这就要求我学会如何干净地导出和复现环境。此外,团队更习惯使用 Python 自带的 venv 作为项目级虚拟环境,而我又希望用 conda 来管理 Python 版本,于是探索了 conda + venv 的双层隔离方案。这篇文章记录了我在这个过程中的操作和思考,希望能帮助遇到同样问题的你。
核心内容 / 步骤
- 基础环境:conda 管理 Python 版本 + venv 项目隔离
设计思路:
· conda 负责全局 Python 版本的切换,确保项目基础解释器版本一致。 · 在 conda 环境内再创建 venv 虚拟环境,将项目依赖完全隔离,同时便于使用 requirements.txt 与同事协作。
操作步骤:
# 1. 创建并激活 conda 环境(指定 Python 版本)
conda create -n base_py310 python=3.10 -y
conda activate base_py310
# 2. 在 conda 环境内创建 venv 项目环境(命名为 .venv)
python -m venv .venv
# 3. 激活 venv 环境(注意不同操作系统激活命令不同)
# Linux/macOS:
source .venv/bin/activate
# Windows:
.venv\Scripts\activate
# 4. 升级 pip(避免旧版本解析依赖出错)
# Linux/macOS:
pip install --upgrade pip
# Windows:
python.exe -m pip install --upgrade pip
此时你便处于一个双层隔离的环境中:外层是 conda 管理的 Python 3.10,内层是 venv 管理的项目依赖。所有通过 pip 安装的包都会落在 .venv 目录下,不会影响 conda 环境。
- 根据 nvidia-smi 安装匹配的 PyTorch
关键认知:CUDA 驱动是向后兼容的。nvidia-smi 显示的 CUDA 版本是驱动支持的最高版本,只要 PyTorch 编译时使用的 CUDA 版本 ≤ 该版本,就能正常运行。
动态选择 PyTorch 版本:
# 查看当前 CUDA 驱动版本
nvidia-smi
# 输出示例:CUDA Version: 12.6
# 根据驱动版本选择合适的 PyTorch 索引 URL
# 常见对应关系(截至 2025 年):
# CUDA 12.6 → 使用 cu121 的包(官方最新稳定版)
# CUDA 11.8 → 使用 cu118 的包
# CUDA 11.7 → 使用 cu117 的包
# 我这里 CUDA 12.6,因此安装 cu121 版本:
pip install torch torchvision torchaudio --index-url https://download.pytorch.org/whl/cu121
pip install torch==2.1.1 torchvision==0.16.1 torchaudio==2.1.1 --index-url https://download.pytorch.org/whl/cu118
如果想自动适配,可以写一段脚本判断 CUDA 版本后选择 URL,但手动确认更可靠。
验证:
import torch
print(torch.__version__) # 应包含 cu121 后缀
print(torch.cuda.is_available()) # True
- 导出环境依赖
在项目根目录(激活 venv 环境后)执行:
pip freeze > requirements.txt
这个 requirements.txt 会记录所有通过 pip 安装的包及其精确版本,包括 PyTorch 相关包。 注意:如果 PyTorch 是从自定义索引安装的,requirements.txt 中不会记录索引 URL,后续安装时需要指定 --index-url 参数,或者在 requirements.txt 中手动添加 --index-url 行(部分工具支持)。建议在 README 中注明安装命令:
pip install -r requirements.txt --index-url https://download.pytorch.org/whl/cu121
- 根据他人的 requirements.txt 安装环境
当你拿到同事提供的 requirements.txt,且其中包含 PyTorch 等需要特定索引的包时:
# 1. 创建 conda 环境并激活
conda create -n new_project python=3.10 -y
conda activate new_project
# 2. 创建 venv 项目环境
python -m venv .venv
source .venv/bin/activate # 或 Windows 对应命令
# 3. 升级 pip 并安装
pip install --upgrade pip
pip install -r requirements.txt --index-url https://download.pytorch.org/whl/cu121
如果 requirements.txt 中已经包含了 --index-url 的声明(通过 -i 或 --extra-index-url),则直接 pip install -r requirements.txt 即可。
遇到的问题与解决方法
- 问题:安装 PyTorch 后 torch.cuda.is_available() 返回 False。 排查:检查驱动版本(nvidia-smi),确认 ≥ 12.1;检查 torch 版本是否包含 +cu 后缀,若装了 CPU 版本需卸载重装。 解决:用正确的 index-url 重装。
- 问题:在 conda 环境内创建 venv 后,python 指向的是 conda 的 Python 还是 venv 的? 验证:which python(Linux/macOS)或 where python(Windows)。激活 venv 后,python 应指向 .venv/bin/python,且 pip 也指向 venv 内的 pip。这样确保后续安装的包隔离在 venv 中。
- 问题:导出 requirements.txt 后,同事安装时遇到“找不到 torch”错误。 原因:requirements.txt 中 torch 版本如 torch==2.5.1+cu121,但默认 PyPI 没有这个版本,需要指定索引。 解决:在安装命令中追加 --index-url download.pytorch.org/whl/cu121,或… URL 写入 pip.conf。
- 问题:旧版 pip 安装 PyTorch 时提示找不到匹配的 wheel。 解决:养成安装任何大型库之前先 pip install --upgrade pip 的习惯。
收获与总结
通过这次实践,我掌握了几个关键技能:
-
CUDA 版本与 PyTorch 版本的匹配原则:驱动版本 ≥ 预编译包所需的 CUDA 版本即可,不必强求版本号一致。
-
双层隔离环境:conda 负责 Python 版本管理,venv 负责项目依赖隔离,既利用 conda 的便捷性,又保持与标准 Python 工具链的兼容性。
-
依赖文件的正确用法:requirements.txt 适合跨平台分享,但需要额外处理自定义索引;导出时注意记录完整依赖,安装时明确索引 URL。
-
环境复现的标准化:在项目根目录保留 requirements.txt 和清晰的安装说明,确保任何成员都能一键重建环境。
以后遇到新项目,我会第一时间按上述流程搭建干净、可复现的开发环境,并在 README 中注明 PyTorch 索引地址,让协作更顺畅。