summaryrefslogtreecommitdiff
path: root/megapixels/commands/faiss/build_faiss.py
diff options
context:
space:
mode:
authorJules Laplace <julescarbon@gmail.com>2018-12-14 16:39:47 +0100
committerJules Laplace <julescarbon@gmail.com>2018-12-14 16:39:47 +0100
commitb39b1d51db2d485e9c60fb4d3f5445474cef8700 (patch)
treef2ad4d6c3a5b84b8eeb8689526951f2c204a3f65 /megapixels/commands/faiss/build_faiss.py
parente1fba831b7c22f9840c5e92227f688079b9a206e (diff)
mysql import functions
Diffstat (limited to 'megapixels/commands/faiss/build_faiss.py')
-rw-r--r--megapixels/commands/faiss/build_faiss.py58
1 files changed, 58 insertions, 0 deletions
diff --git a/megapixels/commands/faiss/build_faiss.py b/megapixels/commands/faiss/build_faiss.py
new file mode 100644
index 00000000..96d3f99e
--- /dev/null
+++ b/megapixels/commands/faiss/build_faiss.py
@@ -0,0 +1,58 @@
+"""
+Index all of the FAISS datasets
+"""
+
+import os
+import glob
+import click
+import faiss
+import time
+import numpy as np
+
+from app.utils.file_utils import load_recipe, load_csv_safe
+from app.settings import app_cfg as cfg
+
+engine = create_engine('sqlite:///:memory:')
+
+class DefaultRecipe:
+ def __init__(self):
+ self.dim = 128
+ self.factory_type = 'Flat'
+
+@click.command()
+@click.pass_context
+def cli(ctx):
+ """build the FAISS index.
+ - looks for all datasets in faiss/metadata/
+ - uses the recipe above by default
+ - however you can override this by adding a new recipe in faiss/recipes/{name}.json
+ """
+ datasets = []
+ for fn in glob.iglob(os.path.join(cfg.DIR_FAISS_METADATA, "*")):
+ name = os.path.basename(fn)
+ recipe_fn = os.path.join(cfg.DIR_FAISS_RECIPES, name + ".json")
+ if os.path.exists(recipe_fn):
+ build_faiss(name, load_recipe(recipe_fn))
+ else:
+ build_faiss(name, DefaultRecipe())
+
+def build_faiss(name, recipe):
+ vec_fn = os.path.join(cfg.DIR_FAISS_METADATA, name, "vecs.csv")
+ index_fn = os.path.join(cfg.DIR_FAISS_INDEXES, name + ".index")
+
+ index = faiss.index_factory(recipe.dim, recipe.factory_type)
+
+ keys, rows = load_csv_safe(vec_fn)
+ feats = np.array([ list(map(float, row[3].split(","))) for row in rows ]).astype('float32')
+ n, d = feats.shape
+
+ print("{}: training {} x {} dim vectors".format(name, n, d))
+ print(recipe.factory_type)
+
+ add_start = time.time()
+ index.add(feats)
+ add_end = time.time()
+ add_time = add_end - add_start
+ print("{}: add time: {:.1f}s".format(name, add_time))
+
+ faiss.write_index(index, index_fn)