提高 I/O 操作的速度?用于 caffe 的 HDF5 数据创建

Improve speed of I/O operations ? For HDF5 data creation for caffe

我的程序的基本objective是读取图像并制作一个hd5格式的文件。 为了便于管理,我将 hd5 数据文件分成 1000 个部分。

程序读取图像并调整图像大小,然后写入文件。

我不认为使用多线程会提高速度,但我可能错了。

我的数据集大约有 1500 万张图片。

我使用一台配备 4GB GPU 和 32GB 内存和 Intel(R) Xeon(R) 的强大电脑 CPU E5-2687W v3 @ 3.10GHz

P.S我可以尝试使用其他图像转换包,如opencv,但没有比较依据。

截至目前,该计划已 运行 3 天不间断地进行,几乎完成了 80%。 我希望以后做类似的事情时避免这个问题。

ipfldr= "/path/to/img/fldr"
os.chdir(ipfldr)
SIZE = 58 # fixed size to all images
nof = 16

with open( '/path/to/txtfile', 'r' ) as T :
    lines = T.readlines()


# If you do not have enough memory split data into
# multiple batches and generate multiple separate h5 files
print len(lines)
X = np.zeros( (1000,nof*3, SIZE, SIZE), dtype=np.int )
y = np.zeros( (1000,1), dtype=np.int )
for i,l in enumerate(lines):
    sp = l.split(' ')#split files into 17 cats
    cla= int(sp[0].split("/")[0])
    for fr in range(0,nof,1):
        img = caffe.io.load_image( sp[fr] )
        img = caffe.io.resize( img, (3,SIZE, SIZE) ) # resize to fixed size
        # you may apply other input transformations here...
        X[i%1000,fr:fr+3] = img
    y[i%1000] = cla
    if i%1000==0 
        with h5py.File('val/'+'val'+str(int(i/1000))+'.h5','w') as H:
            H.create_dataset( 'data', data=X ) # note the name X given to the dataset!
            H.create_dataset( 'label', data=y ) # note the name y given to the dataset! 
        with open('val_h5_list.txt','w') as L:
            L.write( 'val'+str(int(i/1000))+'.h5' ) # list all h5 files you are going to use
        if (len(lines)-i >= 1000):
            X = np.zeros( (1000,nof*3, SIZE, SIZE), dtype=np.int )
            y = np.zeros( (1000,1), dtype=np.int )
        else:
            break

我很确定您可以通过多线程方法提高性能,您没有花 3 天时间从磁盘加载数据(您需要不切实际的磁盘数量 space 来读取来自), 所以你似乎在等待 CPU.

的调整大小过程

您可以执行以下操作:1 Reader 读取大型卡盘中的数据并将单个图像放入队列中。一些工人从队列中获取图像,调整其大小并将其放入另一个队列。 1 Writer 从第二个队列中取出调整大小的图像,并在收集到很多图像时将它们写入磁盘(Reader 和 Writer 可能是相同的进程而不会降低效率,假设您无论如何都读/写到同一个磁盘) .

我的猜测是每个 HW 线程 1 个工作线程(在你的情况下是 16 个),你放置 reader 和 writer 的核心减去 2 个(所以 14),应该是一个很好的起点。

通过这种方式,您可以将 IO 访问等待与 CPU 工作隔离开来,并通过在每次初始化读/写时执行大量工作来最大限度地减少 IO 访问开销。