joblib 并行文檔研究
https://joblib.readthedocs.io/en/latest/parallel.html#bad-interaction-of-multiprocessing-and-third-party-libraries
在我庸常的如草木一般成住壞空的生命中窟勃,如果我要做并行計算祖乳,大規(guī)模計算(TB級別)我會直接開pyspark,
matlab里直接parfor,python是multiprocessing,R是parallel,SAS是在sas proc之前加options.這些東西都很好,但是都有缺點秉氧。
pyspark的并行要用他們自己的pipeline里的模型眷昆,如果要用小模型,比如sklearn,imblearn汁咏,需要涉及到j(luò)ava內(nèi)存到python內(nèi)存的序列化反序列化開銷亚斋,
雖然經(jīng)過apache arrow優(yōu)化后結(jié)果可以接受。multiprocessing數(shù)據(jù)處理能放不能收攘滩,數(shù)據(jù)可以出去算帅刊,但是收不到一起,算完的東西
在聚合的時候會出問題漂问。SAS和matlab有軟件使用域限制赖瞒。
但是最近用到了joblib,可能更適用于簡單的把所要用的模型并行化。
使用的時候簡單照如下句子就可以了
from joblib import Parallel,delayed
from past.builtins import execfile
import os
import copy
cpu_count=os.cpu_count()+1
def self_function(x)
return xxxx
def self_function_2(self_function,x)
return self_function(x)
def self_function_3(self_function,x,y,z):
return self_function(x)+y+z
parallel=Parallel(n_jobs=max(cpu_count-1,1),prefer="threads",require='sharedmem')
#遇到并行化的程序是簡單程序级解,程序里不涉及復(fù)用其他函數(shù)等的情況冒黑,直接寫參數(shù)可以
out=parallel(delayed(self_function)(i) for i in range(1,11))
#遇到并行化的程序是復(fù)雜程序,程序里涉及復(fù)用其他函數(shù)勤哗,并行的同時會導致各子程序讀到的數(shù)據(jù)是上一個進程生產(chǎn)出來的抡爹,
#導致數(shù)據(jù)對不齊,這時候芒划,就需要用一些寫法
out=parallel(delayed(optimize_2ndStg)(copy.deepcopy(self_function),
? ? ? ? ? ? i for i in range(11))
#如果有多個參數(shù)冬竟,把參數(shù)打包zip
ruleParam=zip(rule['k'].tolist(),rule['stk_num'].tolist(),rule['bond_num'].tolist())
out=parallel(delayed(self_function_3)(copy.deepcopy(),
? ? ? ? ? ? k=i,j=num_j,l=num_l) for i,num_j,num_l in ruleParam)
#
joblib使用設(shè)定與須知欧穴,從網(wǎng)頁里來
Thread-based parallelism vs process-based parallelism?
joblib parallel默認使用loky backend,因為是用來區(qū)分開不同CPU的,
但是實際上這會導致會話&初始化開銷泵殴,如果你要并行的程序很小涮帘,或者
并行的程序之間公用內(nèi)存,需要互相通信笑诅,那么就很麻煩调缨。
可以使用prefer="threads"
Serialization & Processes?
如果并行的文件很大,使用cloudpickle進行序列化吆你,一般pickle就可以了弦叶。
Shared-memory semantics?
如果涉及到數(shù)據(jù)分別算,最后還要收到一起妇多,共享內(nèi)存伤哺,那么要寫 require='sharedmem'
Reusing a pool of workers?
有些算法會數(shù)次連續(xù)用到一個原函數(shù)的不同階段的函數(shù),這時候直接calling joblib.parallel并不是
最優(yōu)選擇者祖,這個時候用joblib.Parallel類里的context manager API去換個寫法更好立莉。
Working with numerical data in shared memory (memmapping)?
默認joblib是用multiprocessing開多核的,但是如果數(shù)據(jù)量比較大七问,多核一跑內(nèi)存受不了蜓耻,
這個時候joblib.Parallel類會提供解決方案,它會用索引械巡,用另一種文件系統(tǒng)媒熊,
Automated array to memmap conversion?
計算中間結(jié)果儲存空間,默認占用C盤可能受不了坟比,在這里看看芦鳍。
Manual management of memmapped input data?
將不用的內(nèi)存dump到一個地方
Writing parallel computation results in shared memory?
如果數(shù)據(jù)是w+,r+模式打開的,那么核心會得到r+權(quán)限葛账,這時候可以直接把結(jié)果寫到元數(shù)據(jù)里
減輕讀寫的消耗柠衅。
Avoiding over-subscription of CPU resources?
一些設(shè)置,做進程線程管理籍琳,比如電腦4個核菲宴,要控制每個核線程的數(shù)量。有時候這些設(shè)置會被其他用的方法改寫趋急,有時候又需要自己改寫喝峦。
再下面就是其他設(shè)置。