前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >单细胞转录组数据分析||Seurat并行策略

单细胞转录组数据分析||Seurat并行策略

作者头像
生信技能树jimmy
发布2020-06-23 14:45:05
3.2K0
发布2020-06-23 14:45:05
举报
文章被收录于专栏:单细胞天地单细胞天地

作者 | 周运来

随着单细胞技术的成熟,单细胞数据分析往往不再是单个组织样本,这有时候在计算(资源与时间)上是一个挑战。为此,Seurat也提供了可以探索的并行策略。鉴于入门单细胞数据分析的同事大多不是计算机出身,我们借助知乎的回答来解释一下什么是并行:

代码语言:javascript
复制
你吃饭吃到一半,电话来了,你一直到吃完了以后才去接,这就说明你不支持并发也不支持并行。
你吃饭吃到一半,电话来了,你停了下来接了电话,接完后继续吃饭,这说明你支持并发。
你吃饭吃到一半,电话来了,你一边打电话一边吃饭,这说明你支持并行。

并发的关键是你有处理多个任务的能力,不一定要同时。
并行的关键是你有同时处理多个任务的能力。
所以我认为它们最关键的点就是:是否是『同时』。

作者:知乎用户
链接:https://www.zhihu.com/question/33515481/answer/58849148
来源:知乎
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。

在数据分析过程中,比如我们计算差异基因,其实是单个基因的计算,一般是算完一个再算下一个,并行的意思就是同时计算,以节约时间。

在Seurat中,我们选择使用future的并行化框架。在本文中,我们将演示如何从用户的角度利用某些Seurat函数的future实现。如果您有兴趣了解更多关于future框架的内容,请参阅这个R包文档以获得全面和详细的描述。

如何使用呢?

要访问Seurat中的函数的并行版本,需要加载future的包并设置plan。该plan将指定如何执行该函数。默认行为是以非并行的方式(顺序地)计算的。为了实现并行(异步)行为,我们通常推荐“多进程”策略。默认情况下,这将使用所有可用的内核,但是您可以设置workers参数来限制并发的数量。

首先应该检查你的计算机系统是否支持R的并行。

代码语言:javascript
复制
library(future)
# check the current active plan
plan()

sequential:
- args: function (expr, envir = parent.frame(), substitute = TRUE, lazy = FALSE, seed = NULL, globals = TRUE, local = TRUE, earlySignal = FALSE, label = NULL, ...)
- tweaked: FALSE
- call: NULL
代码语言:javascript
复制
# change the current plan to access parallelization
plan("multiprocess", workers = 4)
plan()

## multiprocess:
## - args: function (expr, envir = parent.frame(), substitute = TRUE, lazy = FALSE, seed = NULL, globals = TRUE, workers = 4, gc = FALSE, earlySignal = FALSE, label = NULL, ...)
## - tweaked: TRUE
## - call: plan("multiprocess", workers = 4)

‘Futurized’ functions in Seurat

再看看Seurat哪些函数可以使用并行。

编写以下函数是为了利用future的框架,如果当前plan设置正确,这些函数将被并行化。重要的是,调用函数的方式不变。

代码语言:javascript
复制
NormalizeData
ScaleData
JackStraw
FindMarkers
FindIntegrationAnchors
FindClusters - if clustering over multiple resolutions

例如,要运行findmarker的并行版本,只需设置计划并像往常一样调用该函数。

代码语言:javascript
复制
library(Seurat)
pbmc <- readRDS("../data/pbmc3k_final.rds")

# Enable parallelization
plan("multiprocess", workers = 4)
markers <- FindMarkers(pbmc, ident.1 = "NK", verbose = FALSE)

并行的比较

在这里,我们将对具有并行化和不具有并行化的相同函数调用的运行时进行一个简短的比较。请注意,虽然我们预期使用并行化策略将减少上面列出的函数的运行时,但是这种减少的幅度将取决于许多因素(例如数据集的大小、工作人员的数量、系统的规格、未来的策略等)。下面的基准测试是在运行Ubuntu 16.04.5 LTS和Intel(R) Core(TM) i7-6800K CPU @ 3.40GHz和96 GB RAM的桌面计算机上进行的。

