Apache Ignite上的TensorFlow

任何深度學習都是從數據開始的。沒有數據,我們就無法訓練一個深度學習模型,無法評估模型的質量,也無法做出預測。做實驗時,我們習慣使用最簡單的本地數據源,通常是不同格式的文件。這種方法當然非常有效。但是在某種程度上,我們需要更接近生產環境,能夠處理大數據變得非常重要。這時,Apache Ignite開始發揮作用。

Apache Ignite是一個以內存為中心的分佈式數據庫,緩存和處理平臺,用於事務,分析和流式工作負載。Apache Ignite和TensorFlow之間的現有集成允許您將Apache Ignite用作神經網絡訓練和推理的數據源,以及用於分佈式訓練的檢查點存儲和集群管理器。

分佈式內存數據源

Apache Ignite是以內存為中心的分佈式數據庫,提供快速的數據訪問。它允許您避免硬盤驅動器的限制,在分佈式集群中存儲和操作所需的所有數據。您可以通過使用Ignite數據集來利用Apache Ignite的這些優點。

請注意,Apache Ignite不僅僅是數據庫或數據倉庫與TensorFlow之間的ETL管道的一個步驟。Apache Ignite還是一個HTAP(混合事務/分析處理)系統。通過選擇Apache Ignite和TensorFlow,您可以獲得一個用於事務和分析處理的單一系統,同時還可以使用您的操作和歷史數據進行神經網絡訓練和推理。

以下基準測試結果表明Apache Ignite非常適合單節點數據存儲用例。如果存儲和客戶端放在同一節點上,它允許您實現超過850 MB / s的吞吐量。如果存儲在遠程節點上與客戶端相關,則吞吐量約為800 MB / s。

Apache Ignite上的TensorFlow

在一個本地Apache Ignite節點的情況下,Ignite數據集的吞吐量。該基準測試是在2x Xeon E5-2609 v4 1.7GHz上準備的,具有16Gb內存和10 Gb / s網絡(1MB rows and 20MB page size)。

另一個基準測試演示了Ignite Dataset如何與分佈式Apache Ignite集群協同工作。這是Apache Ignite作為HTAP系統的默認用例,它允許您在單個客戶端的10 Gb / s網絡集群上實現超過1 GB / s的讀取吞吐量。

Apache Ignite上的TensorFlow

在具有不同節點數(從1到9)的分佈式Apache Ignite群集的情況下,Ignite數據集吞吐量。此基準測試是在2x Xeon E5-2609 v4 1.7GHz上準備的,具有16Gb內存和10Gb / s網絡(1MB rows and 20MB page size)。

測試的用例如下:Apache Ignite緩存(第一組測試中包含不同數量的分區,第二組中有2048個分區)填充10K行,每行1MB,然後TensorFlow客戶端使用Ignite Dataset讀取所有數據。所有節點均由2x Xeon E5-2609 v4 1.7GHz和16Gb內存表示,並通過10Gb / s網絡連接。每個節點都使用默認配置運行Apache Ignite 。

使用Apache Ignite作為具有SQL接口的經典數據庫和同時作為TensorFlow數據源很容易。

Apache Ignite上的TensorFlow

表結構如下:

Apache Ignite上的TensorFlow

Python示例如下:

Apache Ignite上的TensorFlow

輸出:

Apache Ignite上的TensorFlow

結構化對象

Apache Ignite允許存儲任何類型的對象。這些對象可以具有任何層次結構。 Ignite Dataset提供了處理此類對象的能力。Python示例代碼如下:

Apache Ignite上的TensorFlow

輸出:

Apache Ignite上的TensorFlow

神經網絡訓練和其他計算需要轉換,如果使用Ignite Dataset,可以將轉換作為tf.data管道的一部分進行。

Apache Ignite上的TensorFlow

[0, 0, 0, 0, ..., 0]

分佈式訓練

TensorFlow是一個機器學習框架,它支持分佈式神經網絡的訓練、推理和其他計算。分佈式神經網絡訓練的主要思想是在數據的每個分區(水平分區)上計算損失函數的梯度(例如誤差的平方),然後求和得到整個數據集的損失函數梯度。利用這種能力,我們可以計算數據存儲在節點上的梯度,減少它們,最後更新模型參數。它允許您避免節點之間的數據傳輸,從而避免網絡瓶頸。

