在Seurat遮晚,我們選擇使用future框架進(jìn)行并行。如果您有興趣了解更多有關(guān)future框架的內(nèi)容响蓉,請點(diǎn)擊此處了解全面而詳細(xì)的描述烁设。
如何在Seurat4.0使用并行
要訪問 Seurat 中的并行函數(shù)版本,您需要加載future
包并設(shè)置plan
撬腾。plan
將指定如何運(yùn)行該函數(shù)螟蝙。默認(rèn)行為是以非并行方式(按順序)進(jìn)行。為了實(shí)現(xiàn)并行民傻,我們通常建議"多線程"策略胰默。默認(rèn)情況下,這將調(diào)用所有可用的核漓踢,但可以設(shè)置workers
參數(shù)以限制同時(shí)活動future
的數(shù)量牵署。
library(future)
# check the current active plan
plan()
## sequential:
## - args: function (..., envir = parent.frame())
## - tweaked: FALSE
## - call: NULL
# change the current plan to access parallelization
plan("multiprocess", workers = 4)
plan()
## multiprocess:
## - args: function (..., envir = parent.frame(), workers = 4)
## - tweaked: TRUE
## - call: plan("multiprocess", workers = 4)
seurat的"futurized"功能
以下函數(shù)已被編寫可以利用future 框架,如果設(shè)置適當(dāng)?shù)?code>plan喧半,將進(jìn)行并行奴迅。
- NormalizeData()
- ScaleData()
- JackStraw()
- FindMarkers()
- FindIntegrationAnchors()
- FindClusters() - if clustering over multiple resolutions
例如,要運(yùn)行并行版本挺据,您只需要設(shè)置future 并照常調(diào)用FindMarkers()功能取具。
library(Seurat)
pbmc <- readRDS("../data/pbmc3k_final.rds")
# Enable parallelization
plan("multiprocess", workers = 4)
markers <- FindMarkers(pbmc, ident.1 = "NK", verbose = FALSE)
順序與并行的比較
這里,我們將執(zhí)行一個(gè)簡單的比較扁耐,比較有和沒有并行運(yùn)行的時(shí)間差異暇检。請注意,雖然我們預(yù)計(jì)使用并行策略將減少上述函數(shù)的運(yùn)行時(shí)間婉称,但這種減少的幅度將取決于許多因素(例如數(shù)據(jù)集的大小块仆、線程數(shù)、系統(tǒng)的規(guī)格王暗、future框架等)榨乎。以下基準(zhǔn)是在運(yùn)行 Ubuntu 16.04.5 LTS 的計(jì)算機(jī)上執(zhí)行的,配置是 Intel(R) Core(TM) i7-6800K CPU @ 3.40GHz and 96 GB of RAM
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()
常見問題
我的進(jìn)度欄去哪里了瘫筐?
遺憾的是蜜暑,在任何平行模式下運(yùn)行這些函數(shù)時(shí),您將失去進(jìn)度欄策肝。這是由于future
框架和 R 中的一些技術(shù)限制造成的肛捍。如果要監(jiān)控函數(shù)進(jìn)度,則需要放棄并行化之众,選擇使用plan("sequential")拙毫。如果我不斷看到以下錯(cuò)誤,該怎么辦棺禾?
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 ...
對于某些函數(shù)缀蹄,每個(gè)線程需要訪問某些全局變量。如果這些大于默認(rèn)限制,將看到此錯(cuò)誤缺前。要繞過這一點(diǎn)蛀醉,可以設(shè)置 options(future.globals.maxSize = X),X 是字節(jié)中允許的最大值衅码。因此拯刁,要將其設(shè)置為1GB,可運(yùn)行options(future.globals.maxSize = 1000 * 1024^2)逝段。請注意垛玻,這將增加RAM使用量,因此請注意設(shè)置合適的數(shù)字奶躯。