2. Conda环境搭建与常见问题:如何用Miniconda搞定AlphaFold专用环境
Conda环境,说白了就是给AlphaFold搭一个“隔离的小窝”。你想想看,AlphaFold依赖的Python版本、CUDA工具链、TensorFlow版本,跟系统里其他深度学习项目八成会打架。我刚开始搞AlphaFold的时候,就因为在base环境里直接装,结果跟PyTorch项目冲突,整整折腾了两天。从那以后,我养成了一个习惯——每个项目一个独立Conda环境,干净、可复现、随便删。
2.1 为什么非用Miniconda不可?
其实很多新手会问:“Anaconda不是更全吗?”我个人习惯用Miniconda。原因很简单:Anaconda预装了上百个包,其中大部分你用不上,还容易引发版本冲突。Miniconda只有Python和conda本体,你需要什么再装什么。AlphaFold的依赖链非常具体,用Miniconda可以少踩很多坑。
核心原则:每个AlphaFold版本对应一套固定依赖,用环境快照锁住,不要混用。
2.2 安装Miniconda(如果你还没装)
这里只讲Linux环境,毕竟AlphaFold跑在Linux服务器上最稳。我在项目中遇到过一些同事用Windows WSL,虽然也能跑,但GPU直通和文件路径问题很多,我不推荐。直接上Ubuntu 20.04或22.04就好。
# 下载Miniconda安装脚本
wget https://repo.anaconda.com/miniconda/Miniconda3-latest-Linux-x86_64.sh
# 运行安装(记得用bash)
bash Miniconda3-latest-Linux-x86_64.sh
# 安装过程中会问是否初始化conda,选yes
# 安装完成后退出终端重新打开,或者source ~/.bashrc
我曾经在服务器上忘了加bash前缀直接执行.sh,导致安装路径不对。记住:bash Miniconda3-latest-Linux-x86_64.sh。
2.3 创建AlphaFold专用环境
核心命令就这么一行:
conda create -n alphafold python=3.10 -y
为什么要用Python 3.10?AlphaFold 2.3版本官方推荐3.10。Python 3.11编译某些依赖可能会挂,3.9又太老。嗯,这里要注意,不是所有环境都能用最新版Python。激活环境:
conda activate alphafold
激活后,命令行前面会出现(alphafold)前缀。如果没出现,说明没激活成功,可以检查下conda init是否做了。
2.4 安装AlphaFold核心依赖
AlphaFold的官方GitHub仓库提供了environment.yml文件。我建议直接用它,但有个小技巧——先手动装CUDA和TensorFlow,再用YML装其他包,能减少版本冲突。
下面是我在实际项目中总结的安装流程:
| 步骤 | 命令 / 操作 | 说明 |
|---|---|---|
| 1 | conda activate alphafold |
进入环境 |
| 2 | pip install tensorflow==2.9.0 |
AlphaFold 2.3依赖TF 2.9 |
| 3 | conda install -c conda-forge openmm pdbfixer |
分子模拟工具,容易pip装错 |
| 4 | pip install "jax[cuda11_cudnn82]==0.3.25" -f https://storage.googleapis.com/jax-releases/jax_cuda_releases.html |
GPU版JAX,注意cuda版本 |
| 5 | pip install alphafold==2.3.0 |
最后装AlphaFold本体 |
千万不要直接用pip install alphafold而不指定版本。我见过有人装到了2.4.0(当时还没发布),结果依赖全乱,一天白费。
2.5 环境冲突排查方法
最怕的就是装到一半告诉你依赖冲突。Condad 的依赖解析器本身不算聪明,我分享几个摸爬滚打出来的排查思路。
2.5.1 先用conda info看清底牌
# 查看当前环境的包列表和渠道
conda list -n alphafold
# 查看Python版本
python --version
# 查看conda本身版本(老版本解析器弱)
conda --version
如果conda版本低于4.10,我建议先升级conda:conda update conda -n base。老版本解析器会给出“Solver could not find a solution”这种大而化之的错误。新版至少会告诉你哪个包冲突。
2.5.2 锁定冲突的包名
报错信息里一般会有类似Package XXX requires YYY >=1.0, but you have YYY 0.9。把冲突的那几个包单独拎出来,用conda search看看有哪些版本:
conda search tensorflow
找到同时兼容的版本范围。我曾经在装AlphaFold时遇到openmm和pdbfixer版本对不上,后来发现从conda-forge渠道安装能解决——因为社区维护的版本更全。
2.5.3 使用mamba代替conda
mamba是conda的C++重写版,解析依赖速度快10倍,而且能给出更清晰的冲突报告。安装方式:
conda install -c conda-forge mamba
之后所有conda install都可以用mamba install替代。我在项目中,几乎所有Conda环境都用mamba来建,再也没被“Solving environment: failed with initial frozen solve”卡住过。
2.5.4 暴力删除重建法
如果冲突太多,不如推倒重来:
conda deactivate
conda remove -n alphafold --all -y
# 重新创建
conda create -n alphafold python=3.10 -y
conda activate alphafold
然后按上面表格的顺序,一个一个装。别偷懒一次装完——每装一个包就检查一下是否成功,能定位到底是哪一步出了乱子。
2.6 一张图看懂Conda环境搭建流程
我把整个流程画成了SVG图,方便你对照操作:
2.7 常见报错与对应处理
下面是我在项目里遇到最多的几个环境问题,直接上表:
| 错误提示 | 可能原因 | 我的解决方案 |
|---|---|---|
Solving environment: failed with initial frozen solve |
conda版本低或依赖过多 | 换成mamba;或者用conda config --set channel_priority flexible |
CUDA driver version is insufficient |
系统驱动版本低于TensorFlow要求 | 运行nvidia-smi查看驱动,升级到450+;或者装CUDA 11.2对应版本 |
No matching distribution found for jax[cuda] |
JAX的CUDA版本与Python/系统不匹配 | 明确指定版本:jax==0.3.25 jaxlib==0.3.25+cuda11.cudnn82 |
ImportError: libcuda.so.1: cannot open shared object file |
CUDA库路径未配置 | export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH |
2.8 环境导出与复现
当你终于调通了一个可以跑的环境,一定要把它导出来。我吃过一次亏:服务器重启后,系统包被脚本覆盖,环境全乱。后来我学会了锁环境:
# 导出当前环境的精确版本列表
conda list --explicit > alphafold_environment.txt
# 或者导出YML(包含pip依赖)
conda env export -n alphafold -f alphafold_env.yml
建议两种都做一份。YML方便跨平台分享,TXT是精确包地址,可以离线安装。
导出的YML里会有prefix: /home/.../alphafold这一行,别人用的时候要删掉,否则安装时会直接硬编码路径。
恢复环境:
conda create -n alphafold_restore --file alphafold_environment.txt
这样以后在任何一台新服务器上都能一键复现,省得重新踩坑。嗯,说白了,环境管理就是做一次、记一次、传一次。