回答问题

使用Caffe 创建用于训练的数据集我都尝试使用 HDF5 和 LMDB。但是,创建 LMDB 非常慢,甚至比 HDF5 还要慢。我正在尝试编写约 20,000 张图像。

我做错了什么吗?有什么我不知道的吗?

这是我创建 LMDB 的代码:

DB_KEY_FORMAT = "{:0>10d}"
db = lmdb.open(path, map_size=int(1e12))
    curr_idx = 0
    commit_size = 1000
    for curr_commit_idx in range(0, num_data, commit_size):
        with in_db_data.begin(write=True) as in_txn:
            for i in range(curr_commit_idx, min(curr_commit_idx + commit_size, num_data)):
                d, l = data[i], labels[i]
                im_dat = caffe.io.array_to_datum(d.astype(float), label=int(l))
                key = DB_KEY_FORMAT.format(curr_idx)
                in_txn.put(key, im_dat.SerializeToString())
                curr_idx += 1
    db.close()

如您所见,我为每 1,000 张图像创建一个事务,因为我认为为每个图像创建一个事务会产生开销,但这似乎不会对性能产生太大影响。

Answers

根据我的经验,我已经在 Ubuntu 的 ext4 硬盘上写入了 50-100 ms 从 Python 写入 LMDB ** 的 Caffe 数据。 这就是我使用 tmpfs(Linux 中内置的RAM 磁盘** 功能)并在大约 0.07 毫秒 内完成这些写入的原因。您可以在 ramdisk 上创建较小的数据库并将它们复制到硬盘上,然后在所有这些上进行训练。我正在制作大约 20-40GB 的内存,因为我有 64 GB 的 RAM。

一些代码可以帮助你们动态创建、填充和移动 LMDB 到存储。随意编辑它以适合您的情况。它应该可以节省您一些时间来了解 LMDB 和文件操作在 Python 中的工作原理。

import shutil
import lmdb
import random


def move_db():
    global image_db
    image_db.close();
    rnd = ''.join(random.choice(string.ascii_uppercase + string.digits) for _ in range(5))
    shutil.move( fold + 'ram/train_images',  '/storage/lmdb/'+rnd)
    open_db()


def open_db():
    global image_db
    image_db    = lmdb.open(os.path.join(fold, 'ram/train_images'),
            map_async=True,
            max_dbs=0)

def write_to_lmdb(db, key, value):
    """
    Write (key,value) to db
    """
    success = False
    while not success:
        txn = db.begin(write=True)
        try:
            txn.put(key, value)
            txn.commit()
            success = True
        except lmdb.MapFullError:
            txn.abort()
            # double the map_size
            curr_limit = db.info()['map_size']
            new_limit = curr_limit*2
            print '>>> Doubling LMDB map size to %sMB ...' % (new_limit>>20,)
            db.set_mapsize(new_limit) # double it

...

image_datum                 = caffe.io.array_to_datum( transformed_image, label )
write_to_lmdb(image_db, str(itr), image_datum.SerializeToString())
Logo

学AI,认准AI Studio!GPU算力,限时免费领,邀请好友解锁更多惊喜福利 >>>

更多推荐