第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才顺利解决。
你需要准备以下软件:
- 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了。
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加速组件已整装待发。