Skip to content
Open
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension


Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
1 change: 1 addition & 0 deletions .github/workflows/benchmarks.yml
Original file line number Diff line number Diff line change
Expand Up @@ -29,6 +29,7 @@ jobs:
matrix:
dataset: [random-xs-20-angular]
library:
- alayalite
- annoy
- balltree
- bruteforce
Expand Down
1 change: 1 addition & 0 deletions README.md
Original file line number Diff line number Diff line change
Expand Up @@ -52,6 +52,7 @@ Evaluated
* [kgn](https://github.com/Henry-yan/kgn)
* [vsag](https://github.com/antgroup/vsag)
* [PGVectorScale](https://github.com/timescale/pgvectorscale/tree/main)
* [AlayaLite](https://github.com/AlayaDB-AI/AlayaLite.git) ![https://img.shields.io/github/stars/AlayaDB-AI/AlayaLite?style=social](https://img.shields.io/github/stars/AlayaDB-AI/AlayaLite?style=social)

Data sets
=========
Expand Down
6 changes: 6 additions & 0 deletions ann_benchmarks/algorithms/alayalite/Dockerfile
Original file line number Diff line number Diff line change
@@ -0,0 +1,6 @@
FROM ann-benchmarks

RUN apt-get update && apt-get install -y wget
RUN wget https://github.com/AlayaDB-AI/AlayaLite/releases/download/v0.1.0a2/alayalite-0.1.0a2-cp310-cp310-linux_x86_64.whl -O /home/app/alayalite-0.1.0a2-cp310-cp310-linux_x86_64.whl
RUN python3 -m pip install /home/app/alayalite-0.1.0a2-cp310-cp310-linux_x86_64.whl
RUN python3 -c 'import alayalite'
20 changes: 20 additions & 0 deletions ann_benchmarks/algorithms/alayalite/config.yml
Original file line number Diff line number Diff line change
@@ -0,0 +1,20 @@
float:
any:
- base_args: ['@metric', '@dimension']
constructor: AlayaLite
disabled: false
docker_tag: ann-benchmarks-alayalite
module: ann_benchmarks.algorithms.alayalite
name: AlayaLite
run_groups:
alayalite:
#### index_type HNSW FLAT
args:
M: 32
R: [32]
L: 200
index_type: NONE
quantization_type: RABITQ
fit_threads: 1 # only batch search
search_threads: 1 # only batch search
query_args: [[10, 20, 40, 60, 80, 120, 200, 400, 600, 800]]
62 changes: 62 additions & 0 deletions ann_benchmarks/algorithms/alayalite/module.py
Original file line number Diff line number Diff line change
@@ -0,0 +1,62 @@
import os
from dataclasses import dataclass, field
import numpy as np
from alayalite import Client
from alayalite import Index
from ..base.module import BaseANN


class AlayaLite(BaseANN):
def __init__(self, metric, dim, method_param):
self.index_save_dir = 'alaya_indices'
self.client = Client(self.index_save_dir)
self.index = None
self.ef = None
self.dim = dim
self.metric = metric

self.index_type = method_param['index_type']
self.quantization_type = method_param['quantization_type']
self.fit_threads = method_param['fit_threads']
self.search_threads = method_param['search_threads']
self.R = method_param['R']
self.L = method_param['L']
self.M = method_param['M']

self.save_index_name = f'alayalite_index_it_{self.index_type}_qt_{self.quantization_type}_dim_{self.dim}_metric_{self.metric}_M{self.M}.idx'
print("alaya init done")

def fit(self, X: np.array) -> None:

if os.path.exists(os.path.join(self.index_save_dir, self.save_index_name)):
self.index = Index.load(self.index_save_dir, self.save_index_name)
print('load index from cache')
else:
X = X.astype(np.float32)
self.index = self.client.create_index(name=self.save_index_name, metric=self.metric, quantization_type=self.quantization_type, capacity=X.shape[0])
self.index.fit(vectors=X, num_threads=self.fit_threads)
self.client.save_index(self.save_index_name)
print('save index to cache')

def set_query_arguments(self, ef):
self.ef = int(ef)

def prepare_query(self, q: np.array, n: int):
self.q = q
self.n = n

def run_prepared_query(self):
self.res = self.index.search(query=self.q, topk=self.n, ef_search=self.ef)

def batch_query(self, X: np.array, n: int) -> None:
self.res = self.index.batch_search(queries=X, topk=n, ef_search=self.ef)

def get_prepared_query_results(self):
return self.res

def get_batch_results(self) -> np.array:
return self.res

def __str__(self) -> str:
return "AlayaLite"