9

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 枚ごとにトランザクションを作成していますが、これはパフォーマンスにあまり影響を与えないようです。

4

4 に答える 4

6

私の経験では、Ubuntu の ext4 ハードディスクに Caffe データを書き込むPython から LMDB への 50 ~ 100 ミリ秒の書き込みがありました。そのため、私は tmpfs ( Linux に組み込まれたRAM ディスク機能) を使用し、これらの書き込みを約0.07 ミリ秒で完了します。RAM ディスク上に小さなデータベースを作成し、それらをハードディスクにコピーして、後でそれらすべてをトレーニングすることができます。私は 64 GB の RAM を持っているので、約 20 ~ 40 GB のものを作成しています。

LMDB を動的に作成、入力、およびストレージに移動するのに役立ついくつかのコード。ケースに合わせて自由に編集してください。Python で LMDB とファイル操作がどのように機能するかを理解する時間を節約できます。

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())
于 2016-05-10T21:21:23.713 に答える
3

これを試して:

DB_KEY_FORMAT = "{:0>10d}"
db = lmdb.open(path, map_size=int(1e12))
    curr_idx = 0
    commit_size = 1000
    with in_db_data.begin(write=True) as in_txn:
        for curr_commit_idx in range(0, num_data, commit_size):
            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()

コード

with in_db_data.begin(write=True) as in_txn:

時間がかかります。

于 2015-09-15T01:56:16.323 に答える