2016-12-12 47 views
1

根據文檔,我可以使用tf.py_func來定義我自己的操作。它將接收Numpy數組並且必須返回Numpy數組。它沒有明確寫在文檔中,但是我從中得出結論:它將被綁定到CPU設備上?僅用於CPU操作的py_func?

如果我將其與其他可能在GPU上運行的操作系統結合起來,TF會不會貪婪地將盡可能多的計算移動到GPU上,並自動將GPU和CPU之間的內存傳輸給我的tf.py_func op? (就像Theano會做的那樣)。

是否有類似tf.py_func來定義GPU操作?

回答

4

py_func是一個奇怪的 - 它在與用於創建操作的解釋器相同的Python解釋器中運行Python代碼。所以如果你的周邊操作系統是GPU,將會有GPU < - > CPU傳輸。此外,還會有一個副本在Python地址空間和TensorFlow地址空間之間移動數據(例如,memcpy here

如果您問的是如何在GPU上運行Python代碼,那就是Numba。如果你問TensorFlow GPU中如何使用「功能」類似的東西,那麼有Defun。通常,TensorFlow正朝着定義足夠的numpy特徵的方向發展,因此您不需要使用numpy,而是可以使用原生TF原語實現您的功能。

在依賴TensorFlow引擎的同時,還有另一種可能的方式留在Python-land中。你可以創建一個Python包裝器來實現模擬Python數字類型interface,但委託實際工作到底層TensorFlow引擎。有點像numpy實現接口並將基礎工作委託給BLAS庫。

使用一些技巧,您可以在數據始終停留在GPU上的情況下完成此項工作。對概念驗證實施進行了概述here

+0

感謝您的寶貴意見。關於'Defun':那麼,在函數內部,參數是什麼類型?我可以在那裏實現任何命令邏輯,而循環等?或者它只在測試例子中用於標量嗎?它是如何將它轉換成GPU運算的?在某些情況下,我想直接編寫CUDA代碼。是否還有像Theano這樣簡單的Python接口?還是我需要使用C++ API? – Albert

+1

Defun允許您將TensorFlow圖形分成重複的對象。所以只有TF圖形操作可以在那裏執行。 TF圖形支持一些流量控制,例如限制while循環(不允許副作用或中斷/繼續)。您必須使用C API編寫自定義CUDA內核,這裏是一個示例 - https://github.com/MycChiu/fast-LayerNorm-TF –