第1章 Seurat简介与安装

Seurat这个包,做单细胞分析的朋友应该都不陌生。它由Rahul Satija实验室开发,是目前单细胞转录组数据处理最主流的R包之一。我刚开始接触单细胞数据时,Seurat还是2.x版本,那时候处理一万个细胞都要跑半天。现在Seurat 5.x已经非常成熟了,几十万甚至上百万细胞的数据集也能应付得过来——前提是你得把手里的硬件喂饱。

不过,很多人在处理大规模数据集时遇到了瓶颈。聚类那一步,尤其是Louvain或Leiden算法的图构建和模块度优化,计算量会爆炸式增长。这时GPU加速就派上用场了。说白了,就是把那些可以并行计算的矩阵运算和邻域搜索任务丢给显卡。我去年有个项目,50万细胞的数据,用普通CPU跑Leiden聚类耗时40分钟,换成GPU加速后,不到3分钟就出结果了。这个差距,你想想看,多震撼。

1.1 Seurat的核心能力

Seurat提供了一整套单细胞数据分析流程。从原始UMI计数矩阵开始,到质控、标准化、降维、聚类、差异表达分析,再到可视化,基本都能一条龙搞定。我个人最常用的是以下几个功能模块:

  • 质控与过滤:筛选细胞和基因,剔除双细胞和空液滴。
  • 标准化与归一化:LogNormalize、SCTransform等。
  • 降维:PCA是标配,t-SNE/UMAP用于可视化。
  • 聚类:基于图的聚类(FindClusters),底层支持Louvain和Leiden算法。
  • 差异分析:FindMarkers找出细胞群之间的标记基因。

嗯,这里要特别说明一下——Seurat自带的聚类实现是纯CPU的。如果想用GPU加速,需要配合其他工具,比如RAPIDS cuML或H2O.ai。这也是我们这门课的重点。

1.2 为什么需要GPU加速

我把几个典型场景对比如下,大家感受一下:

数据规模CPU聚类耗时GPU加速后耗时加速比
10,000细胞~5秒~1秒5x
100,000细胞~2分钟~10秒12x
500,000细胞~40分钟~3分钟13x
1,000,000细胞~3小时~12分钟15x

比例子更直观的是,当你迭代调参时,每次都要等半小时,心情会很崩溃。GPU加速不仅省时间,还能让你做更多探索性分析——比如尝试不同的分辨率、不同的算法。

1.3 环境准备

在开始安装之前,先检查一下你的机器。Windows、macOS、Linux都行,但我个人建议用Linux(Ubuntu 20.04/22.04),因为CUDA和RAPIDS对Linux的支持最好。讲个坑:我曾在Windows上用Docker跑,结果R包编译报错,折腾了大半天。后来换了WSL2才顺利解决。

⚠ 重要提醒: GPU加速需要一张NVIDIA显卡,并安装好驱动和CUDA Toolkit。建议CUDA 11.8或12.x以上。显存起码8GB,处理百万级细胞最好有24GB。

你需要准备以下软件:

  • R ≥ 4.2.0(推荐4.3.x)
  • RStudio(可选,但建议装,调试方便)
  • NVIDIA驱动 ≥ 535
  • CUDA Toolkit 11.8 或 12.2
  • conda/mamba(用于管理RAPIDS环境)

检查CUDA是否装好的命令:

nvidia-smi
nvcc --version

如果输出了显卡信息和CUDA版本号,就没问题。否则去NVIDIA官网下载对应驱动。

1.4 安装Seurat

Seurat直接从CRAN安装最省事:

install.packages("Seurat")

如果你想要最新开发版,可以拉GitHub:

remotes::install_github("satijalab/seurat", "seurat5", quiet = TRUE)

我一般推荐用CRAN版,稳定。开发版有时候会引入新功能但伴随一些bug。安装完成后,在R里测试:

library(Seurat)
packageVersion("Seurat")

输出类似[1] '5.1.0'就OK了。

💡 小技巧: 国内用户如果CRAN下载慢,可以换个镜像。例如:install.packages("Seurat", repos = "https://mirrors.tuna.tsinghua.edu.cn/CRAN/")

1.5 安装GPU加速组件

我们要用RAPIDS cuML这个库来做GPU加速的聚类和UMAP。它通过Python接口调用,但我们可以通过reticulate包在R里无缝调用。我的推荐路径是:用conda创建专属环境,装上cuML、cuDF和reticulate。

conda create -n gpu_seurat python=3.10
conda activate gpu_seurat
conda install -c rapidsai -c conda-forge cuml cudf=24.12 python=3.10
conda install -c conda-forge r-reticulate

注意,cuML版本要和CUDA版本匹配。我目前用CUDA 12.2,所以装24.12。你先用nvidia-smi看你CUDA版本,然后去https://docs.rapids.ai/install查对应版本号。

装好后,在R里设置Python路径:

library(reticulate)
use_condaenv("gpu_seurat", required = TRUE)
py_config()

如果输出显示Python在conda环境里,并且Pandas、cudf等包可用,就说明配置成功了。我有一次因为系统默认Python和conda环境冲突,导致reticulate一直报找不到模块,后来把~/.Renviron里的Reticulate环境变量配置好才解决。

1.6 验证安装

我们来做一个简单的测试——用Seurat自带的pbmc3k数据集跑一遍标准流程,然后检查是否能用cuML加速UMAP。先加载数据并预处理:

library(Seurat)
pbmc <- Read10X(data.dir = "filtered_gene_bc_matrices/hg19/")
pbmc <- CreateSeuratObject(counts = pbmc, project = "pbmc3k")
pbmc <- NormalizeData(pbmc)
pbmc <- FindVariableFeatures(pbmc, selection.method = "vst", nfeatures = 2000)
pbmc <- ScaleData(pbmc)
pbmc <- RunPCA(pbmc, npcs = 50)

然后调用GPU加速的UMAP——这里我们用reticulate来跑cuml.UMAP:

library(reticulate)
cuml <- import("cuml")
umap_model <- cuml$UMAP(n_neighbors = 30L, n_components = 2L, min_dist = 0.3, random_state = 42L)
embeddings <- umap_model$fit_transform(pbmc@reductions$pca@cell.embeddings[, 1:30])
rownames(embeddings) <- colnames(pbmc)
pbmc[["gpu_umap"]] <- CreateDimReducObject(embeddings, key = "GPUUMAP_", assay = "RNA")

如果没报错,并且你用DimPlot能画出图,就说明GPU加速组件已整装待发。

🎯 第一关目标达成! 现在你的R环境已经具备了Seurat和GPU加速依赖。下一节我们将深入GPU加速聚类的核心——用cuML的Leiden算法实现高效的细胞分群。
Seurat + GPU加速聚类核心流程 UMI 读取 质控过滤 标准化·PCA GPU聚类 可视化 GPU加速组件 cuML Leiden/Louvain cuML UMAP/t-SNE 10x / h5 双细胞剔除 降维到50维 UMAP / tSNE