1 回答

TA貢獻(xiàn)1875條經(jīng)驗(yàn) 獲得超5個(gè)贊
正如在問題中提到的,該程序?qū)τ谧銐蛐〉臄?shù)據(jù)集運(yùn)行得很好(盡管它似乎繞過了 Ray 邏輯的幾個(gè)方面),但它最終在大型數(shù)據(jù)集上崩潰了。僅使用 Ray 任務(wù),我沒有設(shè)法調(diào)用存儲(chǔ)在 Object Store ( ValueError: buffer source array is read-only) 中的 Scipy Interpolator 對(duì)象,并且裝飾所有函數(shù)沒有意義,因?yàn)閷?shí)際上只有主要函數(shù)應(yīng)該同時(shí)執(zhí)行(同時(shí)調(diào)用其他函數(shù))。
因此,我決定更改程序結(jié)構(gòu)以使用 Ray Actors。設(shè)置說明現(xiàn)在是該__init__方法的一部分。特別是,Scipy Interpolator 對(duì)象在此方法中定義并設(shè)置為 的屬性self,就像全局變量一樣。大多數(shù)函數(shù)(包括 main 函數(shù))已成為類方法,但通過 Numba 編譯的函數(shù)除外。對(duì)于后者,它們?nèi)匀皇怯?裝飾的獨(dú)立函數(shù)@jit,但它們中的每一個(gè)現(xiàn)在在調(diào)用 jitted 函數(shù)的類中都有一個(gè)等效的包裝方法。
為了讓我的程序并行執(zhí)行我現(xiàn)在的主要方法,我依賴于 ActorPool。我創(chuàng)建了與可用 CPU 一樣多的 actor,每個(gè) actor 都執(zhí)行 main 方法,成功調(diào)用方法和 Numba 編譯的函數(shù),同時(shí)還設(shè)法訪問 Interpolator 對(duì)象。我只適用@ray.remote于定義的 Python 類。所有這些都轉(zhuǎn)化為以下結(jié)構(gòu):
@ray.remote
class FooClass(object):
? ? def __init__(self, initArgs):
? ? ? ? # Initialisation
? ? @staticmethod
? ? def exampleStaticMethod(args):
? ? ? ? # Processing
? ? ? ? return
? ? def exampleMethod(self, args):
? ? ? ? # Processing
? ? ? ? return
? ? def exampleWrapperMethod(self, args):
? ? ? ? return numbaCompiledFunction(args)
? ? def mainMethod(self, poolMapArgs):
? ? ? ? # Processing
? ? ? ? return
@jit
def numbaCompiledFunction(args):
? ? # Processing
? ? return
ray.init(address='auto', redis_password=redPass)
actors = []
for actor in range(int(ray.cluster_resources()['CPU'])):
? ? actors.append(FooClass.remote(initArgs))
pool = ActorPool(actors)
for unpackedTuple in pool.map_unordered(
? ? ? ? lambda a, v: a.mainMethod.remote(v),
? ? ? ? poolMapArgs):
? ? # Processing
ray.shutdown()
這在分布在 4 個(gè)節(jié)點(diǎn)上的 192 個(gè) CPU 上成功運(yùn)行,沒有任何警告或錯(cuò)誤。
添加回答
舉報(bào)