第七色在线视频,2021少妇久久久久久久久久,亚洲欧洲精品成人久久av18,亚洲国产精品特色大片观看完整版,孙宇晨将参加特朗普的晚宴

為了賬號(hào)安全,請(qǐng)及時(shí)綁定郵箱和手機(jī)立即綁定
已解決430363個(gè)問題,去搜搜看,總會(huì)有你想問的

使用 Ray 并行化大型程序的正確方法

使用 Ray 并行化大型程序的正確方法

四季花海 2023-06-13 16:08:12
我有一個(gè)相當(dāng)大的 Python 程序(~800 行),它具有以下結(jié)構(gòu):設(shè)置說明,我在其中處理用戶提供的輸入文件并定義對(duì)程序執(zhí)行具有全局性的變量/對(duì)象。主要功能,它利用前面的設(shè)置階段并調(diào)用程序的主要附加功能。附加函數(shù)可以是主要的,因?yàn)樗鼈儽恢骱瘮?shù)直接調(diào)用,或者是次要的,因?yàn)樗鼈冎槐恢饕母郊雍瘮?shù)調(diào)用。我處理 main 函數(shù)結(jié)果的最后幾行代碼。該程序是大規(guī)模并行的,因?yàn)橹骱瘮?shù)的每次執(zhí)行都獨(dú)立于前一個(gè)和下一個(gè)。因此,我使用 Ray 在集群中的多個(gè)工作節(jié)點(diǎn)上并行執(zhí)行主要功能。操作系統(tǒng)是 CentOS Linux release 8.2.2004 (Core),集群執(zhí)行 PBS Pro 19.2.4.20190830141245。我正在使用 Python 3.7.4、Ray 0.8.7 和 Redis 3.4.1。我在 Python 腳本中有以下內(nèi)容,foo主要功能在哪里:@ray.remote(memory=2.5 * 1024 * 1024 * 1024)def foo(locInd):    # Main functionif __name__ == '__main__':    ray.init(address='auto', redis_password=args.pw,             driver_object_store_memory=10 * 1024 * 1024 * 1024)    futures = [foo.remote(i) for i in zip(*np.asarray(indArr == 0).nonzero())]    waitingIds = list(futures)    while len(waitingIds) > 0:        readyIds, waitingIds = ray.wait(            waitingIds, num_returns=min([checkpoint, len(waitingIds)]))        for r0, r1, r2, r3, r4, r5, r6, r7 in ray.get(readyIds):            # Process results            indArr[r0[::-1]] = 1            nodesComplete += 1    ray.shutdown()以下是我用來啟動(dòng) Ray 的說明# Head node/path/to/ray start --head --port=6379 \--redis-password=$redis_password \--memory $((120 * 1024 * 1024 * 1024)) \--object-store-memory $((20 * 1024 * 1024 * 1024)) \--redis-max-memory $((10 * 1024 * 1024 * 1024)) \--num-cpus 48 --num-gpus 0只要我處理足夠小的數(shù)據(jù)集,一切都會(huì)按預(yù)期運(yùn)行。盡管如此,執(zhí)行會(huì)產(chǎn)生以下警告2020-08-17 17:16:44,289 警告 worker.py:1134 -- 警告:腌制時(shí)遠(yuǎn)程函數(shù)的__main__.foo大小為 220019409。它將存儲(chǔ)在 Redis 中,這可能會(huì)導(dǎo)致內(nèi)存問題。這可能意味著它的定義使用了一個(gè)大數(shù)組或其他對(duì)象。2020-08-17 17:17:10,281 WARNING worker.py:1134 -- 這個(gè) worker 被要求執(zhí)行一個(gè)它沒有注冊(cè)的函數(shù)。您可能需要重新啟動(dòng) Ray。關(guān)于我如何向 Ray 描述程序,我顯然做錯(cuò)了什么。我有 Scipy Interpolator 對(duì)象,我認(rèn)為它們是全局的,但是,正如在這個(gè) GitHub線程中已經(jīng)指出的那樣,我應(yīng)該調(diào)用ray.put它們。問題是我遇到了這些ValueError: buffer source array is read-only我不知道如何診斷的問題。另外,我不確定是否應(yīng)該用主要功能裝飾所有功能@ray.remote或只裝飾主要功能。我想我可以@ray.remote(num_cpus=1)為所有附加功能做,因?yàn)樗鼘?shí)際上只應(yīng)該是并行執(zhí)行的主要功能,但我不知道這是否有意義。
查看完整描述

1 回答

?
慕田峪4524236

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ò)誤。


查看完整回答
反對(duì) 回復(fù) 2023-06-13
  • 1 回答
  • 0 關(guān)注
  • 233 瀏覽
慕課專欄
更多

添加回答

舉報(bào)

0/150
提交
取消
微信客服

購課補(bǔ)貼
聯(lián)系客服咨詢優(yōu)惠詳情

幫助反饋 APP下載

慕課網(wǎng)APP
您的移動(dòng)學(xué)習(xí)伙伴

公眾號(hào)

掃描二維碼
關(guān)注慕課網(wǎng)微信公眾號(hào)