Skip to content
RNA-Seq

Kallisto vs Salmon: Pseudo-Alignment Tools Compared

Two flagship pseudo-alignment quantifiers for RNA-Seq compared on speed, accuracy, and the small but meaningful differences that matter downstream.

PR Marcus Nkemdirim 6 min read Salmon Kallisto Pseudo-alignment

Kallisto (Bray et al., 2016) and Salmon (Patro et al., 2017) both introduced the same conceptual leap: skip full-genome alignment and instead compute the compatibility of each read with the transcriptome directly. The result is 10-50× faster RNA-Seq quantification with equivalent (or slightly better) accuracy for transcript-level abundance.

Which one should you pick? Honestly, either works. Here’s the short version.

Algorithm summary

AspectKallistoSalmon
Read-to-transcript mappingPseudo-alignment via T-DBGQuasi-mapping (or selective alignment, mode-dependent)
Bias modelingOptional sequence-specific and positional biasOn by default: seq bias, GC bias, positional bias, fragment length
BootstrapYes (--bootstrap-samples)Yes (--numBootstraps) or Gibbs sampling
Index size (human)~3 GB~4-5 GB
Speed (typical)Slightly fasterSimilar, slightly slower with all bias models on

Building the index

Kallisto:

kallisto index -i kallisto/grch38.idx gencode.v46.transcripts.fa

Salmon (with decoy sequences from the genome, which improves accuracy for reads from unannotated regions):

grep "^>" GRCh38.primary_assembly.genome.fa | sed 's/>//' > decoys.txt
cat gencode.v46.transcripts.fa GRCh38.primary_assembly.genome.fa > gentrome.fa
salmon index -t gentrome.fa -d decoys.txt -i salmon/grch38 -k 31

The decoy-aware index is a real accuracy improvement — always use it with Salmon.

Quantification

Kallisto:

kallisto quant -i kallisto/grch38.idx \
  -o quant/sample \
  --bootstrap-samples=100 \
  -t 16 \
  fastq/sample_R1.fastq.gz fastq/sample_R2.fastq.gz

Salmon:

salmon quant -i salmon/grch38 \
  -l A \
  -1 fastq/sample_R1.fastq.gz -2 fastq/sample_R2.fastq.gz \
  --validateMappings \
  --gcBias \
  --seqBias \
  -p 16 \
  -o quant/sample

-l A auto-detects library type; always confirm the detected type in the log.

Downstream: tximport

Both tools output a per-sample abundance.tsv (Kallisto) or quant.sf (Salmon). Aggregate to gene-level counts with tximport in R and feed straight into DESeq2:

library(tximport); library(DESeq2)

tx2gene <- read.table("ref/tx2gene.gencode.v46.tsv",
                      header = TRUE)
files <- file.path("quant", samples$sample, "quant.sf")
names(files) <- samples$sample

txi <- tximport(files, type = "salmon", tx2gene = tx2gene)
dds <- DESeqDataSetFromTximport(txi, colData = samples,
                                design = ~ condition)

For Kallisto swap type = "kallisto" and the file name to abundance.h5.

When Salmon has an edge

  • GC bias correction matters more than you’d expect for older library preps. Salmon models this natively; Kallisto doesn’t.
  • Decoy-aware indexing noticeably reduces spurious mappings to pseudogenes and unannotated regions.
  • Gibbs sampling for uncertainty is a bit more principled than Kallisto’s bootstrapping.

When Kallisto has an edge

  • Slightly faster on typical hardware.
  • Its ecosystem — sleuth for likelihood-ratio DE using bootstrapped uncertainty — is elegant if you want to stay inside the Kallisto family.
  • bustools + kb-python combine Kallisto with fast single-cell processing.

Practical recommendation

For a new bulk RNA-Seq project starting today, use Salmon with decoy-aware index and --gcBias --seqBias, then tximport into DESeq2. If your organization already uses Kallisto pervasively, don’t switch on aesthetics alone — the biological results are equivalent.

Neither replaces alignment when you need genome-level information (splicing, fusions, novel exons). For that, see our STAR vs HISAT2 comparison.

FAQ

Q. Should I still bother with STAR/HISAT2 alignment if Salmon is faster?

A. For gene-level differential expression, Salmon or Kallisto pseudo-alignment is the modern default — it is 10-50× faster and produces DE gene lists indistinguishable from alignment-based pipelines. Stick with STAR/HISAT2 alignment if you need per-position coverage, novel-junction discovery, splice-QTL calling, or fusion detection.

Related in RNA-Seq