任何深度學(xué)習(xí)都是從數(shù)據(jù)開始。這是非常關(guān)鍵的一點。沒有數(shù)據(jù),我們就無法訓(xùn)練模型,也無法評估模型質(zhì)量,更無法做出預(yù)測。因此,數(shù)據(jù)源非常重要。在做研究、構(gòu)建新的神經(jīng)網(wǎng)絡(luò)架構(gòu),以及做實驗時,我們習(xí)慣使用最簡單的本地數(shù)據(jù)源,通常是不同格式的文件。這種方法確實非常有效。但在某種情況下,我們需要更加接近生產(chǎn)環(huán)境。這時,簡化和加速生產(chǎn)數(shù)據(jù)饋送,以及能夠處理大數(shù)據(jù)就變得非常重要。這也正是 Apache Ignite 大展身手的時候。
Apache Ignite是以內(nèi)存為中心的分布式數(shù)據(jù)庫,也是事務(wù)性、分析性和流式工作負(fù)載的緩存和處理平臺,可以實現(xiàn) PB 級的內(nèi)存速度。借助 Apache Ignite 和 TensorFlow 之間的現(xiàn)有集成,您可以將 Apache Ignite 用作神經(jīng)網(wǎng)絡(luò)訓(xùn)練和推理的數(shù)據(jù)源,也可以將其用作分布式訓(xùn)練的檢查點存儲空間和集群管理器。
分布式內(nèi)存數(shù)據(jù)源
作為以內(nèi)存為中心的分布式數(shù)據(jù)庫,Apache Ignite可以提供快速數(shù)據(jù)訪問。讓您能夠擺脫硬盤限制,在分布式集群中存儲和處理您需要的所有數(shù)據(jù)。您可以通過使用 Ignite Dataset 來利用 Apache Ignite 的這些優(yōu)勢。
請注意,Apache Ignite 不只是數(shù)據(jù)庫或數(shù)據(jù)倉庫與 TensorFlow 之間 ETL 管道的一個步驟,它還是一個HTAP(混合事務(wù) / 分析處理)系統(tǒng)。通過選擇 Apache Ignite 和 TensorFlow,您會獲得一個用于事務(wù)和分析處理的單一系統(tǒng),同時還可以使用操作和歷史數(shù)據(jù)進行神經(jīng)網(wǎng)絡(luò)訓(xùn)練和推理。
以下基準(zhǔn)測試結(jié)果表明,Apache Ignite 非常適合用于單節(jié)點數(shù)據(jù)存儲用例。如果存儲空間和客戶端位于同一節(jié)點,則通過使用 Apache Ignite,您可以實現(xiàn)每秒超過 850 MB 的吞吐量。如果存儲空間位于與客戶端相關(guān)的遠(yuǎn)程節(jié)點,則吞吐量約為每秒 800 MB。
當(dāng)存在一個本地 Apache Ignite 節(jié)點時 Ignite Dataset 的吞吐量。執(zhí)行該基準(zhǔn)測試時使用的是 2 個 Xeon E5–2609 v4 1.7GHz 處理器,配備 16Gb 內(nèi)存和每秒 10 Gb 的網(wǎng)絡(luò)(1MB 的行和 20MB 的頁面大小)
另一個基準(zhǔn)測試表明 Ignite Dataset 如何與分布式 Apache Ignite 集群協(xié)作。這是 Apache Ignite 作為 HTAP 系統(tǒng)的默認(rèn)用例,它使您能夠在每秒 10 Gb 的網(wǎng)絡(luò)集群上為單個客戶端實現(xiàn)每秒超過 1 GB 的讀取吞吐量。
分布式 Apache Ignite 集群具備不同數(shù)量的節(jié)點(從 1 到 9)時 Ignite Dataset 的吞吐量。執(zhí)行該基準(zhǔn)測試時使用的是 2 個 Xeon E5–2609 v4 1.7GHz 處理器,配備 16Gb 內(nèi)存和每秒 10 Gb 的網(wǎng)絡(luò)(1MB 的行和 20MB 的頁面大?。?/p>
測試后的用例如下:Apache Ignite 緩存(以及第一組測試中數(shù)量不同的分區(qū)和第二組測試中的 2048 個分區(qū))由 10000 個大小為 1MB 的行填充,然后 TensorFlow 客戶端使用 Ignite Dataset 讀取所有數(shù)據(jù)。所有節(jié)點均以 2 個 Xeon E5–2609 v4 1.7GHz 處理器表示,配備 16Gb 內(nèi)存和每秒 10Gb 的網(wǎng)絡(luò)連接。每個節(jié)點使用默認(rèn) 配置運行 Apache Ignite。
注:配置 鏈接
https://github.com/apache/ignite/blob/master/examples/config/example-default.xml
您可以很輕松地將 Apache Ignite 同時用作帶有結(jié)構(gòu)化查詢語言 (SQL) 界面的傳統(tǒng)數(shù)據(jù)庫和 TensorFlow 數(shù)據(jù)源。
apache-ignite/bin/ignite.shapache-ignite/bin/sqlline.sh -u "jdbc:ignite:thin://localhost:10800/"
CREATE TABLE KITTEN_CACHE (ID LONG PRIMARY KEY, NAME VARCHAR);INSERT INTO KITTEN_CACHE VALUES (1, 'WARM KITTY');INSERT INTO KITTEN_CACHE VALUES (2, 'SOFT KITTY');INSERT INTO KITTEN_CACHE VALUES (3, 'LITTLE BALL OF FUR');
import tensorflow as tffrom tensorflow.contrib.ignite import IgniteDatasettf.enable_eager_execution()dataset = IgniteDataset(cache_name="SQL_PUBLIC_KITTEN_CACHE")for element in dataset: print(element)
{'key': 1, 'val': {'NAME': b'WARM KITTY'}}{'key': 2, 'val': {'NAME': b'SOFT KITTY'}}{'key': 3, 'val': {'NAME': b'LITTLE BALL OF FUR'}}
結(jié)構(gòu)化對象
使用Apache Ignite,您可以存儲任何類型的對象。這些對象可以具備任何層次結(jié)構(gòu)。Ignite Dataset 能夠處理此類對象。
import tensorflow as tffrom tensorflow.contrib.ignite import IgniteDatasettf.enable_eager_execution()dataset = IgniteDataset(cache_name="IMAGES")for element in dataset.take(1): print(element)
{ 'key': 'kitten.png', 'val': { 'metadata': { 'file_name': b'kitten.png', 'label': b'little ball of fur', width: 800, height: 600 }, 'pixels': [0, 0, 0, 0, ..., 0] }}
如果您使用 Ignite Dataset,則神經(jīng)網(wǎng)絡(luò)訓(xùn)練和其他計算所需的轉(zhuǎn)換都可以作為tf.data管道的一部分來完成。
import tensorflow as tffrom tensorflow.contrib.ignite import IgniteDatasettf.enable_eager_execution()dataset = IgniteDataset(cache_name="IMAGES").map(lambda obj: obj['val']['pixels'])for element in dataset: print(element)
[0, 0, 0, 0, ..., 0]
分布式訓(xùn)練
作為機器學(xué)習(xí)框架,TensorFlow 可以為分布式神經(jīng)網(wǎng)絡(luò)訓(xùn)練、推理及其他計算提供原生支持。分布式神經(jīng)網(wǎng)絡(luò)訓(xùn)練的主要理念是能夠在每個數(shù)據(jù)分區(qū)(根據(jù)水平分區(qū))上計算損失函數(shù)的梯度(例如,誤差的平方),然后對梯度求和,以得出整個數(shù)據(jù)集的損失函數(shù)梯度。借助這種能力,我們可以在數(shù)據(jù)存儲位置的節(jié)點上計算梯度,減少梯度,最后更新模型參數(shù)。這樣,您就無需在節(jié)點間傳輸數(shù)據(jù),從而避免了網(wǎng)絡(luò)瓶頸。
Apache Ignite 在分布式集群中使用水平分區(qū)存儲數(shù)據(jù)。在創(chuàng)建 Apache Ignite 緩存(或基于 SQL 的表格)時,我們可以指定將要在此對數(shù)據(jù)進行分區(qū)的分區(qū)數(shù)量。例如,如果一個 Apache Ignite 集群由 100 臺機器組成,我們創(chuàng)建了一個有 1000 個分區(qū)的緩存,則每臺機器將要維護 10 個數(shù)據(jù)分區(qū)。
Ignite Dataset 允許使用分布式神經(jīng)網(wǎng)絡(luò)訓(xùn)練(使用 TensorFlow)和 Apache Ignite 分區(qū)的這兩個方面。Ignite Dataset 是一個可以在遠(yuǎn)程工作器上執(zhí)行的計算圖操作。遠(yuǎn)程工作器可以通過為工作器進程(例如 IGNITE_DATASET_HOST、IGNITE_DATASET_PORT 或 IGNITE_DATASET_PART)設(shè)置相應(yīng)的環(huán)境變量來替換 Ignite Dataset 的參數(shù)(例如主機、端口或分區(qū))。使用這種替換方法,我們可以為每個工作器分配一個特定分區(qū),這樣一個工作器處理一個分區(qū),同時可以與單個數(shù)據(jù)集透明協(xié)作。
import tensorflow as tffrom tensorflow.contrib.ignite import IgniteDatasetdataset = IgniteDataset("IMAGES")# Compute gradients locally on every worker node.gradients = []for i in range(5): with tf.device("/job:WORKER/task:%d" % i): device_iterator = tf.compat.v1.data.make_one_shot_iterator(dataset) device_next_obj = device_iterator.get_next() gradient = compute_gradient(device_next_obj) gradients.append(gradient)# Aggregate them on master node.result_gradient = tf.reduce_sum(gradients)with tf.Session("grpc://localhost:10000") as sess: print(sess.run(result_gradient))
借助 Apache Ignite,您還可以使用 TensorFlow 高級Estimator API來進行分布式訓(xùn)練。此功能以所謂的 TensorFlow 分布式訓(xùn)練的 獨立客戶端模式 為基礎(chǔ),Apache Ignite 在其中發(fā)揮數(shù)據(jù)源和集群管理器的作用。與此相關(guān)的內(nèi)容,我們將在下一篇文章中全面介紹。
注:獨立客戶端模式 鏈接
https://github.com/tensorflow/tensorflow/tree/master/tensorflow/contrib/distribute#standalone-client-mode
檢查點存儲
除數(shù)據(jù)庫功能外,Apache Ignite 還有一個名為IGFS的分布式文件系統(tǒng)。IGFS 可以提供與 Hadoop HDFS 類似的功能,但僅限于內(nèi)部存儲。事實上,除自有 API 外,IGFS 還采用了 Hadoop FileSystem API,并且可以透明地插接到 Hadoop 或 Spark 部署中。Apache Ignite 上的 TensorFlow 支持 IGFS 與 TensorFlow 集成。該集成基于 TensorFlow 端的 自定義文件系統(tǒng)插件 和 Apache Ignite 端的IGFS Native API。它有許多用例,例如:
可以將狀態(tài)檢查點保存到 IGFS 中,以獲得可靠性和容錯性
訓(xùn)練過程可以通過將事件文件寫入 TensorBoard 監(jiān)視的目錄來與 TensorBoard 通信。即使 TensorBoard 在不同的進程或機器中運行,IGFS 也允許進行此通信
注:自定義文件系統(tǒng)插件 鏈接
https://www.tensorflow.org/guide/extend/filesystem
IGFS Native API 鏈接
https://ignite.apache.org/features/igfs.html
此功能于 TensorFlow 1.13 中發(fā)布,并將在 TensorFlow 2.0 中作為tensorflow/io的一部分發(fā)布。
注:tensorflow/io 鏈接
https://github.com/tensorflow/io
SSL 連接
通過 Apache Ignite,您可以使用SSL和身份驗證來保護數(shù)據(jù)傳送渠道。Ignite Dataset 支持具備和不具備身份驗證的 SSL 連接。如需更多信息,請參閱Apache Ignite SSL/TLS文檔(https://apacheignite.readme.io/docs/ssltls)。
import tensorflow as tffrom tensorflow.contrib.ignite import IgniteDatasettf.enable_eager_execution()dataset = IgniteDataset(cache_name="IMAGES", certfile="client.pem", cert_password="password", username="ignite", password="ignite")
Windows 支持
Ignite Dataset 完全兼容 Windows 系統(tǒng)。您可以在 Windows 工作站和 Linux/MacOS 系統(tǒng)上將其用作 TensorFlow 的一部分。
試用
以下示例將幫助您輕松開始使用此模塊。
Ignite Dataset
要試用 Ignite Dataset,最簡單的方法是使用 Apache Ignite 和加載好的MNIST數(shù)據(jù)運行Docker容器,然后使用 Ignite Dataset 與其交互。您可以在 Docker Hub:dmitrievanthony/ignite-with-mnist上找到此容器。您需要在機器上啟動此容器:
docker run -it -p 10800:10800 dmitrievanthony/ignite-with-mnist
注:MNIST 鏈接
http://yann.lecun.com/exdb/mnist/
dmitrievanthony/ignite-with-mnist 鏈接
https://hub.docker.com/r/dmitrievanthony/ignite-with-mnist/
然后您可以按照以下方法使用它:
IGFS
TensorFlow 的 IGFS 支持功能于 TensorFlow 1.13 中發(fā)布,并將在 TensorFlow 2.0 中作為tensorflow/io的一部分發(fā)布。如要通過 TensorFlow 試用 IGFS,最簡單的方法是使用 Apache Ignite 和 IGFS 來運行Docker容器,然后使用 TensorFlowtf.gfile與其交互。您可以在 Docker Hub:dmitrievanthony/ignite-with-igfs上找到此容器。您可以在自己的機器上運行此容器:
docker run -it -p 10500:10500 dmitrievanthony/ignite-with-igfs
然后您可以按照以下方法使用它:
import tensorflow as tfimport tensorflow.contrib.ignite.python.ops.igfs_opswith tf.gfile.Open("igfs:///hello.txt", mode='w') as w: w.write("Hello, world!")with tf.gfile.Open("igfs:///hello.txt", mode='r') as r: print(r.read())
Hello, world!
限制
目前,Ignite Dataset 需要假設(shè)緩存中的所有對象都具有相同的結(jié)構(gòu)(同類型對象),并且緩存中至少包含一個檢索架構(gòu)所需的對象。另一個限制與結(jié)構(gòu)化對象有關(guān),Ignite Dataset 不支持通用唯一識別碼 (UUID)、地圖和可能是對象結(jié)構(gòu)組成部分的對象數(shù)組。所有這些限制都是進一步開發(fā)的主題。
即將發(fā)布的 TensorFlow 2.0
TensorFlow 2.0 中即將發(fā)布的新變更會將此功能分離到tensorflow/io模塊。之后,您將可以更加靈活地使用此功能。這些示例將略有改動,我們的文檔和示例也會反映這一點。
-
神經(jīng)網(wǎng)絡(luò)
+關(guān)注
關(guān)注
42文章
4771瀏覽量
100766 -
大數(shù)據(jù)
+關(guān)注
關(guān)注
64文章
8889瀏覽量
137441 -
深度學(xué)習(xí)
+關(guān)注
關(guān)注
73文章
5503瀏覽量
121162 -
tensorflow
+關(guān)注
關(guān)注
13文章
329瀏覽量
60536
原文標(biāo)題:Apache Ignite 上的 TensorFlow
文章出處:【微信號:tensorflowers,微信公眾號:Tensorflowers】歡迎添加關(guān)注!文章轉(zhuǎn)載請注明出處。
發(fā)布評論請先 登錄
相關(guān)推薦
評論