[英]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分鍾。
我想我誤會了應該在這里使用delayed
和compute
嗎?
如果需要,設置是這樣的:
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語句來確保解釋器的安全。 因此,每個線程都在花費大部分時間等待鎖變得可用。 為避免此問題,您有兩種選擇:
更多信息: http : //dask.pydata.org/en/latest/scheduler-overview.html
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.