4. VEP安装与配置

VEP的安装,说实话,比ANNOVAR要复杂一点。它依赖的组件多,需要你耐心处理好每一步。我自己第一次装的时候,也踩了几个坑。今天就把这些经验都掰开揉碎,讲给你听。

整个配置流程,可以归纳为下面这幅图。你看看就明白了。

VEP 安装与配置核心流程 第一步:下载VEP 方式A:Git仓库 clone 方式B:release tarball 方式C:Docker 镜像 第二步:Ensembl API (Perl) 配置 核心模块:Bio::EnsEMBL::VEP 推荐用 cpanm 或 BioConda 环境变量:PERL5LIB 务必指向 VEP 的 modules 目录 第三步:缓存设置 物种与版本选择 索引文件(.idx) .vep 缓存结构

核心要点:VEP的配置其实就三件事——拿到代码、搭好环境、下好数据。很多人卡在第二步的依赖上,我建议你先看看自己的Perl版本。

4.1 下载VEP的三种方式

VEP的代码托管在GitHub上,Ensembl官方的组织下。你不用纠结选哪个,看场景决定就行。

方式 适用场景 优点 缺点
Git clone 需要最新开发版或频繁更新 随时获取最新功能 依赖git,版本不够稳定
Release tarball 绝大多数生产环境 稳定、可复现 不能热更新,得重新下载
Docker 镜像 不想折腾依赖、快速上手 开箱即用,隔离干净 缺少灵活性,不好改插件

我个人最常用的是 tarball 方式。为什么呢?因为一旦装好,在项目交付期间我不用担心它突然变版本。来,直接看命令行。

# 方法一:Git clone(适合想尝鲜的)
git clone https://github.com/Ensembl/ensembl-vep.git
cd ensembl-vep

# 方法二:Release tarball(推荐,稳定)
wget https://github.com/Ensembl/ensembl-vep/archive/release/110.tar.gz
tar -xzf 110.tar.gz
cd ensembl-vep-release-110

# 方法三:Docker 镜像(最快上手)
docker pull ensemblorg/ensembl-vep

注意:下载前记得确认你的服务器能访问GitHub。我曾经在内网环境折腾了半天,才发现是防火墙把wget给拦了。内网用户可以考虑让同事帮忙下载tarball再scp过去。

4.2 安装核心依赖:Ensembl API

VEP用Perl写的。它依赖Ensembl的Perl API。这一步最容易被忽略,也最容易被卡住。

4.2.1 一键安装脚本

官方提供了一个install脚本。它会自动下载并配置所有Perl依赖模块。嗯,这个脚本我强烈推荐先试跑一次,它能帮你省掉很多手动装模块的苦力活。

# 进入VEP目录
cd ensembl-vep-release-110

# 运行安装脚本(会自动下载API和依赖)
perl INSTALL.pl --SPECIES homo_sapiens --ASSEMBLY GRCh38 --NO_UPDATE

# 如果你想同时安装多个物种,可以加上逗号分隔
# perl INSTALL.pl --SPECIES homo_sapiens,mus_musculus

运行过程中,你会看到屏幕上刷刷刷地打印日志。如果前面编译Bio::DB::HTS等模块失败,不要慌,它会提示你缺少系统库。

经验:很多人卡在cpan模块安装失败。这时候你检查一下有没有安装build-essential(或gcc、g++、make)。另外,zlib1g-dev和libcurl4-openssl-dev这两个包是常被忽略的。装上它们,很多编译错误就消失了。

4.2.2 手动配置 PERL5LIB

安装完成后,如果你不想每次都靠在脚本目录下执行命令,就需要配置环境变量。把这一行写进你的 ~/.bashrc 或 ~/.zshrc 里。

# 假设VEP安装在 /opt/ensembl-vep
export PERL5LIB=/opt/ensembl-vep/modules:$PERL5LIB

# 如果你还装了BioPerl等额外模块,也加进来
# export PERL5LIB=/path/to/bioperl/lib:$PERL5LIB

配置完了记得 source ~/.bashrc 或者重新开一个终端。用下面这行命令验证一下。

# 检查核心模块是否可加载
perl -MBio::EnsEMBL::VEP::Parser -e 'print "OK\n"'

