簡體   English   中英

dask.delayed無法加速

[英]dask.delayed results in no speedup

我正在嘗試進入達斯克。 為此,我試圖並行化我得到的一些耗時的順序代碼。 原始代碼是這樣的:

def sequential():
    sims = [] 
    chunksize = len(tokens)//4
    for i in range(0, len(tokens), chunksize):
        print(i, i+chunksize)
        chunk = tokens[i:i+chunksize]
        sims.append(process(chunk))     
    return sims

%time sequential()

通用代碼是這樣的:

def parallel():
    sims = []
    chunksize = len(tokens)//4
    for i in range(0, len(tokens), chunksize):
        print(i, i+chunksize)
        chunk = dask.delayed(tokens[i:i+chunksize])
        sims.append(dask.delayed(process)(chunk))
    return dask.delayed(sims)

%time parallel().visualize()

但是並行代碼始終比並行代碼慢10%。 當我可視化sims的計算圖時,我得到了:

在此處輸入圖片說明

不知道list-#8來源,但看起來還正確。 那么為什么沒有加速呢? 當我查看htop時,我看到3個核心處於活動狀態(每個負載約30%),而對於順序代碼,我僅看到1個核心處於活動狀態(負載100%)。 順序代碼運行7分鍾,而並行代碼運行7-8分鍾。

我想我誤會了應該在這里使用delayedcompute嗎?


如果需要,設置是這樣的:

import numpy
import spacy
import dask

nlp = spacy.load('en_core_web_lg')

tokens = [t for t in nlp(" ".join(t.strip() for t in open('./words.txt','r').readlines())) if len(t.text) > 1 and len(t.text) < 20]


def process(chunk):
    sims = numpy.zeros([len(chunk),len(tokens)], dtype=numpy.float32)
    for i in range(len(chunk)):
        for j in range(len(tokens)):
            sims[i,j] = chunk[i].similarity(tokens[j])
    return sims 

您正在看到此行為,因為dask的默認執行引擎基於單個進程中的多個線程(“線程”調度程序)。 Python具有一個鎖GIL,該鎖通過一次僅執行一個python語句來確保解釋器的安全。 因此,每個線程都在花費大部分時間等待鎖變得可用。 為避免此問題,您有兩種選擇:

  • 找到可以發布GIL的計算版本。 如果您可以將其表達為(主要是)一些numpy,pandas,numba等計算,在C級別執行並且不需要解釋器的代碼,則這是可能的,這與嵌套循環不同。
  • 使用進程,使用“ mutiprocessing”調度程序或(更好)“分布式”調度程序來運行您的代碼,盡管名稱如此,但該調度程序也可以在一台計算機上很好地運行。

更多信息: http : //dask.pydata.org/en/latest/scheduler-overview.html

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM