亚洲在线久爱草,狠狠天天香蕉网,天天搞日日干久草,伊人亚洲日本欧美

為了賬號安全,請及時綁定郵箱和手機立即綁定
已解決430363個問題,去搜搜看,總會有你想問的

如何在 GPU 上有效地并行化 AlphaZero?

如何在 GPU 上有效地并行化 AlphaZero?

開滿天機 2022-06-14 17:24:58
我正在實現一個 AlphaZero 版本(AlphaGo 的最新版本),以應用于其他領域。該算法的關鍵是狀態空間 (CPU) 的蒙特卡洛樹搜索與來自 eval 模式 (GPU) 的神經網絡的“直覺”(概率)交錯。然后使用 MCTS 結果來訓練神經網絡。我已經通過啟動多個進程來并行化 CPU 執行,每個進程都建立自己的樹。這是有效的,現在已經導致GPU 瓶頸!(nvidia-smi 始終以 100% 顯示 GPU)我設計了 2 種策略來并行化 GPU 評估,但是它們都有問題。每個進程僅在其自己的樹中的批次上評估網絡。在我最初的幼稚實現中,這意味著批量大小為 1。但是,通過重構一些代碼并添加“虛擬損失”來阻止(但不完全阻止)同一節點被選中兩次,我們可以獲得更大的批量大小 1 -4。這里的問題是,在我們評估批次或準確性受到影響之前,我們不能允許大的延遲,所以小批量是這里的關鍵。將批次發送到一個中央“神經網絡工作者”線程,該線程組合和評估它們。這可以在 32 個或更多的大批量中完成,因此可以非常有效地使用 GPU。這里的問題是樹工作者發送 CUDA 張量“往返”,這不受 PyTorch 支持。如果我先克隆它們是受支持的,但是所有不斷的復制使這種方法比第一種方法慢。我在想也許一個我沒有看到的聰明的批處理方案可以使第一種方法起作用。使用多個 GPU 也可以加速第一種方法,但是 PyTorch 本身并不支持我想要的那種并行性。也許將所有張量保留在 NN worker 中并且只發送 id 可以改進第二種方法,但是這里的困難是如何有效地同步以獲得大批量而不使 CPU 線程等待太久。我幾乎沒有發現有關 AlphaZero 或 AlphaGo Zero 在各自論文中如何并行化的信息。我能夠在網上找到有限的信息,但這導致我改進了第一種方法。如果有任何建議,我將不勝感激,特別是如果我錯過了某些觀點或方法。
查看完整描述

1 回答

?
瀟瀟雨雨

TA貢獻1833條經驗 獲得超4個贊

以 tensorflow 服務為例,預測服務可以運行在不同的進程中,運行一個服務來接收來自 worker 的請求(運行一個 MCTS 進程并將預測請求發送到預測服務)。我們可以保留一個從套接字地址到套接字本身的字典。

預測服務可以讀取每個查詢正文及其標題(每個查詢都不同),我們可以將這些標題放入隊列中。在等待最多 100 毫秒或當前批次大于批次大小時,預測運行。在 GPU 給出結果后,我們循環遍歷結果,并且由于順序與隊列中的標頭相同,我們可以根據每個標頭通過套接字發回響應(可以從我們上面保存的 dict 中查找) )。

由于每個查詢都帶有不同的標頭,因此您不能錯過請求、響應和套接字。雖然您可以在運行多個工作程序的同時運行使用 GPU 卡的 tensorflow 服務,以保持批處理大小足夠大以獲得更大的吞吐量。

我也在這個 repo 中找到了一個批處理機制: https ://github.com/richemslie/galvanise_zero


查看完整回答
反對 回復 2022-06-14
  • 1 回答
  • 0 關注
  • 185 瀏覽
慕課專欄
更多

添加回答

舉報

0/150
提交
取消
微信客服

購課補貼
聯系客服咨詢優惠詳情

幫助反饋 APP下載

慕課網APP
您的移動學習伙伴

公眾號

掃描二維碼
關注慕課網微信公眾號