1. BLAST简介:从序列比对到启发式搜索
大家好,我是这门课的主讲。今天我们先聊一个基础话题——BLAST。说白了,它就是生物信息学里最常用的“搜索引擎”。你想在几百万条序列里找相似的?用它就对了。
我先说说我的经历。十年前我第一次做基因组注释,面对一堆未知的DNA序列,心里是发懵的。那时候我导师甩给我一句话:“去跑个BLAST。” 好,那我就跑。结果一跑就是三天三夜。为什么?数据量大,算法也没调优。嗯,今天咱们就把这事儿聊透。
1.1 序列比对到底在比什么?
序列比对,核心就一件事:找相似。
你想想看,生物序列不是乱码。DNA由A、T、C、G组成,蛋白质由20种氨基酸组成。两段序列如果长得像,大概率在功能或进化上有关系。这就是比对的生物学基础。
比对有两种常见模式:
- 全局比对(Global Alignment):从头到尾完整对齐。代表作是Needleman-Wunsch算法。
- 局部比对(Local Alignment):只找最相似的片段。代表作是Smith-Waterman算法。
BLAST属于后者。它不傻乎乎地比全长,而是找局部高相似区段。这样效率高得多。
1.2 BLAST算法的核心思路:启发式搜索
这里我得解释一下,为什么BLAST能跑那么快。
经典的Smith-Waterman算法时间复杂度是O(mn)。m和n是两条序列的长度。如果每条序列1000bp,计算量就是一百万次。听起来还好?但如果你的数据库有十亿条序列……完蛋,计算量是天文数字。
BLAST采取了一种“取巧”的策略——启发式搜索。它不做全量计算,而是分三步走:
- 分割查询序列:把长序列切成短片段(通常3-11个字符)。这些片段叫“种子”(seed)。
- 在数据库中找匹配的种子:用哈希表或索引快速定位。这个环节是O(1)的。
- 将匹配的种子向两边延伸:一旦找到匹配,就尝试向左右扩展,直到相似度低于某个阈值。
你发现了吗?BLAST把“全量比对”转换成了“索引查找+局部延伸”。数据库索引一建,查询序列一切,效率立刻起飞。
我早些年在做宏基因组物种注释时,就是靠这套逻辑把运行时间从一个星期压缩到了6小时。嗯,这里要注意:种子长度选错了,会影响灵敏度。
1.3 BLAST算法流程图
下面这张图我亲手画的,展示了BLAST的核心流程。你跟着走一遍就明白了。
1.4 BLAST家族:选对工具很重要
BLAST不是单一的软件,而是一个“家族”。你看名字后缀就知道区别。
| 工具名称 | 查询序列类型 | 数据库类型 | 典型应用场景 |
|---|---|---|---|
| blastn | DNA | DNA | 核苷酸序列比对、基因鉴定 |
| blastp | 蛋白质 | 蛋白质 | 蛋白质功能预测、同源搜索 |
| blastx | DNA(先翻译) | 蛋白质 | 预测未知DNA的编码产物 |
| tblastn | 蛋白质 | DNA(翻译后比对) | 在基因组中找蛋白质同源区 |
| tblastx | DNA(翻译后) | DNA(翻译后) | 远缘物种的保守区域检测 |
我举个例子你就懂了。如果你拿到一段未知的DNA序列,想看看它编码什么蛋白质,用blastx。它会把你的DNA按6种阅读框翻译成蛋白质,再去蛋白库比对。曾有次我在一个细菌基因组里发现一段序列总比对不上,用blastx一查,结果是个新发现的噬菌体整合酶。嗯,这种场景blastn是做不到的。
1.5 BLAST的运行参数:你未必都见过
很多新手跑BLAST就用默认参数。但默认参数是“通用版”,不是“最佳版”。
下面这几个参数,我建议你牢牢记住:
- -evalue:期望值阈值。越小越严格。默认10,我通常用1e-5或更严格。
- -word_size:种子长度。blastn默认11,缩短到7可以提高灵敏度,但会慢很多。
- -num_threads:CPU线程数。很多人忘了设,结果只占了一颗核。
- -outfmt:输出格式。我喜欢6(tabular格式),方便后续处理。
1.6 一个简单的BLAST命令
我展示一条最常用的命令。你以后90%的场景都在用它:
blastn -query my_sequence.fasta \
-db nt \
-out result.txt \
-outfmt 6 \
-evalue 1e-5 \
-num_threads 8 \
-max_target_seqs 10
这条命令的含义:用我的DNA序列去NT库(核酸数据库)里搜,输出10条最相似的结果,每个结果只保留一条最优比对。8个线程并行跑,evalue要求1e-5以上才算有意义。
1.7 为什么BLAST需要GPU集群?
到这里你可能要问了:单机跑BLAST有什么问题?
问题大了。你想想:
- 一个典型的metagenomics数据集有1亿条序列。
- NT数据库已经膨胀到200GB以上。
- 即使你用32核服务器跑blastn,一条序列平均耗时0.5秒。
- 1亿条 × 0.5秒 ≈ 1.6年。
1.6年。
你等得起吗?我等不起。所以我们必须上GPU集群。把查询序列拆成小块,分发到GPU上并行跑BLAST。这才是我们这门课要讲的核心。
一句话总结第一章:BLAST的核心是启发式搜索,靠种子匹配和延伸实现了“快”。但面对大数据集,单机远远不够。GPU集群并行调度,是解决这个问题的唯一出路。