4. Conda虚拟环境搭建:Miniconda安装、环境创建与切换、常用包的版本管理
说到环境管理,我接触过的团队里,七八成都是因为环境冲突把项目搞崩过。你想想看,一个项目依赖PyTorch 1.10,另一个依赖2.0,全装到系统Python里——不炸才怪。我个人习惯是,每个项目一开始就建独立的Conda环境,从根上隔离依赖。
4.1 为什么非用虚拟环境不可
深度学习项目依赖的包版本极其敏感。举个例子,我去年维护过一个药物分子生成模型,它要求PyTorch 1.12.0 + CUDA 11.3,而团队另一个靶点预测项目需要PyTorch 2.0.1 + CUDA 12.1。如果没有虚拟环境,这两个项目的水土冲突会让你天天花时间重装包。
| 对比项 | 系统Python | Conda虚拟环境 |
|---|---|---|
| 包隔离 | 全部共享 | 每个环境独立 |
| Python版本 | 固定 | 每个环境可不同 |
| CUDA版本 | 只能装一套 | 按需搭配 |
| 删除重建 | 容易污染 | 一条命令清干净 |
一句话总结:虚拟环境 = 项目的独立「沙盒」,你怎么折腾都不影响别人。
4.2 Miniconda 安装
我推荐用Miniconda而不是完整版Anaconda。Anaconda预装了一堆你用不上的包,而Miniconda只带基本的conda和Python。说白了,你需要什么装什么,磁盘占用少很多。
4.2.1 Linux 环境安装
下载安装脚本,然后执行:
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
bash Miniconda3-latest-Linux-x86_64.sh
安装过程中会问你许可协议和安装路径。我一般保持默认路径 ~/miniconda3。最后一步会问你是否自动初始化conda,选yes就好。
小技巧:如果你不想每次启动终端都自动激活base环境,可以设置 conda config --set auto_activate_base false。这样按需激活,不挡手。
4.2.2 macOS 安装
和Linux类似,用pkg安装包或者命令行都行。我个人习惯命令行:
curl -O https://repo.anaconda.com/miniconda/Miniconda3-latest-MacOSX-x86_64.sh
bash Miniconda3-latest-MacOSX-x86_64.sh
M1/M2芯片的Mac注意选 Miniconda3-latest-MacOSX-arm64.sh。
4.2.3 Windows 安装
去官网下载exe安装包,一路Next。安装时记得勾选「Add Miniconda to my PATH environment variable」,否则你需要在终端里手动定位。我之前帮同事排查问题,他忘了勾选,结果每次用conda都得输全路径——很痛苦。
4.3 环境创建与切换
4.3.1 创建新环境
conda create -n drug_target python=3.10
-n 后面是环境名,你可以起个有意义的名字,比如项目名。
如果你想指定更多依赖,可以在创建时就列好:
conda create -n pytorch_project python=3.10 pytorch=2.1.0 torchvision cudatoolkit=11.8
4.3.2 激活与切换
conda activate drug_target # 进入环境
conda deactivate # 退出当前环境
conda info --envs # 列出所有环境
我记得有一次,我同时维护着三个环境:一个用于模型训练(依赖PyTorch),一个用于ONNX导出(依赖onnxruntime),还有一个用于模型量化(依赖tensorrt)。频繁切换时,我一般先 conda deactivate 再 conda activate,避免环境残留。
警告:千万别在base环境里装生产项目的依赖包!base环境是用来管理conda本身的,乱装包可能导致conda升级出问题。我曾经因为这个把base的Python搞坏,不得不重装Miniconda。
4.4 包的版本管理
4.4.1 安装特定版本
conda install numpy=1.21
pip install torch==2.0.1
注意:能用conda装的尽量用conda装,因为它会帮你解决依赖冲突。实在找不到的,再用pip。
4.4.2 查看已安装包
conda list
conda list | grep numpy
4.4.3 更新与回滚
conda update numpy
conda install numpy=1.20 # 降级回旧版本
降级可能出现依赖冲突,这时候conda可能会提示你删除一些包。我会先看它建议的方案,如果觉得可行就确认,否则用 conda install --no-deps 强行装,但需要你自己保证兼容性。
4.4.4 导出和重建环境
conda env export > environment.yml
conda env create -f environment.yml
这个操作用于团队协作或部署时复现环境。我每次提交代码前都会导出一份 environment.yml,确保队友和服务器能跑出一样的结果。
实践经验:导出时默认会带上当前环境的平台信息和版本号。如果你想跨平台共享,可以用 conda env export --no-builds,去掉build标识,兼容性更好。
4.5 Conda 虚拟环境核心流程
4.6 常见问题与避坑
- conda 命令找不到:检查PATH里有没有
~/miniconda3/bin。重新运行conda init可以修补。 - 环境删不掉:用
conda remove -n env_name --all。我碰到过一次因为文件锁删不了,重启终端就好了。 - pip 和 conda 混装:尽量先用conda装环境,再个别用pip补。混装太多容易导致依赖解析出问题。
- 磁盘空间:
conda clean --all可以清理缓存包和未使用的索引,我每个月跑一次,能释放几个G。
我的习惯:每个项目根目录放一个 environment.yml,并且在README里写清楚创建环境的命令。这样任何人拿到代码,三分钟就能把环境搭好。
嗯,Conda这块其实没那么复杂。核心就三步:装Miniconda → 创建环境 → 激活并装包。剩下的就是用好导出和导入,让你在不同机器上保持环境一致。你试试看,一个项目一个环境,干净利落。