我使用tensorflow來訓練DNN,我的網絡結構非常簡單,每個小型機器只有一臺參數服務器和一名工人時需要大約50ms。爲了處理大量樣本,我使用了分佈式ASGD培訓,但是,我發現增加的工人數量不能提高吞吐量,例如,在參數服務器機器數量和工人機器數量增加一倍之後,有40臺機器每秒可以達到150萬個樣本集羣仍然只能每秒處理150萬個樣本,甚至更糟。原因是當羣集很大時,每個步驟需要更長的時間。 tensorflow是否具有良好的可塑性,並提供加速培訓的建議?Tensorflow可擴展性
1
A
回答
2
解決這些問題的一般方法是找出瓶頸在哪裏。您可能會遇到軟件或硬件的瓶頸。
做數學運算的一般示例 - 假設您有250M個參數,每個反向過程需要1秒。這意味着每個工作人員將發送1GB /秒的數據並接收1GB /秒的數據。如果你有40臺機器,那麼工人和參數服務器之間的傳輸速度將爲80GB /秒。假設參數服務器機器只有1GB /秒的全雙工NIC卡。這意味着如果你有少於40個參數服務器碎片,那麼你的NIC卡速度將成爲瓶頸。
經過判斷,你應該考慮互連速度。您的羣集中可能有N個網卡,但羣集很可能無法處理將數據發送到所有其他網卡的所有網卡。您的集羣可以處理80臺機器之間80GB /秒的數據流量嗎?谷歌設計自己的網絡硬件來處理他們的互連需求,所以這是一個重要的問題約束。
一旦你檢查你的網絡硬件可以處理負載,我會檢查軟件。 IE,假設你有一個工作人員,「發送時間」與參數服務器分片的數量有什麼關係?如果縮放強度是次線性的,則表明存在瓶頸,可能是某些線程的低效調度或某些其他問題。
作爲查找和修復軟件瓶頸的示例,請參閱grpc RecvTensor is slow問題。如果您嘗試發送超過100MB的消息,則該問題涉及gRPC層變得效率低下。這個問題在上游gRPC版本中得到修復,但尚未集成到TensorFlow版本中,所以目前的解決方法是將消息分解爲100MB或更小的碎片。
找到這些的一般方法是編寫大量的基準來驗證您對速度的假設。
下面是一些例子:
相關問題
- 1. tensorflow的可擴展性
- 2. Firebase可擴展性
- 3. DB4O可擴展性
- 4. DotNetNuke可擴展性
- 5. Rethinkdb可擴展性
- 6. Boost.Asio的可擴展性
- 7. OpenGL擴展的可用性
- 8. RavenDB - 規劃可擴展性
- 9. Poco SocketReactor可擴展性
- 10. Visual Studio可擴展性
- 11. websocket的可擴展性
- 12. PEX的可擴展性
- 13. CQRS + EventSourcing可擴展性
- 14. tomcat的可擴展性EJB
- 15. TCP保持可擴展性
- 16. Extrafields可視性。 K2擴展
- 17. 我可以切換擴展器的可擴展性嗎?
- 18. SaaS可擴展性 - Tomcat足夠可擴展嗎?
- 19. 流星的可擴展性和性能
- 20. 擴展Spring雲 - 雲計算平臺可擴展性
- 21. Javascript擴展性
- 22. 擴展屬性
- 23. TensorFlow中的索引子擴展
- 24. Tensorflow擴展佔位符尺寸
- 25. Tensorflow中可擴展,高效的分層Softmax?
- 26. DataTables ColVis擴展列的可見性
- 27. SQL搜索緩存 - 高可擴展性
- 28. 數據庫可擴展性問題
- 29. MongoDB設計的可擴展性
- 30. SynchronizationContext和ASP.NET Web API可擴展性點
我的猜測是,I/O或者更普遍的輸入管道是瓶頸。你如何閱讀數據?你的隊列滿了嗎? –
@AllenLavoie我沒有使用任何隊列,除了文件名隊列。我的圖形使用SSD中的tfrecord讀取器讀取原始數據,然後使用自定義運算符解析原始數據。文件IO和自定義操作符不是瓶頸。有沒有人使用非常大的集羣進行培訓? –
什麼是輸入管道的無訓練吞吐量?同樣,您可以獲得每秒多少個樣本的合成數據?每個工人的CPU/GPU的利用率如何? –