依赖包安装错误及解决:常见失败原因与实战排雷
坦白说,安装依赖这事,我踩过的坑比你们想象的多得多。AlphaFold 的依赖链又长又复杂,一个包装不上,整个项目就卡住。这一节我不跟你念官方文档,咱们就聊聊那些真正折磨过我的问题,以及我是怎么把它们搞定的。
核心观点: 依赖安装失败,90% 的情况逃不出三个原因——网络抽风、版本互怼、系统库缺失。搞懂这三类,你就能解决绝大部分问题。
3.1 网络问题:最烦人,但也最好解决
为什么会这样?明明pip下来版本号对的,结果进度条走到一半就Timeout了。AlphaFold依赖动辄几十个包,每个几十兆,断一次你就得重新下。我早期在公司内网搭AlphaFold时,这个问题几乎每天遇到。
典型现象:
# pip安装卡住,然后报红
pip install openmm==7.5.1
# 报错示例
WARNING: Retrying (Retry(total=4, connect=None, read=None, redirect=None, status=None))
... after connection broken by 'ReadTimeoutError(... HTTPSConnectionPool(host='files.pythonhosted.org', port=443) ...'
我个人的解决方法,优先级从高到低:
- 换国内镜像源——这是最快的方法。我用的是清华源或阿里云源,基本没再见过超时。
- 临时切换命令:
pip install openmm==7.5.1 -i https://pypi.tuna.tsinghua.edu.cn/simple
# conda也可以指定频道
conda install -c conda-forge openmm --channel https://mirrors.tuna.tsinghua.edu.cn/anaconda/cloud/conda-forge/
一点经验: 我个人习惯把pip.conf直接写死,省得每次手动加参数。写一个 ~/.pip/pip.conf,内容如下:
[global]
index-url = https://pypi.tuna.tsinghua.edu.cn/simple
trusted-host = pypi.tuna.tsinghua.edu.cn
conda的话,运行 conda config --add channels https://mirrors.tuna.tsinghua.edu.cn/anaconda/pkgs/main/ 一劳永逸。
如果换了源还报错,可能是包被墙了。我记得有一次装 AlphaFold 的官方轮子,pip 死活找不到包。后来一看,有人把包上传到了 PyPI 但国内主源没同步。解决办法是直接用 pip install --no-index 结合本地 .whl 文件安装。
# 先在能访问的机器上下载
pip download openmm==7.5.1 -d ./offline_pkgs
# 再传到内网机器上本地安装
pip install --no-index --find-links ./offline_pkgs openmm==7.5.1
3.2 版本冲突:AlphaFold 的“老情人”难题
嗯,这里要重点讲。AlphaFold 对依赖版本管得特别严,尤其是 TensorFlow、CUDA、OpenMM 这几个大户。你想想看,AlphaFold 2.3.x 要求 TensorFlow 2.9.x 加 CUDA 11.x,你要是不小心装了 TensorFlow 2.13,不好意思,直接给你报错。
常见冲突矩阵:
| AlphaFold 版本 | 推荐 TensorFlow | 推荐 CUDA | 常见冲突表现 |
|---|---|---|---|
| 2.3.x | 2.9.x | 11.x | Failed to get convolution algorithm |
| 2.2.x | 2.8.x | 11.x | Could not load dynamic library 'libcudart.so.11.0' |
| 2.1.x | 2.7.x | 11.2 | AttributeError: module 'tensorflow' has no attribute 'version' |
我的排错顺序:
- 先锁定 AlphaFold 版本——从官方 GitHub 的 environment.yml 里找到 protobuf、tensorflow、openmm 的精确锁版本。
- 用 conda 而不是 pip——conda 的依赖解决器比 pip 强太多。我遇到过 pip 装 tensorflow 2.9 死活报 Python 版本不符,conda 一句命令就搞定。
- 善用 —no-deps——如果你已经知道哪些包是冲突源,可以手动逐个装。
# 先用conda创建一个干净的虚拟环境
conda create -n alphafold python=3.9
conda activate alphafold
# 严格按照官方lock版本装
conda install -c conda-forge openmm=7.5.1
pip install tensorflow==2.9.0 --no-deps
# 装完跑个测试
python -c "import tensorflow as tf; print(tf.__version__)"
曾经我踩过的坑: 有一次我图省事,直接pip install -r requirements.txt,结果装了高版本的 numpy,跟 alphaFold 内部依赖冲突,模型推理的时候每个 batch 都报 shape mismatch。浪费了我一上午。从那以后,我坚持用 conda lock 或者官方 docker 镜像。
另一个常见冲突是 protobuf 版本。TensorFlow 2.9 要求 protobuf >=3.9.0,<3.20。但很多人的系统有老版本 protobuf 或者 conda-forge 频道推了 4.x,一装就炸。解决方法是强制锁定版本。
# 锁定 protobuf
pip install "protobuf>=3.9.0,<3.20"
3.3 系统库缺失:Linux 依赖管理
AlphaFold 不是纯 Python 项目,它底层依赖 OpenMM、HHsuite、kalign 这些 C++ 库。你在 pip install 时可能不报错,但一跑 inference,直接 Segmentation fault(段错误)。为什么?因为系统里缺了 libcuda.so、libopenmm.so 或者 libhwloc 等动态库。
我遇到的最经典的一个例子: 装 OpenMM 时编译成功,但运行报错:
OpenMM Error: Could not load CUDA module: libcuda.so: cannot open shared object file
这其实是 CUDA 驱动没装对,或者 CUDA 库路径没加到 LD_LIBRARY_PATH 里。你看,pip 只装 Python 包,不帮你管理系统级依赖。
我的标准操作流程:
- 装系统级依赖包:
# Ubuntu/Debian
sudo apt-get install -y \
build-essential \
cmake \
libgl1-mesa-glx \
libglib2.0-0 \
libsm6 \
libxext6 \
libxrender-dev \
libgomp1 \
libcudart11.0 \
libopenmm-dev
# CentOS/RHEL
sudo yum install -y \
openmm-devel \
hwloc-devel \
mesa-libGL
- 确认 CUDA 库路径:
# 查看 CUDA 安装路径
ls /usr/local/cuda/lib64/libcuda.so*
# 或者 nvidia-smi 能看到 driver 信息,但 lib 找不到
# 设置库路径
export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH
# 永久写入 ~/.bashrc
echo 'export LD_LIBRARY_PATH=/usr/local/cuda/lib64:$LD_LIBRARY_PATH' >> ~/.bashrc
- 验证 OpenMM 能否加载 CUDA:
python -c "import openmm; print(openmm.Platform.getPlatformByName('CUDA'))"
核心原则: 别在 pip 里死磕系统库的问题。pip 管不了 libcuda.so,你得用系统包管理器(apt/yum/brew)或者手动下载安装。如果 nvidia-smi 能跑但 OpenMM 报错,100% 是 LD_LIBRARY_PATH 没设对。
我个人还遇到过 HHsuite 依赖的问题。AlphaFold 需要 hhsuite 进行多序列比对,它的二进制文件(如 hhblits)要放在 PATH 里。如果没装或者版本太老,AlphaFold 脚本会直接报“command not found: hhblits”。解决方法是手动下载编译好的二进制,或者用 conda 安装:
conda install -c bioconda hhsuite==3.3.0
# 然后确认是否在 PATH 里
which hhblits
一个小技巧: 我习惯在安装完所有依赖后,运行一个快速验证脚本,检查关键组件是否都能正常加载。把这几个检查写成一个 shell 脚本,每次新环境都跑一遍:
#!/bin/bash
echo "=== Python version ==="
python --version
echo "=== TensorFlow CUDA ==="
python -c "import tensorflow as tf; print(tf.config.list_physical_devices('GPU'))"
echo "=== OpenMM Platform ==="
python -c "import openmm; print(openmm.Platform.getNumPlatforms())"
echo "=== HHsuite ==="
which hhblits
echo "=== Kalign ==="
which kalign
花了三分钟跑一遍,能避免后续调模型时各种灵异报错。
3.4 万能兜底策略:从零开始搭 Conda + Docker
如果上面的方法还是救不了你,别纠结。我当时在一台新的 GPU 服务器上搭 AlphaFold,折腾了整整两天。最后我选择了最稳的路径:直接用官方 Docker 镜像。它帮你把 CUDA 驱动、系统库、Python 依赖全打包好了,你只需要做一件事:
# 拉取官方镜像(以 DeepMind 为例)
docker pull deepmind/alphafold:latest
# 运行
docker run --gpus all -v /path/to/data:/data deepmind/alphafold:latest \
--fasta_paths=/data/sequence.fasta \
--output_dir=/data/output
当然,不用 Docker 也完全可以。你可以重新创建 conda 环境,严格按官方 environment.yml 来。我建议你每次都这么做,而不是在旧环境上改来改去。
conda env create -f environment.yml
# 注意:environment.yml 里包含了所有精确版本号
# 不要自己改版本号,除非你清楚后果
切记: 不要用 pip 和 conda 混合安装同一个包(比如 tensorflow)。要么全 conda,要么全 pip,否则很容易产生"幽灵版本"——两个渠道各装了一个版本,Python 调用时不知道用哪个,导致行为不可预测。
好了,这一章的内容就这么多。依赖安装这事,说白了就是耐心加方法。遇到报错了,先别急着百度——看清楚报的是什么错误类型,再对症下药。我当年的感觉就是,踩过一次坑,以后就会长记性了。