你的电脑算单细胞有多快?

文摘   2024-12-13 09:05   江苏  

写在前面

我们一致致力于给大家提提供高性价比的计算设备:足够支持你完成硕博生涯的生信环境。考虑到我们的用户群体还是做单细胞测序数据分析较多,因此我用手里拥有的所有计算资源(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)


如果你对下面的教程比较迷茫,那么你可以先行学习编程教程:
十小时学会Linux
生信Linux及服务器使用技巧
R语言基础学习手册

如果你的计算机不足以支持下面流程的计算,可按需选用适合自己的计算资源:
共享(经济实惠):有root权限的共享服务器,报我名字立减200¥
独享(省电省心):生信分析不求人

实体(稳定高效):为实验室准备一份生物信息学不动产

访问链接:https://biomamba.xiyoucloud.net/

更多内容可咨询客服微信[Biomamba_yunying]


顺序计算结果


Seurat的默认计算策略为"sequential"顺序计算,也就是说,任务会按顺序依次在当前的R会话中执行,而不会使用并行或分布式计算。说人话就是,顺序计算比并行计算策略慢,但是省内存,让我们看看以下几台机器的表现。时间信息由system.time()函数回收,返回结果解读可参考:

1、user time(用户时间)

这是代码在 用户空间(即程序执行的实际代码中)消耗的时间。换句话说,这是 CPU 执行你代码中的指令所花费的时间。

单位是秒(s)。

例如,如果返回值是 user = 1.234,表示代码在用户空间执行时花费了 1.234 秒。


2、system time(系统时间)

这是代码执行过程中,操作系统花费在 内核空间(操作系统管理和硬件交互的部分)上的时间。比如磁盘读写、内存分配等操作都会计入系统时间。

单位是秒(s)。

例如,如果返回值是 system = 0.567,表示操作系统为执行代码所花费的时间为 0.567 秒。


3、elapsed time(总耗时,也叫壁钟时间):

这是从代码开始执行到执行完成的总时间,实际体验中的时间,即从开始到结束的时间,包括等待时间、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为例

测试文件:

通过网盘分享的文件:

iri.intergrate.rds

链接: 

https://pan.baidu.com/s/1rFCgY-N-dKIFEBmbdC7tKw?pwd=bav8 提取码: bav8 




如何联系我们

公众号后台消息回复不便,这里给大家留一下领取资料及免费服务器(足够支持你完成硕博生涯的生信环境)的微信号,方便各位随时交流、提建议(别问在么,添加时直接说来意)。此外呼声一直很高的交流群也建好了,欢迎大家入群讨论:

永久免费的生信、科研交流群

大家可以阅读完这几篇之后添加
给生信入门初学者的小贴士
如何搜索公众号过往发布内容

您点的每个赞和在看,我都认真当成了喜欢


Biomamba 生信基地
本人为在读博士研究生,此公众号旨在分享生信知识及科研经验与体会,欢迎各位同学、老师与专家的批评指正,也欢迎各界人士的合作与交流。
 最新文章