4、VEP安装与配置:下载、Ensembl API、缓存设置
VEP的安装,说实话,比ANNOVAR要复杂一点。它依赖的组件多,需要你耐心处理好每一步。我自己第一次装的时候,也踩了几个坑。今天就把这些经验都掰开揉碎,讲给你听。
整个配置流程,可以归纳为下面这幅图。你看看就明白了。
核心要点: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 完整配置核查清单
每次配置完新环境,我会按下面的清单逐个检查。你也不妨照着做一遍,防止漏掉什么。
- 检查VEP可执行文件——
which vep是否能找到。 - 检查PERL5LIB——运行
perl -MBio::EnsEMBL::VEP::Config -e 'print $INC{"Bio/EnsEMBL/VEP/Config.pm"}'确认模块路径。 - 检查缓存目录——
ls /data/vep_cache/homo_sapiens/110_GRCh38/是否有.vep文件。 - 检查缓存版本——用
vep --cache --dir_cache /data/vep_cache --species homo_sapiens --assembly GRCh38 --check_existing实际运行一次,看是否报错。 - 检查磁盘空间——缓存占用很大,
df -h /data/vep_cache看看剩余空间。
总结一下:VEP搞定这三步,后面跑注释就是一路绿灯。第一步下载代码,别怕选错;第二步装好Perl API和模块,环境变量别忘;第三步下好缓存,文件夹路径记牢。每一步我都踩过坑,希望你比我顺利。