如果能输出 OK,说明API配置成功了。如果报错说找不到模块,你检查一下 PERL5LIB 路径对不对,或者有没有拼错目录名。

我踩过的坑:有一次我安装了新版本的VEP,但忘了更新PERL5LIB。结果跑VEP一直报符号引用错误。你猜怎么着?它还在用旧版本的API。我花了半小时才发现。所以每次升级后,第一件事就是检查PERL5LIB。

4.3 缓存设置

VEP的运行速度很大程度上取决于缓存。你不装缓存?也可以。但是它会在线去Fetch Ensembl数据库,慢到你怀疑人生。一般来说,生产环境100%要配置缓存。

4.3.1 下载缓存

缓存文件很大。人类的GRCh38缓存动辄几十个GB。你需要提前规划好磁盘空间。建议把缓存放在一个大分区上,专门建一个目录。

# 创建缓存目录
mkdir -p /data/vep_cache

# 用install脚本下载缓存的某个物种
perl INSTALL.pl --SPECIES homo_sapiens --ASSEMBLY GRCh38 --CACHEDIR /data/vep_cache

# 或者手动下载(适合服务器下载慢时用本地传输)
# 缓存tar包地址:
# ftp://ftp.ensembl.org/pub/release-110/variation/indexed_vep_cache/homo_sapiens_vep_110_GRCh38.tar.gz

下载完成后,缓存目录结构大概长这样。

ls -lh /data/vep_cache/homo_sapiens/

# 你会看到类似于:
# 110_GRCh38/
# homo_sapiens_vep_110_GRCh38.tar.gz
# homo_sapiens_vep_110_GRCh38.idx
# 还有一些其他索引文件

4.3.2 缓存目录与环境对齐

配置好了缓存,怎么让VEP知道去哪个目录找呢?两个方法:命令行参数或者环境变量。我个人推荐命令行参数,这样不同项目可以灵活的切换缓存版本。

# 方式一:命令行指定(推荐)
vep --cache --dir_cache /data/vep_cache --species homo_sapiens --assembly GRCh38

# 方式二:环境变量(适用于长期固定配置)
export VEP_CACHE=/data/vep_cache

# 然后运行VEP时就可以 --dir_cache $VEP_CACHE
vep --cache --dir_cache $VEP_CACHE

注意:缓存版本必须与VEP版本匹配。比如你用VEP release 110,就下载release 110的缓存。版本号不对,VEP会直接拒绝运行,报错提示你版本不兼容。我以前就因为升级VEP忘了删旧缓存,导致跑出来的结果全错位。后来养成习惯:升级VEP就同步删旧缓存,干净利落。

4.3.3 缓存的结构与索引

VEP查询缓存文件时,会生成一个索引文件(.idx)。它类似数据库的B-tree。这个索引是VEP加速的关键。如果你把缓存拷贝到另一台机器上,建议重新生成一下索引,避免文件路径变化导致索引失效。

# 重新生成索引
vep --cache --dir_cache /data/vep_cache --species homo_sapiens --assembly GRCh38 --write_index

# 之后你就可以正常跑了

4.4 完整配置核查清单

每次配置完新环境,我会按下面的清单逐个检查。你也不妨照着做一遍,防止漏掉什么。

  1. 检查VEP可执行文件——which vep 是否能找到。
  2. 检查PERL5LIB——运行 perl -MBio::EnsEMBL::VEP::Config -e 'print $INC{"Bio/EnsEMBL/VEP/Config.pm"}' 确认模块路径。
  3. 检查缓存目录——ls /data/vep_cache/homo_sapiens/110_GRCh38/ 是否有.vep文件。
  4. 检查缓存版本——用 vep --cache --dir_cache /data/vep_cache --species homo_sapiens --assembly GRCh38 --check_existing 实际运行一次,看是否报错。
  5. 检查磁盘空间——缓存占用很大,df -h /data/vep_cache 看看剩余空间。

总结一下:VEP搞定这三步,后面跑注释就是一路绿灯。第一步下载代码,别怕选错;第二步装好Perl API和模块,环境变量别忘;第三步下好缓存,文件夹路径记牢。每一步我都踩过坑,希望你比我顺利。