把一批一万个配体扔给 AutoDock-Vina-GPU 2.1,和扔给常规的 CPU 版 Vina,用户体验完全不是一回事。我在实验室里第一次跑完 GPU 版之后,直接把排队的虚拟筛选脚本全部改掉,不是因为它“快了多少倍”的纸面数据,而是同样的任务不再需要等一个周末;它把配体构象采样和打分函数评估拆成了海量并行任务,批任务几乎是“扫”着跑完。
但说回这款软件的安装,很多人真正卡住的不是编译那几分钟,而是底层环境里驱动、OpenCL/CUDA、CMake 之间互相不对付。尤其是第一次装的人,经常在一个看似无关紧要的依赖上消耗一下午。这篇文章就写我怎么把这个 2.1 GPU 版从一台相对干净的新机器上装起来、跑通、再挂进批量筛选流程的全过程,适合做结构生物学、药物化学、分子对接方向的同学,也适合手里有张显卡但不想花太多时间折腾驱动的人。
1. 为什么值得折腾 GPU 版:加速来源和适用边界
刚开始接触分子对接的人往往会问一个问题:Vina 不是已经有 CPU 版了吗?为什么还要单独维护一个 GPU 版,安装的时候还多出这么多变量?
答案很简单:AutoDock Vina 这类基于打分函数和随机搜索的软件,整个计算过程由两个高开销部分组成——打分函数计算和构象空间搜索。一个配体有大量可旋转键时,构象搜索的采样点数目会指数上升。CPU 版在这部分只能靠有限的线程轮流算,而 GPU 版则把“评价一批构象的分数”这件事改造成可以同时上千个线程执行的并行任务。
AutoDock-Vina-GPU 2.1 不是换了个壳的旧程序。它基于 Vina 1.2 时代的评分模型,把能量项计算和优化过程移植到 GPU kernel 上,同时保留 Vina 的搜索算法框架。也就是说,你原来熟悉的 receptor.pdbqt、ligand.pdbqt、盒子中心这些概念依然成立,只是底层计算引擎换了。
1.1 GPU 到底把时间花在哪一步省了下来
我自己的使用感受是:加速收益最明显的是“配体数量大、单个配体构象空间中等”的场景。比如一个虚拟筛选任务里有几十万个小分子,每个分子几万次构象评估,这个规模是最适合 GPU 的。CPU 版在这一步通常是逐一处理配体、逐代进化、反复打分,GPU 版则可以一次同时评估多组构象。
GPU 版跑批任务时,CPU 主要负责文件解析、网格映射、逻辑控制和 I/O,打分和局部优化放在 GPU 上。所以你会观察到:命令行启动后,有一个短暂的 CPU 高占用阶段,那是它在做格点预计算和准备输入;紧接着 GPU 利用率拉满,CPU 占用反而掉下来,这个阶段就是真正的并行打分。
对单个配体做单次对接时,GPU 版的启动和初始化成本会被摊薄得不明显,如果机器本身比较老,单任务甚至未必比 CPU 快多少。但只要你把任务数堆积起来,让它持续“吃饱”,收益就会变得非常直观。我习惯把 GPU 版比喻成一个流水线工厂,CPU 版是一个大师傅,活少的时候大师傅更灵活,活一多,流水线的吞吐量优势就完全压不住了。
1.2 什么样的算力水平适合上 GPU 版
先给一个非常主观的结论:如果你手头的任务是单个靶点、几十个配体的课堂作业,CPU 版已经够用,没必要折腾 GPU。但如果你要跑 >5000 个配体的筛选,或者你的靶点需要反复调盒子、换构象做多轮对接,那么 GPU 版能帮你把任务从“按天等”变成“按小时等”。
硬件方面,显存并不是越大越好,但确实有个舒适下限。绝大多数常规靶点、配体分子量在 500 以内的任务,2GB 显存基本能跑,4GB 以上会比较从容。因为 Vina 的搜索需要把格点图和相关数据结构放进显存,盒子设得越大、体系原子数越多,显存占用上升越快。如果是超大体系,比如把整个蛋白二聚体都框进很大的盒子里,8GB 显存也可能紧张。
图形卡和专业计算卡都能跑。NVIDIA 的 GTX/RTX 系列、AMD 的 Radeon 系列都有人在实际用。真正影响安装选择的不是显卡品牌,而是你准备用哪套后端。
1.3 CUDA 还是 OpenCL:先想清楚再动手
AutoDock-Vina-GPU 2.1 的源码里通常同时提供两套后端:CUDA 和 OpenCL。选择后端这件事最好在装驱动之前就定下来,因为它直接影响你要不要装 CUDA Toolkit。
- CUDA 后端:只支持 NVIDIA 显卡,性能通常更稳定,官方维护和社区讨论也多。缺点是必须装 CUDA Toolkit,且 Toolkit 版本和驱动版本之间有小范围的兼容窗口。
- OpenCL 后端:兼容 NVIDIA、AMD、Intel 等各类显卡,只要显卡驱动能提供 OpenCL runtime 就可以编译。安装依赖相对轻,不过不同厂商驱动的 OpenCL 实现质量参差不齐,偶尔会遇到同样的代码在不同卡上性能差距很大。
我个人的建议是:如果你是 NVIDIA 卡且主要跑自己的计算任务,优先用 CUDA 后端;如果你手头的机器可能是 AMD 卡,或者你需要在一台机器上兼容后续换卡的可能,就选
