AkimfromParis's picture
Delete sidebar for easy read
427f576 verified
import os, sys
import streamlit as st
st.set_page_config(page_title="Pricing for scalar and binary embeddings", page_icon=":floppy-disk:", layout="wide", menu_items={'Report a bug': "mailto:moakim@protonmail.com"})
kb2gb = 1024**3 #Conversion memory
# MAIN
st.title("***Pricing model with scalar and binary embeddings***")
st.write("***Akim Mousterou*** (April 2024) *[LinkedIn](https://www.linkedin.com/in/akim-mousterou/), [HuggingFace](https://huggingface.co/Akimfromparis), and [GitHub](https://github.com/AkimParis)*")
st.write("*The real democratization of AI can only be achieved by a powerful open-source ecosystem and low prices for memory/GPU usage. Thanks to quantization, we can say bye to float32, and hello binary! Compression-friendly embedding models implemented in int8 and binary can save up to x4 and x32 of memory, storage, and, costs. To achieve X32 compute efficiency and retain ∼96% of retrieval performance, the binary quantization is powered by the normalization of embedding values (either 0 or 1), the calculation of Hamming Distance with only 2 CPU runtimes, and the application of ReRank step of [Yamada et al (2021)](https://arxiv.org/abs/2106.00882). Scalar and binary embeddings revealed great retrieval efficiency with just a minimal degradation of performance, perfect for NLP downstream tasks, semantic search, recommendation systems, and retrieval-augmented generation solutions.*")
st.divider() ###
col1, col2 = st.columns([1,1])
with col1:
cloud_price = st.slider("Price of the instance: *From 0 to 20 (default $3.8 per GB/mo estimated on x2gd instances on AWS)* ", 0.0,20.00,3.8)
with col2:
docs = st.slider("Number of vector embeddings: *From 100M to 1 Billion (default 250M)*", 100000000,1000000000,250000000, step=10000000) #Defaul 250M
st.divider() ###
col3, col4, col5, col6, col7, col8, col9, col10 = st.columns([1,1,1,1,1,1,1,1])
with col3:
st.write("***Embedding dimension***")
with col4:
st.write("***Memory usage in Gb***")
with col5:
st.write("***Price on a monthly basis***")
with col6:
st.write("***Price on a yearly basis***")
with col7:
st.write("***Int8 memory*** (div. by 4)")
with col8:
st.write("***Int8 price*** (div. by 4)")
with col9:
st.write("***Binary memory*** (div. by 32)")
with col10:
st.write("***Binary price*** (div. by 32)")
col11, col12, col13, col14, col15, col16, col17, col18 = st.columns([1,1,1,1,1,1,1,1])
with col11:
st.write("***384***")
st.write("***512***")
st.write("***768***")
st.write("***1024***")
st.write("***1536***")
st.write("***2048***")
st.write("***3072***")
st.write("***4096***")
with col12:
dim_1 = ((384 * 4) * docs) / kb2gb
st.write(str(round(dim_1, 2)) + " GB")
dim_2 = ((512 * 4) * docs) / kb2gb
r = st.write(str(round(dim_2, 2)) + " GB")
dim_3 = ((768 * 4) * docs) / kb2gb
r = st.write(str(round(dim_3, 2)) + " GB")
dim_4 = ((1024 * 4) * docs) / kb2gb
r = st.write(str(round(dim_4, 2)) + " GB")
dim_5 = ((1536 * 4) * docs) / kb2gb
r = st.write(str(round(dim_5, 2)) + " GB")
dim_6 = ((2048 * 4) * docs) / kb2gb
r = st.write(str(round(dim_6, 2)) + " GB")
dim_7 = ((3072 * 4) * docs) / kb2gb
r = st.write(str(round(dim_7, 2)) + " GB")
dim_8 = ((4096 * 4) * docs) / kb2gb
r = st.write(str(round(dim_8, 2)) + " GB")
with col13:
price_month_1 = dim_1 * cloud_price
st.write(str(round(price_month_1, 2)) + " $")
price_month_2 = dim_2 * cloud_price
st.write(str(round(price_month_2, 2)) + " $")
price_month_3 = dim_3 * cloud_price
st.write(str(round(price_month_3, 2)) + " $")
price_month_4 = dim_4 * cloud_price
st.write(str(round(price_month_4, 2)) + " $")
price_month_5 = dim_5 * cloud_price
st.write(str(round(price_month_5, 2)) + " $")
price_month_6 = dim_6 * cloud_price
st.write(str(round(price_month_6, 2)) + " $")
price_month_7 = dim_7 * cloud_price
st.write(str(round(price_month_7, 2)) + " $")
price_month_8 = dim_8 * cloud_price
st.write(str(round(price_month_8, 2)) + " $")
with col14:
price_year_1 = price_month_1 * 12
st.write(str(round(price_year_1, 2)) + " $")
price_year_2 = price_month_2 * 12
st.write(str(round(price_year_2, 2)) + " $")
price_year_3 = price_month_3 * 12
st.write(str(round(price_year_3, 2)) + " $")
price_year_4 = price_month_4 * 12
st.write(str(round(price_year_4, 2)) + " $")
price_year_5 = price_month_5 * 12
st.write(str(round(price_year_5, 2)) + " $")
price_year_6 = price_month_6 * 12
st.write(str(round(price_year_6, 2)) + " $")
price_year_7 = price_month_7 * 12
st.write(str(round(price_year_7, 2)) + " $")
price_year_8 = price_month_8 * 12
st.write(str(round(price_year_8, 2)) + " $")
with col15:
int8_mem_1 = dim_1 / 4
st.write(str(round(int8_mem_1, 2)) + " GB")
int8_mem_2 = dim_2 / 4
st.write(str(round(int8_mem_2, 2)) + " GB")
int8_mem_3 = dim_3 / 4
st.write(str(round(int8_mem_3, 2)) + " GB")
int8_mem_4 = dim_4 / 4
st.write(str(round(int8_mem_4, 2)) + " GB")
int8_mem_5 = dim_5 / 4
st.write(str(round(int8_mem_5, 2)) + " GB")
int8_mem_6 = dim_6 / 4
st.write(str(round(int8_mem_6, 2)) + " GB")
int8_mem_7 = dim_7 / 4
st.write(str(round(int8_mem_7, 2)) + " GB")
int8_mem_8 = dim_8 / 4
st.write(str(round(int8_mem_8, 2)) + " GB")
with col16:
int8_price_1 = price_month_1 / 4
st.write(str(round(int8_price_1, 2)) + " $")
int8_price_2 = price_month_2 / 4
st.write(str(round(int8_price_2, 2)) + " $")
int8_price_3 = price_month_3 / 4
st.write(str(round(int8_price_3, 2)) + " $")
int8_price_4 = price_month_4 / 4
st.write(str(round(int8_price_4, 2)) + " $")
int8_price_5 = price_month_5 / 4
st.write(str(round(int8_price_5, 2)) + " $")
int8_price_6 = price_month_6 / 4
st.write(str(round(int8_price_6, 2)) + " $")
int8_price_7 = price_month_7 / 4
st.write(str(round(int8_price_7, 2)) + " $")
int8_price_8 = price_month_8 / 4
st.write(str(round(int8_price_8, 2)) + " $")
with col17:
binary_mem_1 = dim_1 / 32
st.write(str(round(binary_mem_1, 2)) + " GB")
binary_mem_2 = dim_2 / 32
st.write(str(round(binary_mem_2, 2)) + " GB")
binary_mem_3 = dim_3 / 32
st.write(str(round(binary_mem_3, 2)) + " GB")
binary_mem_4 = dim_4 / 32
st.write(str(round(binary_mem_4, 2)) + " GB")
binary_mem_5 = dim_5 / 32
st.write(str(round(binary_mem_5, 2)) + " GB")
binary_mem_6 = dim_6 / 32
st.write(str(round(binary_mem_6, 2)) + " GB")
binary_mem_7 = dim_7 / 32
st.write(str(round(binary_mem_7, 2)) + " GB")
binary_mem_8 = dim_8 / 32
st.write(str(round(binary_mem_8, 2)) + " GB")
with col18:
binary_price_1 = price_month_1 / 32
st.write(str(round(binary_price_1, 2)) + " $")
binary_price_2 = price_month_2 / 32
st.write(str(round(binary_price_2, 2)) + " $")
binary_price_3 = price_month_3 / 32
st.write(str(round(binary_price_3, 2)) + " $")
binary_price_4 = price_month_4 / 32
st.write(str(round(binary_price_4, 2)) + " $")
binary_price_5 = price_month_5 / 32
st.write(str(round(binary_price_5, 2)) + " $")
binary_price_6 = price_month_6 / 32
st.write(str(round(binary_price_6, 2)) + " $")
binary_price_7 = price_month_7 / 32
st.write(str(round(binary_price_7, 2)) + " $")
binary_price_8 = price_month_8 / 32
st.write(str(round(binary_price_8, 2)) + " $")
st.write('***Disclaimer:*** *The financial projections below are based on ["Cohere int8 & binary Embeddings - Scale Your Vector Database to Large Datasets"](https://cohere.com/blog/int8-binary-embeddings) by Nils Reimers of [Cohere](https://cohere.com/). The cost of the index and the metadata might not have been factored in the calculus.*')
st.divider() ###
st.write("***- Open-source vector databases for Scalar and binary quantization:***")
col19, col20 = st.columns([1,1])
with col19:
st.write("- [FAISS](https://github.com/facebookresearch/faiss) from :flag-us:")
st.write("- [VESPA AI](https://github.com/vespa-engine/vespa) from :flag-no:")
st.write("- [Pgvector](https://github.com/pgvector/pgvector) from :flag-us:")
st.write("- [Milvus](https://github.com/milvus-io/milvus) from :flag-cn:")
st.write("- [Usearch](https://github.com/unum-cloud/usearch) from :flag-us:")
with col20:
st.write("- [Qdrant](https://github.com/qdrant) from :flag-de:")
st.write("- [pgvecto.rs](https://github.com/tensorchord/pgvecto.rs) from :flag-cn:")
st.write("- [TencentVectorDB](https://github.com/Tencent/vectordatabase-sdk-python) from :flag-cn:")
st.write("- [BinaryVectorDB](https://github.com/cohere-ai/BinaryVectorDB) from :flag-ca:")
st.write("- [Weaviate](https://github.com/weaviate/weaviate) from :flag-de:")
st.divider() ###
st.write("***- For further readings:***")
st.write("- [Billion-scale similarity search with GPUs](https://arxiv.org/abs/1702.08734)")
st.write("- [Efficient Passage Retrieval with Hashing for Open-domain Question Answering](https://arxiv.org/abs/2106.00882)")
st.write("- [Matryoshka Representation Learning](https://arxiv.org/abs/2205.13147)")
st.write("- [Incorporating Relevance Feedback for Information-Seeking Retrieval using Few-Shot Document Re-Ranking](https://arxiv.org/abs/2210.10695)")
st.write("- [Binary Embedding-based Retrieval at Tencent](https://arxiv.org/abs/2302.08714)")
st.divider() ###
st.write("***Akim Mousterou*** (April 2024) *[LinkedIn](https://www.linkedin.com/in/akim-mousterou/), [HuggingFace](https://huggingface.co/Akimfromparis), and [GitHub](https://github.com/AkimParis)*")