在将输入图像输入网络之前,Caffe从磁盘读取输入图像并对其进行转换(裁剪,镜像......)。似乎批量处理时间的大部分花费在这个数据准备上,我试图弄清楚哪个数据准备步骤需要更长的时间。
对于输入图像,我使用脚本(example / imagenet / create_imagenet.sh)从ilsvrc12生成lmdb文件,生成的文件大小约为每个图像200kb。
在数据层中,加载批处理时,Caffe会报告预取时间,包括读取时间和转换时间。 (src / caffe / layers / data_layer.cpp中的load_batch())
当我运行批量大小为256的bvlc_alexnet时,Caffe会报告如下:
I0331 10:09:47.987857 10968 data_layer.cpp:137] Prefetch batch: 427 ms.
I0331 10:09:47.987918 10968 data_layer.cpp:138] Read time: 116.003 ms.
I0331 10:09:47.987934 10968 data_layer.cpp:139] Transform time: 308.26ms.
1)从这个结果,数据传输速率可以计算如下:200kb * 256 / 116.003ms = 441mb / s。但是,由于我使用的是HDD而不是SSD,这超出了HDD带宽的限制(预期带宽约为150mb / s)。我还刷新了内存缓存,以确保从磁盘加载所有数据。
"阅读时间"是否正确?在报告中指出从HDD到内存的加载时间?我怀疑"阅读时间"和"转换时间"是实际的读取/转换时间,因为磁盘中的数据可能会被加载到主存储器按需所以"读取时间"变短了"变换时间"变得比实际花费的时间长。如何衡量实际数据负载和转换时间?
2)测量实际数据加载时间的一种方法是通过预先转换输入数据来消除转换开销。但我找不到这样做的方法。有没有办法预处理转换并加载已转换的数据而不是原始数据?