代码语言:javascript
复制
timing.comparisons <- data.frame(fxn = character(), time = numeric(), strategy = character())
plan("sequential")
start <- Sys.time()
pbmc <- ScaleData(pbmc, vars.to.regress = "percent.mt", verbose = FALSE)
end <- Sys.time()
timing.comparisons <- rbind(timing.comparisons, data.frame(fxn = "ScaleData", time = as.numeric(end - 
    start, units = "secs"), strategy = "sequential"))

start <- Sys.time()
markers <- FindMarkers(pbmc, ident.1 = "NK", verbose = FALSE)
end <- Sys.time()
timing.comparisons <- rbind(timing.comparisons, data.frame(fxn = "FindMarkers", time = as.numeric(end - 
    start, units = "secs"), strategy = "sequential"))

plan("multiprocess", workers = 4)
start <- Sys.time()
pbmc <- ScaleData(pbmc, vars.to.regress = "percent.mt", verbose = FALSE)
end <- Sys.time()
timing.comparisons <- rbind(timing.comparisons, data.frame(fxn = "ScaleData", time = as.numeric(end - 
    start, units = "secs"), strategy = "multiprocess"))

start <- Sys.time()
markers <- FindMarkers(pbmc, ident.1 = "NK", verbose = FALSE)
end <- Sys.time()
timing.comparisons <- rbind(timing.comparisons, data.frame(fxn = "FindMarkers", time = as.numeric(end - 
    start, units = "secs"), strategy = "multiprocess"))

来看看效果

代码语言:javascript
复制
library(ggplot2)
library(cowplot)
ggplot(timing.comparisons, aes(fxn, time)) + geom_bar(aes(fill = strategy), stat = "identity", position = "dodge") + 
    ylab("Time(s)") + xlab("Function") + theme_cowplot()

FAQ

  • 我的进度条去哪了? 不幸的是,当以任何并行计划模式运行这些函数时,您将丢失进度条。这是由于一些技术限制在未来的框架和R一般。如果您想监视函数的进度,就需要放弃并行化,而使用plan(“sequential”)。
  • 如果我一直看到以下错误,我应该怎么做?
代码语言:javascript
复制
Error in getGlobalsAndPackages(expr, envir = envir, globals = TRUE) : 
  The total size of the X globals that need to be exported for the future expression ('FUN()') is X GiB. This exceeds the maximum allowed size of 500.00 MiB (option 'future.globals.maxSize'). The X largest globals are ... 

或者某些函数,每个worker需要访问某些全局变量。如果这些值大于默认限制,您将看到此错误。要解决这个问题,可以设置选项(future.globals。maxSize = X),其中X是允许的最大大小(以字节为单位)。因此,要将其设置为1GB,需要运行options(future.globals。maxSize = 1000 * 1024^2)。请注意,这将增加您的RAM使用量,因此请谨慎地设置这个数字。

说到底Seurat不过是个R包,想要并行计算是要懂一些R里面并行原理的:由内而外释放R的力量||摘自《R大数据分析实用指南》。特别地,当我们在R中计算的中途突然发现某个任务报错说超出内存了,怎么办呢?

代码语言:javascript
复制
使用更少的线程进行并行;
如果你的电脑内存非常小,有一个简单的方法确定你的最大使用线程:max cores = memory.limit() / memory.size();
将大量的并行分小部分进行;
在代码中多使用rm()删除没用的变量,使用gc()回收内存空间;

References

[1] 由内而外释放R的力量||摘自《R大数据分析实用指南》: https://www.jianshu.com/p/db95385b5340 [2] https://satijalab.org/seurat/v3.1/future_vignette.html

本文参与 腾讯云自媒体分享计划,分享自微信公众号。
原始发表:2020-06-18,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 单细胞天地 微信公众号,前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 如何使用呢?
  • ‘Futurized’ functions in Seurat
  • 并行的比较
  • FAQ
  • References
相关产品与服务
大数据
全栈大数据产品,面向海量数据场景,帮助您 “智理无数,心中有数”!
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档