2019 年 2 月 22 日 — 由 Anton Dmitriev,GridGain Systems 的软件工程师撰写。
任何深度学习都始于数据。这是一个关键点。没有数据,我们就无法训练模型,无法评估模型质量,也无法进行预测。因此,数据源非常重要。在进行研究、发明新的神经网络架构和进行实验时,我们习惯于使用最简单的本地数据源,通常是不同格式的文件。这种方法非常有效。但到了一定程度,我们需要更接近生产环境。简化和加速生产数据馈送变得非常重要,并且能够处理大数据。而此时,Apache Ignite 就派上了用场。
在单个本地 Apache Ignite 节点的情况下,Ignite Dataset 吞吐量。此基准测试是在配备 2x Xeon E5–2609 v4 1.7GHz、16Gb 内存和 10 Gb/s 网络的机器上进行的(1MB 行和 20MB 页面大小)。 |
在具有不同节点数(从 1 到 9)的分布式 Apache Ignite 集群的情况下,Ignite Dataset 吞吐量。此基准测试是在配备 2x Xeon E5–2609 v4 1.7GHz、16Gb 内存和 10 Gb/s 网络的机器上进行的(1MB 行和 20MB 页面大小)。 |
apache-ignite/bin/ignite.sh
apache-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 tf
from tensorflow.contrib.ignite import IgniteDataset
tf.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'}}
import tensorflow as tf
from tensorflow.contrib.ignite import IgniteDataset
tf.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,这些转换可以在 tf.data
管道的一部分中完成。import tensorflow as tf
from tensorflow.contrib.ignite import IgniteDataset
tf.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]
IGNITE_DATASET_HOST, IGNITE_DATASET_PORT
或 IGNITE_DATASET_PART
)来覆盖 Ignite Dataset 参数(例如 host
、port
或 part
)。使用这种覆盖方法,我们可以为每个工作器分配一个特定分区,以便一个工作器处理一个分区,同时透明地使用单个数据集。import tensorflow as tf
from tensorflow.contrib.ignite import IgniteDataset
dataset = 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 运行分布式训练。此功能基于 TensorFlow 分布式训练的所谓 独立客户端 模式,Apache Ignite 充当数据源和集群管理器。下一篇文章将专门讨论这个主题。import tensorflow as tf
from tensorflow.contrib.ignite import IgniteDataset
tf.enable_eager_execution()
dataset = IgniteDataset(cache_name="IMAGES",
certfile="client.pem",
cert_password="password",
username="ignite",
password="ignite")
docker run -it -p 10800:10800 dmitrievanthony/ignite-with-mnist
之后,您将能够按照以下方式使用它:tf.gfile
与其交互。此类容器在 Docker Hub 上可用:dmitrievanthony/ignite-with-igfs。您可以在您的机器上运行此容器docker run -it -p 10500:10500 dmitrievanthony/ignite-with-igfs
之后,您将能够按照以下方式使用它import tensorflow as tf
import tensorflow.contrib.ignite.python.ops.igfs_ops
with 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!
2019 年 2 月 22 日 — 由 Anton Dmitriev(GridGain Systems 软件工程师)撰写的客座文章。
任何深度学习都始于数据。这是关键。没有数据,我们无法训练模型,也无法评估模型质量,更无法进行预测。因此,数据源非常重要。在进行研究、发明新的神经网络架构和进行实验时,我们习惯使用最简单的本地数据源……