Apache Ignite使用水平分區在分佈式群集中存儲數據。當我們創建Apache Ignite緩存(或基於SQL的表)時,我們可以指定數據將被分區的分區數。例如,如果Apache Ignite集群包含100臺計算機,並且我們創建了具有1000個分區的緩存,則每臺計算機將維護大約10個數據分區。

Ignite Dataset允許使用分佈式神經網絡訓練(使用TensorFlow)和Apache Ignite分區。Ignite Dataset是一個可以在遠程worker上執行的計算圖操作。遠程worker可以通過為worker進程(如IGNITE_DATASET_HOST、IGNITE_DATASET_PORT或IGNITE_DATASET_PART)設置相應的環境變量來覆蓋Ignite數據集參數(如IGNITE_DATASET_HOST, IGNITE_DATASET_PORT或IGNITE_DATASET_PART)。使用這種重寫方法,我們可以為每個worker分配一個特定的分區,以便一個worker處理一個分區,同時透明地處理單個數據集。

Apache Ignite上的TensorFlow

Apache Ignite還允許您使用TensorFlow高級Estimator API運行分佈式訓練。該功能基於TensorFlow分佈式培訓的獨立客戶端模式,Apache Ignite扮演數據源和集群管理器的角色。

檢查點存儲

除數據庫功能外,Apache Ignite還提供名為IGFS的分佈式文件系統。IGFS提供與Hadoop HDFS類似的功能,但僅限於內存中。實際上,除了自己的API之外,IGFS還實現了Hadoop FileSystem API,並且可以透明地插入到Hadoop或Spark部署中。Apache Ignite上的TensorFlow提供了IGFS和TensorFlow之間的集成。該集成基於TensorFlow端的自定義文件系統插件和Apache Ignite端的IGFS Native API。它有許多用例,例如:

  • 可以將狀態檢查點保存到IGFS以確保可靠性和容錯性。
  • 訓練過程通過將事件文件寫入TensorBoard監視的目錄來與TensorBoard進行通信。即使TensorBoard在不同的進程或機器中運行,IGFS也允許此通信工作。

此功能在TensorFlow 1.13中發佈,並將作為TensorFlow 2.0 中tensorflow / io的一部分發布。

SSL連接

Apache Ignite允許通過SSL和身份驗證保護數據傳輸通道。Ignite數據集支持帶身份驗證和不帶身份驗證的SSL連接。

Apache Ignite上的TensorFlow

Windows支持

Ignite Dataset與Windows完全兼容。您可以在Windows以及Linux / MacOS系統上將其用作TensorFlow的一部分。

使用示例

以下示例將幫助您輕鬆開始使用此模塊。

嘗試Ignite Dataset的最簡單方法是運行Docker容器並加載MNIST數據,然後使用Ignite Dataset開始與之交互。Docker Hub:dmitrievanthony / ignite-with-mnist。

docker run -it -p 10800:10800 dmitrievanthony/ignite-with-mnist

之後,您將能夠按照以下方式使用它:

Apache Ignite上的TensorFlow

IGFS

TensorFlow支持IGFS在TensorFlow 1.13中發佈,並將作為TensorFlow 2.0 中tensorflow / io的一部分發布。使用TensorFlow嘗試IGFS的最簡單方法是使用Apache Ignite + IGFS運行Docker容器,然後使用TensorFlow tf.gfile與之交互。這Docker Hub:dmitrievanthony / ignite-with-igfs。

docker run -it -p 10500:10500 dmitrievanthony/ignite-with-igfs

之後,您將能夠以下列方式使用它:

Apache Ignite上的TensorFlow

輸出:

Hello, world!

限制

目前,Ignite Dataset假設緩存中的所有對象具有相同的結構(同構對象),並且緩存至少包含檢索模式所需的一個對象。另一個限制涉及結構化對象,Ignite Dataset不支持UUID、映射和對象數組,這些可能是對象結構的一部分。

即將推出的TensorFlow 2.0

TensorFlow 2.0中即將發生的變化將導致將此功能分離為 模塊。


分享到:


相關文章: