[英]Load-balancing in parallel processing application
我正在構建一個網絡分布式並行處理應用程序,它在許多機器上使用CPU和GPU資源的組合。
該應用程序必須在數千次迭代的非常大的數據集上執行一些計算成本非常高的操作:
for step = 0 to requested_iterations
for i = 0 to width
for j = 0 to height
for k = 0 to depth
matrix[i,j,k] = G*f(matrix[i,j,k])
此外,矩陣運算必須同步執行:也就是說,每次迭代都取決於緊接在它之前的幀的結果。
此ad-hoc網格中可用的硬件(包括專用服務器和空閑桌面計算機)在不同機器之間的性能差異很大。 我想知道最好的方法是平衡整個系統的工作量。
一些特質:
網格應盡可能健壯。 一些模擬需要數周才能運行,如果100台機器中有一台脫機,則不必取消運行會很好。
一些低端機器(閑置的桌面,但有人登錄時必須喚醒)可以隨時加入和離開網格。
專用服務器也可以加入和離開網格,但這是可預測的。
到目前為止,我能想出的最好的想法是:
A
比機器B
快100倍,它將在給定幀中接收100倍的矩陣單元(假設矩陣大小足以保證包括額外的機器)。 或者 ,
將節點排列在樹結構中,其中每個節點都分配了“權重”。 樹中較高的節點具有基於其能力與其子女的能力相結合的權重。 每幀調整此重量。 當節點失去與其子節點的通信時,它使用緩存的樹圖來聯系孤立的子節點並重新平衡其分支。
如果它有所不同,該應用程序是C#和OpenCL的組合。
歡迎鏈接到論文,示例應用程序,尤其是教程。
編輯
這不是功課。 我正在把我作為論文一部分寫的模擬器變成一個更有用的產品。 現在,工作統一分配,不考慮每台機器的性能,也沒有設備從加入或離開電網的機器中恢復。
感謝您提供優質,詳盡的回復。
對於異構集群,我喜歡讓每個處理器在處理器可用時請求新作業。 實現涉及一個輕量級服務器,可以一次處理多個請求(但通常只返回一個作業號)。 實現可能會是這樣的:
這是您上面建議的輕量級替代品。 您的快速處理器仍然比較慢的處理器做更多的工作,但您不必計算任務所需的時間。 如果處理器因任何原因退出,它將停止要求任務。 您的服務器可以選擇在一定時間后回收任務編號。
這幾乎是集群調度程序自己做的事情,除了處理器沒有啟動和關閉成本,因此您的個人任務可以更小而不會受到懲罰。
我會選擇分散的解決方案。
每個節點從中心挑選 (未給出)相同數量的工作。 在一些運行之后,每個節點都能夠為itself
尋求平均計算能力並與其他人進行通信。
畢竟每個節點都有一個每個節點的平均計算能力的表。 擁有這些信息(可能是持久的,為什么不呢?)每個節點都可以通過簽訂合同來“請求”其他節點更有力地將一些東西委托給它。
在每個進程開始之前,每個節點都必須發出關於“我開始做X”的廣播信號。 有一次總是播出:“我完成了X”。
嗯,這並不容易 ,因為當你開始工作時會出現這種情況,在你的硬盤發生故障並且你永遠無法完成它之后。 其他人,特別是那些等待你的結果的人應該弄清楚這一點並從籃子中挑選你的工作並從頭開始。 這里有“ping”技術與計時器。
不好:第一個調整時間可能需要非常不同的時間。
好:您將擁有幾乎容錯的解決方案。 將它們保留一個星期,即使某些節點發生故障,您的網格仍然存活並完成其工作。
很多年前,我做過類似的事情並取得了不錯的成績。 但它並沒有像您所描述的那樣大規模。 實際上,規模也有所不同。
所以選擇取決於你。
希望這可以幫助。
我不打算在服務器級別過多地跟蹤這些統計數據。 你要引入相當多的開銷。
相反,控制服務器應該只維護一個工作單元列表。 當客戶端變得可用時,讓它抓住下一個單元並進行處理。 沖洗,重復。
一旦給定矩陣的工作單元列表用盡,則允許重新分配當前不完整的工作單元。
基於包含10個工作單元和5個服務器的矩陣的示例。
同樣快,全部可用:
服務器1檢入並抓取單元1.接下來的4台機器(即:服務器2獲得單元2 ......)當單元1完成時,服務器1然后抓住單元6.其他機器抓住其余的。 一旦最后一台服務器簽入,矩陣就完成了。
低差異性能,全部可用:
您再次啟動循環,服務器將獲取前5個單元。 但是,服務器1比其他服務器長30%。 這意味着服務器2將抓住單元6.等等。在某些時刻,服務器1將檢查單元1,同時單元2到5將完成,並且將分配6到10。 服務器1被分配了單元6,因為它還沒有完成。 但是,服務器2將在服務器1完成之前檢入它已完成的工作。 沒什么大不了的,只是扔掉最后的結果。
巨大的不同表現,全部可用
您再次啟動循環,服務器將獲取前5個單元。 假設服務器1比其他服務器節省400%的時間。 這意味着服務器2將抓取單元6等。在服務器2檢查單元6之后,它將看到單元#1仍在進行中。 繼續並將其分配給服務器2; 這將在服務器1返回之前完成。
在這種情況下,您應該監視那些一直報告工作遲到的計算機並將其從進一步考慮中刪除。 當然,由於關機或個人使用,您必須為那些離線的人做一些補貼。 可能是某種類型的加權評級,一旦它低於某個閾值,你就會拒絕進一步的工作; 也許評級會經常重置,以便從它將遇到的穩定狀態重新平衡。
機器消失了
這與上面列出的“巨大的不同表現”具有完全相同的計划。 唯一的區別是機器將永遠不會報告,或者會在一段未知的時間后報告。
如果由於某種原因你有更多的機器而不是單位,那么會發生一件有趣的事情:多個服務器將被立即分配到同一個工作單元。 您可以通過設置某種類型的延遲來停止此操作(例如,在允許重新分配之前,單元必須處於x分鍾的過程中)或者只是允許它發生。 應該考慮這一點。
我們做了什么? 首先,我們減輕了追蹤個人表現的需要。 其次,我們已經允許機器消失,同時確保工作仍然完成。 第三,我們確保盡可能在最短的時間內完成工作。
這比簡單地根據性能將多個單元塊分配給機器要簡單得多; 但是,這使得即使是快速的機器也可以從網絡中拔出,同時確保完全可恢復性。 哎呀你可以殺死所有的機器,然后打開其中一些機器去接你離開的地方。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.