1、课程介绍:RNA-seq 技术背景、Cromwell 优势、全流程概述

RNA-seq 到底是什么?

RNA-seq,全称是 RNA 测序。说白了,就是把细胞里所有的 RNA 分子(主要是 mRNA)拿出来,打成小片段,上高通量测序仪读出来,然后通过计算分析,回答两个核心问题:

  • 哪些基因在表达? —— 定性分析
  • 表达量有多高? —— 定量分析

我记得刚入行时,手写脚本跑一套简单的 RNA-seq 流程,从 fastq 到表达矩阵,大概要折腾三天。中间但凡有一个工具版本不兼容,或者服务器掉线,就得从头再来。到现在,我们用 Cromwell 这样的工作流引擎,一次配置,全自动化执行,还能自动重试失败的任务。效率完全不在一个量级上。

你可能会问:RNA-seq 分析流程有那么复杂吗?我举个例子你就明白了:

步骤 核心工具 输入 输出
质量控制 FastQC, MultiQC 原始 fastq 质量报告
修剪 Trimmomatic, cutadapt 原始 fastq 干净 fastq
比对 STAR, HISAT2 干净 fastq + 参考基因组 BAM 文件
表达定量 featureCounts, Salmon BAM 文件 + 基因注释 GTF 表达矩阵(counts 或 TPM)
差异分析 DESeq2, edgeR 表达矩阵 + 实验设计 差异基因列表
报告汇总 MultiQC, custom R Markdown 中间结果 + 日志 HTML 报告

嗯,光是工具链就有6个环节,每个环节还有参数调优、版本兼容、资源分配的问题。以前我都是靠 Bash 脚本串联,但脚本一旦跑起来,想要监控进度、断点续跑、并行调度,基本靠运气。这也是为什么 Cromwell 成了我个人最推荐的方案。

Cromwell 的优势在哪里?

Cromwell 是 Broad Institute 开发的开源工作流管理系统。专门用来编排、调度、监控复杂的生物信息学流程。

我个人习惯用 Cromwell 替代传统 Shell 脚本,主要看中这几点:

  1. 原生支持 WDL(Workflow Description Language) —— 描述工作流就像写函数定义,输入、输出、步骤依赖写清楚就行,引擎自动调度。
  2. 自动并行与重试 —— 样本多的时候,Cromwell 会自动分配资源并行跑;任务失败后自动重试,不用人工盯着。
  3. 可移植性强 —— 同一份 WDL 可以在本地、HPC 集群、Google Cloud、AWS 上无缝运行。只需要改配置文件,不用改流程本身。
  4. 断点续跑能力 —— 如果流程跑到一半服务器宕机了,重启 Cromwell 后,它会自动从失败的任务继续,不会从头再来。
我建议你在项目初期就用 Cromwell 搭好骨架。我在项目中遇到过不少「先跑通再说,后面再优化」的情况,结果后面样本量翻倍时,脚本跑不动了,还得重写。Cromwell 的 WDL 一旦写对,扩展样本数只是改一个输入列表的事。

全流程概述:从 fastq 到差异基因

下面这张图是我们整个 RNA-seq 全流程的核心骨架。它不是工具列表,而是数据流和决策点的抽象。你往后学每一章,都会回到这张图来定位位置。

Cromwell RNA-seq 全流程核心骨架 原始 fastq 文件 FastQC + MultiQC Trimmomatic / cutadapt STAR 比对 → BAM featureCounts 定量 DESeq2 差异分析 HTML 报告 Cromwell 工作流引擎 自动并行 · 失败重试 · 断点续跑 一次定义,多平台运行 关键决策点 选参考基因组版本 选比对工具(STAR vs HISAT2) 定实验设计矩阵

这个流程看起来是线性的,但实际上每一步都有分支。比如质量控制不过关,你得回到修剪步骤调整参数;比对率太低,可能要换参考基因组或比对器。Cromwell 能很好地处理这种「判断-再跑」的逻辑,因为它支持条件分支和任务依赖。

一个完整的 WDL 工作流长什么样?

这里我给出一个精简版的 WDL 骨架,让你先有个直观印象。不用担心看不懂,后面每一章我都会拆开来讲。

version 1.0

workflow rnaseq_pipeline {
  input {
    Array[File] fastqs
    File genome_fasta
    File gtf
  }

  call quality_control {
    input: fastqs = fastqs
  }

  call trimming {
    input: fastqs = quality_control.clean_fastqs
  }

  call alignment {
    input: fastqs = trimming.trimmed_fastqs,
           genome = genome_fasta
  }

  call quantification {
    input: bam = alignment.sorted_bam,
           gtf = gtf
  }

  output {
    File counts_matrix = quantification.counts
    File alignment_bam = alignment.sorted_bam
  }
}

task quality_control {
  input {
    Array[File] fastqs
  }
  command {
    fastqc ${sep=' ' fastqs}
    multiqc .
  }
  output {
    File report = "multiqc_report.html"
  }
  runtime {
    docker: "biocontainers/fastqc:latest"
    cpu: 2
    memory: "4 GB"
  }
}
我曾经踩过一个坑:一开始写 WDL 时,没有给每个 task 显式指定 docker image,结果在不同服务器上跑出了不一样的结果。因为有的服务器装了老版 STAR,有的装了新版,比对基因模型差很多。后来我规定:所有 task 必须写 runtime 块的 docker 镜像,版本锁定。

你也要注意,WDL 的 runtime 块不是强制的,但不写就等于把可靠性交给了环境。建议每个 task 都写上 docker、cpu、memory。

这个课程会怎么带你学?

整个课程共 30 章,会按照这张骨架图从顶到底顺序展开。每一章我都会给出一份可运行的 WDL 代码、配置文件、测试数据,还会讲清楚背后的原理和我在实战中踩过的坑。

我建议你准备一台能跑 Docker 的 Linux 或 macOS 机器,至少 8 核 CPU、16 GB 内存。Windows 用户可以用 WSL2。后面我们会一起从零搭建 Cromwell 环境,再从单个 task 写到完整流程,最后部署到云上。

好,第一章的概述就到这。现在你心里应该有了全景图,也知道 Cromwell 为什么值得学。下一节开始,我们就动手搭环境了。

本章要点回顾
  • RNA-seq 分析链:fastq → 质控 → 修剪 → 比对 → 定量 → 差异分析
  • Cromwell 核心优势:WDL 描述、自动并行、可移植、断点续跑
  • WDL 工作流骨架:workflow + task + input/output + runtime
  • 实践注意事项:版本锁定、运行时资源声明、Docker 镜像管理