一、独享升级活动介绍
•参与活动支付原来套餐半年的金额补差升级高性能计算节点,后续续费按照原套餐价格续费即可。
•现在参与活动的用户额外赠送5个月的时长,升级时间在支付完成14个工作日后,只需要停机1-2天。例如:基础版(6000/年)用户1月份到期支付3000,即可补差性能升级高性能节点且延长至6月份到期。(如果单位现在封账了,可以先报名预留名额。报名截止后续升级恢复原价)
•此活动结束后,用户购买高性能节点,需要按照新的价格购买。在我们活动期间升级服务器的用户,后续续费按照原套餐价格续费即可,活动名额有限,先到先到。
二、理解Elapsed Time、CPU Time、Wait Time
•Elapsed Time表示程序运行的持续时间,也就是我们实际感受到流失的时间。
•CPU Time,程序所占用的处理器时间,分为系统时间和用户时间:
○User CPU Time指程序执行用户态代码所消耗的CPU时间
○System CPU Time指程序在内核态消耗的CPU时间(执行系统调用等)。
•Wait Time是CPU花费在等待IO操作上的总时间(包含硬盘IO和网络IO)。
哪些地方可以看到这些时间?
查看CPU整体使用情况
通过top命令可以看到机器整体的CPU使用情况
•结果解读
○us:用户空间占用CPU百分比
○sy:内核空间占用CPU百分比
○ni:用户进程空间内改变过优先级的进程占用CPU百分比
○id:空闲CPU百分比
○wa:等待输入输出的CPU时间百分比
○hi:硬中断占用CPU的百分比
○si:软中断占用CPU的百分比
○st:用于有虚拟CPU的情况,用来指示被虚拟机消耗的CPU时间
查看某个命令的CPU使用情况
•以下面这个代码片段为例子,其生成矩阵后对矩阵进行求逆和相乘运算,并使用R语言的system.time函数查看求逆和相乘的CPU使用情况,同时将结果存储到了日志文件中,然后在Linux终端使用time命令查看整个脚本执行的CPU使用情况。
Bash
library(logging)
logReset()
basicConfig(level = "INFO")
# 设置输出日志到文件
addHandler(writeToFile, file = "~/demo.log", level = "INFO")
rm(list = ls())
set.seed(123)
# 设置矩阵的行数
n <- 5000
# 生成一个矩阵
value <- rnorm(n * n, 10, 3)
mat <- matrix(value, n, n)
result1 <- system.time({
# 矩阵求逆
ainv <- solve(mat)
})
result1
loginfo("求逆耗时 %s", result1)
result2 <- system.time({
# 矩阵相乘
re <- mat %*% t(mat)
})
result2
loginfo("相乘耗时 %s", result2)
三、本次服务器升级涉及的硬件
1.CPU:单个CPU性能提升约200%
2.内存:内存条性能提升约200%
3.系统平台:升级为新一代的系统平台以使用新一代CPU以及内存,提高整体稳定性
执行代码的时间对比
#下面的代码其逻辑为Seurat运算,涉及硬盘与内存数据的加载,
#数据等运算,是一个生信场景较好的测试代码。(代码来源于:
#https://mp.weixin.qq.com/s/uOqNUpD5vK8josMZStwunA)
Bash
library(logging)
logReset()
basicConfig(level='INFO')
# 设置输出日志到文件,这里很关键
addHandler(writeToFile, file="~/demo.log", level='INFO')
serial_func <- function() {
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)
return(iri.markers)
}
parallel_func <- function() {
# #这里以四线程,128GB为例
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, 128)
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)
return(iri.markers)
}
loginfo("单线程耗时 %s", system.time(serial_func()))
loginfo("多线程耗时 %s", system.time(parallel_func()))
旧独独享节点:
新高性能独享节点类型1:
新高性能独享节点类型2:
•CPU使用情况统计(单位为秒)
•结果解读:使用高性能独享,运行测试代码,比旧独享速度提升近100%以上(9585.808秒与5307.248秒对比),同时如果利用好服务器多线程的能力,可以将速度提升200%以上(9585.808秒与3279.665秒对比),其性价比也比较高。
如何联系我们
已有生信基地联系方式的同学无需重复添加