簡體   English   中英

DL4J在具有Apache Spark的GPU上運行(而非訓練)LSTM神經網絡?

[英]DL4J running (not training) LSTM neural networks on GPUs with Apache Spark?

我需要使用實時數據(已經非常頻繁地提供新的時間步長)來運行幾個(數百個)已經訓練有素的LSTM神經網絡。 這些LSTM神經網絡是使用deeplearining4j實現的。 為了有效地運行所有這些程序,我希望它們使用GPU來執行它們的計算,以便我可以使用大量的實時數據運行數百個這樣的程序。

我知道我可以使用GPU訓練神經網絡。

我的問題是: 我可以在GPU上使用rnnTimeStep()在實時數據上執行它們嗎?

任何指針都非常感謝,我花了很多時間進行搜索,但是卻找不到任何東西。 僅描述GPU培訓的材料。

不用擔心GPU開銷,我正在考慮這一點,而且我知道這是一件不尋常的事情。 只需要知道是否有可能,以及是否有任何指示如何進行操作即可。

謝謝!

這不是GPU的工作方式。...您缺少有關設備實際工作方式的大量上下文。

由於與gpu通信的開銷較大,因此GPU不能用於實時推斷。 無論您使用哪種深度學習框架,都是如此。

您可以使用cpus並在這里做得很好。 您必須擁有一個批處理用例才能使GPU變得值得。

亞當的回答並不能真正說明整個故事。 您可以使用Spark Streaming在GPU上進行實時推斷,但是Spark確實使它比原來要難得多。 另外,由於您有一百個模型需要推理,因此這成為了很大的挑戰。

一個很大的障礙是,除非您正在運行YARN的最新版本,否則它確實沒有將GPU作為資源的概念。 因此,您必須使用可以控制其配置的群集,以便使每個節點的執行程序數量與GPU數量保持一致。 如果您還需要該集群來做其他事情,則必須使用放置標簽。

假設配置已准備就緒,下一個問題就是模型的剪切數量。 通常,在spark中使用DL4J時,您將需要使用RDD#mapPartitions,以便可以在單個工作線程(應該= 1 GPU)上獲得整個分區的數據。 映射的工作是加載模型(將其緩存在本地線程中),然后將分區分解為小批處理,並將其饋送到Model#output。 (DL4J / ND4J將處理每個線程到1個GPU的映射。)默認情況下,Spark中的映射是“整個集群”,因此所有數據將平均分配。 因此,每個節點將加載和卸載串聯的一百個模型中的每個模型。 這將是低效率的,並且不是完全實時的。

如果所有100個模型都是獨立的,那么一個不錯的選擇(不是很好)是通過創建[ModelId,DataSet]的PairRDD(復制DataSet 100次)並在單個Spark作業中執行漂亮的ReduceByKey來放大數據。 為了減少殺手級洗牌(或者如果模型不是獨立的),您將需要在執行者數量最大的情況下創建N個Spark流作業,並監聽Kafka主題。 如果模型更像DAG,那么您將真正開始使用Spark的模型,而在這種情況下您想要的更像Apache Storm。

上一次我與Storm一起工作時,它一次只能呈現一個東西,因此您必須正確配置它,以便可以創建可最大化GPU使用率的微型批處理。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM