写在前面
我们一致致力于给大家提提供高性价比的计算设备:足够支持你完成硕博生涯的生信环境。考虑到我们的用户群体还是做单细胞测序数据分析较多,因此我用手里拥有的所有计算资源(Biomamba独享服务器、本地工作站、共享服务器)进行了一个常见单细胞数据的分析(参考:单样本分析)流程的计算时间测序。它们的配置分别是:
独享服务器(整机价格:2.5w¥;CPU:独享(Intel(R) Xeon(R) CPU E5-2695 v2 @ 2.40GHz);内存:384GB)
本地工作站(整机价格2.3w¥;CPU:Intel(R) Core(TM) i7-14700KF;内存:192GB)
共享服务器特惠版( 租赁价格:最低699¥;CPU:Intel(R) Xeon(R) CPU E5-4657L v2 @ 2.40GHz;内存:256GB)
共享服务器专业版(租赁价格:最低1999¥;CPU:Intel(R) Xeon(R) CPU E5-2696 v4 @ 2.20GHz;内存:512GB)
实体(稳定高效):为实验室准备一份生物信息学不动产
访问链接:https://biomamba.xiyoucloud.net/
更多内容可咨询客服微信[Biomamba_yunying]
顺序计算结果
Seurat的默认计算策略为"sequential"顺序计算,也就是说,任务会按顺序依次在当前的R会话中执行,而不会使用并行或分布式计算。说人话就是,顺序计算比并行计算策略慢,但是省内存,让我们看看以下几台机器的表现。时间信息由system.time()函数回收,返回结果解读可参考:
这是代码在 用户空间(即程序执行的实际代码中)消耗的时间。换句话说,这是 CPU 执行你代码中的指令所花费的时间。
单位是秒(s)。
例如,如果返回值是 user = 1.234,表示代码在用户空间执行时花费了 1.234 秒。
这是代码执行过程中,操作系统花费在 内核空间(操作系统管理和硬件交互的部分)上的时间。比如磁盘读写、内存分配等操作都会计入系统时间。
单位是秒(s)。
例如,如果返回值是 system = 0.567,表示操作系统为执行代码所花费的时间为 0.567 秒。
这是从代码开始执行到执行完成的总时间,实际体验中的时间,即从开始到结束的时间,包括等待时间、I/O 等其他资源消耗。
单位是秒(s)。
例如,如果返回值是 elapsed = 1.801,表示从代码开始执行到结束的时间为 1.801 秒,其中可能包括了 CPU 之外的等待时间(如磁盘 I/O 或网络延迟)。
并行计算结果
plan("multisession", workers = workcore)是future包中的并行计算策略,用于在R中设置并行任务的执行方式。这意味着每个任务会在不同的进程中执行,而每个进程是独立的,不共享内存,这就会导致内存消耗更大。并行计算适用于适用于CPU密集型任务的加速运算。
独享:
本地工作站:
内存炸了,无法参与测试(这就是为什么我有工作站以后还要配备服务器。。。。。)
特惠版:
专业版:
需要注意,并行计算并不一定会带来计算时间的降低:
数据复制开销:由于每个进程都是独立的,数据需要复制到每个进程中,可能会导致一定的性能开销。
进程间通信开销:进程间通信相对较慢,如果任务之间需要频繁交换数据,性能可能受到影响。
汇总对比
测试代码与数据
顺序计算
# 测试代码
system.time({
library(Seurat)
iri <- readRDS('./iri.intergrate.rds')
iri[["percent.mt"]] <- PercentageFeatureSet(iri, pattern = "^MT-") #通过线粒体的序列数来对数据进行计算
head(iri@meta.data, 5) #QC的数据存在meta.data里,可以用这个来查看前5行
VlnPlot(iri, features = c("nFeature_RNA", "nCount_RNA", "percent.mt"), ncol = 3)
#用小提琴图来展示QC的结果,展示了每个barcode中基因的数目、UMI数目以及线粒体基因含量的分布情况
plot1 <- FeatureScatter(iri, feature1 = "nCount_RNA", feature2 = "percent.mt")
plot2 <- FeatureScatter(iri, feature1 = "nCount_RNA", feature2 = "nFeature_RNA")
CombinePlots(plots = list(plot1, plot2)) #高变基因,判断趋势及占比
#质控,选子集,RNA数量在200与2500之间的,多的可能是低质量细胞或空drouplets,gene count多的可能是doublets or multiplets
iri <- NormalizeData(iri, normalization.method = "LogNormalize", scale.factor = 10000)
#用LogNormalize法对数据进行标准化(乘10000再取对数)数据存在iri[["RNA"]]@data.里
#默认的方法也完成了log1p的操作,得到的结果就类似于TPM的对数
iri <- FindVariableFeatures(iri, selection.method = "vst", nfeatures = 2000)
# 筛选高变基因(输出2000个),用于下游的PCA及分群
top10 <- head(VariableFeatures(iri), 10) #输出差异最大的十个基因
plot1 <- VariableFeaturePlot(iri)
plot2 <- LabelPoints(plot = plot1, points = top10, repel = TRUE)
CombinePlots(plots = list(plot1, plot2)) #输出差异基因散点图(有无标签)
iri <- ScaleData(iri, features = rownames(iri)) #将数据进行标准化,为后续的PCA分析做准备,数据存在iri[["RNA"]]@scale.data
##for PCA DoHeatmap
#iri <- ScaleData(iri)#only4VariableFeatures
iri <- ScaleData(iri, vars.to.regress = "percent.mt") #剔除不想要的变量(如线粒体的比例)
#iri[["RNA"]]@scale.data
iri <- RunPCA(iri, features = VariableFeatures(object = iri)) #PCA降维分析
print(iri[["pca"]], dims = 1:5, nfeatures = 5) #打印PCA部分结果
VizDimLoadings(iri, dims = 1:2, reduction = "pca")
DimHeatmap(iri, dims = 1, cells = 500, balanced = TRUE) #三种PCA展示方式
DimHeatmap(iri, dims = 1:15, cells = 500, balanced = TRUE) #展示15种PCA
#筛选合适的维度:
iri <- JackStraw(iri, num.replicate = 100) #重复计算次数
iri <- ScoreJackStraw(iri, dims = 1:20) #计算维度这一步花的时间比较久
JackStrawPlot(iri, dims = 1:15) #画出1到15个维度
#JackStrawPlot相当于高级PCA,为挑选合适维度进行下游可视化提供依据
ElbowPlot(iri) #利用ElbowPlot来评价PC,PCA切记为了结果好看而降低PC数
iri <- FindNeighbors(iri, dims = 1:10)
iri <- FindClusters(iri, resolution = 0.5)
#细胞分群,resolution分辨率在细胞数在3000附近时一般设为0.4-1.2,resolution越大得到的类群越多
head(Idents(iri), 5) #看前五个分类群ID
#非线性降维方法:UMAP、tSNE
iri <- RunUMAP(iri, dims = 1:10) #运行UMAP算法
#sce.all <- RunUMAP(sce.all, dims = 1:30, min.dist = 0.01, n.neighbors = 4L)
#可以调整亚群之间的距离
iri <- RunTSNE(iri, dims = 1:10) #运行TSNE算法,TSNE算法运行时间较UMAP更久
DimPlot(iri, reduction = "umap", label = TRUE)
iri.markers <- FindAllMarkers(iri, only.pos = TRUE, min.pct = 0.25, logfc.threshold = 0.25)
})
makecore <- function(workcore,memory){
if(!require(Seurat))install.packages('Seurat')
if(!require(future))install.packages('future')
plan("multisession", workers = workcore)
options(future.globals.maxSize= memory*1024*1024**2)
}
makecore(4,10)#这里以四线程,10GB为例
测试文件:
通过网盘分享的文件:
链接:
如何联系我们