2017-05-29 22 views
10

我有一個小型Web服務器,它根據句子獲取輸入,並需要使用Tensorflow服務返回模型預測。它使用我們的單GPU能夠很好地工作,但是現在我希望啓用批處理,以便Tensorflow Serving在GPU上一次處理它們之前等待輸入的句子。在Tensorflow服務中調試批處理(沒有觀察到效果)

我使用predesigned server frameworkpredesigned batching framework使用Tensorflow服務的初始版本。我使用--batching標誌啓用批處理,並設置了batch_timeout_micros = 10000max_batch_size = 1000。日誌記錄確認批處理已啓用並且正在使用GPU。

但是,向服務器發送請求時,批處理的影響很小。在發送5個請求的同時,發送50個請求的時間幾乎是線性的。有趣的是,服務器的predict()函數針對每個請求運行一次(請參閱here),這表明批處理沒有得到正確處理。

我錯過了什麼嗎?如何檢查批次的問題?


注意,這是從How to do batching in Tensorflow Serving?不同,因爲這個問題只檢查如何從一個客戶端發送多個請求,而不是如何讓Tensorflow服務的幕後的配料爲多個獨立的請求。

回答

4

(我不熟悉服務器框架,但我很熟悉HPC與CUBLAS和cuDNN,圖書館TF用來做它的點積和迴旋的GPU)

有幾個問題這可能會導致批量大小令人失望的性能縮放。

I/O開銷,其中我的意思是網絡傳輸,磁盤訪問(用於大數據),串行化,反序列化和類似的東西。這些事情在數據的大小上往往是線性的。爲了研究這個開銷,我建議你部署2個模型:一個你真正需要的,一個是微不足道的,但使用相同的I/O,然後減去另一個需要的時間。

這個時間差異應該類似於運行復雜模型所花費的時間,當您直接使用它時,沒有I/O開銷。

如果瓶頸在I/O中,加速GPU工作是無足輕重的。

請注意,即使增加批量大小使GPU速度更快,它可能會使整體速度變慢,因爲GPU現在必須等待整批的I/O完成才能開始工作。

cuDNN縮放:之類的東西matmul需要大批量實現自己的最佳吞吐量,但使用卷積cuDNN可能不會(至少它沒有被我的經驗,但這可能取決於版本和GPU拱)

內存,GPU內存或PCIe帶寬限制型號:如果您的型號的瓶頸出現在這些瓶頸中的任何一個,它可能不會受益於更大的批量。

檢查此方法的方法是直接運行模型(可能使用模擬輸入),將時間與上述時間差進行比較,並將其作爲批量大小的函數繪製。


順便說一句,因爲每performance guide,有一兩件事你可以嘗試使用NCHW佈局,如果你是不是已經。那裏還有其他提示。