ImageDataLayer 和 LMDB 数据层之间的速度
The speed between ImageDataLayer and LMDB data layer
Caffe 支持 LMDB 数据层和 ImageDataLayer。
从一些数据集创建 LMDB 数据库需要一些时间和大量 space。
相比之下,ImageDataLayer只使用一个txt文件,非常方便。
我的问题是,这两种层之间的速度差异大吗?
非常感谢!
是的,速度差距确实很大。 LMDB 针对高速批处理进行了优化。
LMDB 旨在更快地从给定的 key value
中获取数据。此外,数据以未压缩格式存储,这使得机器很容易只读取数据并将它们直接传递给 GPU 进行处理。
在ImageDataLayer中,我们要从文本文件中读取图像细节,并使用OpenCV将图像读入内存。图像的这种解压缩在计算上是昂贵的。
但最好的性能可能并不总是针对 LMDB 层,它在很大程度上取决于机器的配置。考虑 256 个图像批量大小和大小为 227x227x3 的图像的示例。还要考虑你使用的是非常好的 GPU 和高端 i8 处理器机器。这里LMDB格式的单张图片可能会占用151KB。整批可能占用 37MB。如果 GPU 能够每秒执行 10 个批次,则硬盘的读取速度应为 370MB/s。如果您使用的是普通的SATA或外置硬盘,由于硬盘的限制,读取如此大块的数据会出现瓶颈。
如果 caffe 无法以所需的速度获取数据,瓶颈会进一步减慢整个训练过程。同时,如果您正在读取 256 张图像并使用多核版本的 OpenCV,则数据预取可能比读取 LMDB 更有效。
如果您将LMDB数据存储在SSD上,则不会出现上述情况!
Caffe 支持 LMDB 数据层和 ImageDataLayer。 从一些数据集创建 LMDB 数据库需要一些时间和大量 space。 相比之下,ImageDataLayer只使用一个txt文件,非常方便。 我的问题是,这两种层之间的速度差异大吗? 非常感谢!
是的,速度差距确实很大。 LMDB 针对高速批处理进行了优化。
LMDB 旨在更快地从给定的 key value
中获取数据。此外,数据以未压缩格式存储,这使得机器很容易只读取数据并将它们直接传递给 GPU 进行处理。
在ImageDataLayer中,我们要从文本文件中读取图像细节,并使用OpenCV将图像读入内存。图像的这种解压缩在计算上是昂贵的。
但最好的性能可能并不总是针对 LMDB 层,它在很大程度上取决于机器的配置。考虑 256 个图像批量大小和大小为 227x227x3 的图像的示例。还要考虑你使用的是非常好的 GPU 和高端 i8 处理器机器。这里LMDB格式的单张图片可能会占用151KB。整批可能占用 37MB。如果 GPU 能够每秒执行 10 个批次,则硬盘的读取速度应为 370MB/s。如果您使用的是普通的SATA或外置硬盘,由于硬盘的限制,读取如此大块的数据会出现瓶颈。
如果 caffe 无法以所需的速度获取数据,瓶颈会进一步减慢整个训练过程。同时,如果您正在读取 256 张图像并使用多核版本的 OpenCV,则数据预取可能比读取 LMDB 更有效。
如果您将LMDB数据存储在SSD上,则不会出现上述情况!