From de699f6300941784c7a362963df6f65cd702ff3e Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Thu, 7 Sep 2023 10:45:39 -0700 Subject: [PATCH 1/5] Added new blog post --- .../announcing-hnsw-support-in-our-sdk.md | 100 ++++++++++++++++++ ...rating-query-embeddings-in-the-database.md | 2 +- pgml-dashboard/src/api/docs.rs | 2 + pgml-dashboard/templates/layout/nav/top.html | 2 +- 4 files changed, 104 insertions(+), 2 deletions(-) create mode 100644 pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md diff --git a/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md b/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md new file mode 100644 index 000000000..f74e2d99b --- /dev/null +++ b/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md @@ -0,0 +1,100 @@ +--- +author: Silas Marvin +description: HNSW indexing is the latest upgrade in vector recall performance. In this post we announce our updated SDK that utilizes HNSW indexing to give world class performance in vector search. +image: https://postgresml.org/dashboard/static/images/blog/elephant_sky.jpg +image_alt: PostgresML is a composition engine that provides advanced AI capabilities. +--- + +# Announcing HNSW Support in Our SDK + +
+ Author +
+

Silas Marvin

+

September 6, 2023

+
+
+ +PostgresML makes it easy to use machine learning with your database and to scale workloads horizontally in our cloud. Our SDK makes it even easier. + +## Introducing HNSW + +Underneath the hood our SDK utilizes [pgvector](https://github.com/pgvector/pgvector) to store, index, and recall vectors. Up until this point our SDk used IVFFlat indexing to divide vectors into lists, search a subset of those lists, and return the closest vector matches. + +While this is fast, it is not as fast as HNSW. Thanks to the latest update of [pgvector](https://github.com/pgvector/pgvector) our SDK now utilizes HNSW indexing, creating multi-layer graphs instead of lists and removing the required training step IVFFlat imposed. + +The results are not disappointing. + +## Comparing HNSW and IVFFlat + +In one of our previous posts: [Tuning vector recall while generating query embeddings in the database](/blog/tuning-vector-recall-while-generating-query-embeddings-in-the-database) we were working on a datasets with over 5 million Amazon Movie Reviews, and after embedding the reviews, performed semantic similarity search to get the closest 5 reviews. + +Here is the sql query we ran: + +!!! generic + +!!! code_block time="152.037 ms" + +```postgresql +WITH request AS ( + SELECT pgml.embed( + 'intfloat/e5-large', + 'query: Best 1980''s scifi movie' + )::vector(1024) AS embedding +) + +SELECT + review_body, + product_title, + star_rating, + total_votes, + 1 - ( + review_embedding_e5_large <=> ( + SELECT embedding FROM request + ) + ) AS cosine_similarity +FROM pgml.amazon_us_reviews +ORDER BY review_embedding_e5_large <=> (SELECT embedding FROM request) +LIMIT 5; +``` + +!!! + +!!! results + +| review_body | product_title | star_rating | total_votes | cosine_similarity | +| --------------------------------------------------- | ------------------------------------------------------------- | ----------- | ----------- | ------------------ | +| best 80s SciFi movie ever | The Adventures of Buckaroo Banzai Across the Eighth Dimension | 5 | 1 | 0.956207707312679 | +| One of the best 80's sci-fi movies, beyond a doubt! | Close Encounters of the Third Kind [Blu-ray] | 5 | 1 | 0.9298004258989776 | +| One of the Better 80's Sci-Fi, | Krull (Special Edition) | 3 | 5 | 0.9126601222760491 | +| the best of 80s sci fi horror! | The Blob | 5 | 2 | 0.9095577631102708 | +| Three of the best sci-fi movies of the seventies | Sci-Fi: Triple Feature (BD) [Blu-ray] | 5 | 0 | 0.9024044582495285 | + +!!! + +!!! + +This query utilized IVFFlat indexing and queried through over 5 million rows in 152 milliseconds. Pretty fast! + +Let drop our IVFFlat index and create an HNSW index. + +!!! generic + +!!! code_block time="53236.884 ms (00:53.237)" + +```postgresql +DROP INDEX index_amazon_us_reviews_on_review_embedding_e5_large; +CREATE INDEX CONCURRENTLY ON pgml.amazon_us_reviews USING hnsw (review_embedding_e5_large vector_cosine_ops); +``` + +!!! + +!!! results + +|CREATE INDEX| +|------------| + +!!! + +!!! + diff --git a/pgml-dashboard/content/blog/tuning-vector-recall-while-generating-query-embeddings-in-the-database.md b/pgml-dashboard/content/blog/tuning-vector-recall-while-generating-query-embeddings-in-the-database.md index f70054f8f..be46ec4bd 100644 --- a/pgml-dashboard/content/blog/tuning-vector-recall-while-generating-query-embeddings-in-the-database.md +++ b/pgml-dashboard/content/blog/tuning-vector-recall-while-generating-query-embeddings-in-the-database.md @@ -144,7 +144,7 @@ SELECT ) ) AS cosine_similarity FROM pgml.amazon_us_reviews -ORDER BY cosine_similarity +ORDER BY review_embedding_e5_large <=> (SELECT embedding FROM request) LIMIT 5; ``` diff --git a/pgml-dashboard/src/api/docs.rs b/pgml-dashboard/src/api/docs.rs index 6245a0d2f..e256adce4 100644 --- a/pgml-dashboard/src/api/docs.rs +++ b/pgml-dashboard/src/api/docs.rs @@ -80,6 +80,8 @@ async fn blog_handler<'a>(path: PathBuf, cluster: &Cluster) -> Result --> <% } %> From 3a303361649acc3f5d8db8faf6c4be84d25e8e48 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Thu, 21 Sep 2023 11:31:23 -0700 Subject: [PATCH 2/5] Cleaned up post --- .../announcing-hnsw-support-in-our-sdk.md | 84 ++++++++++++++----- 1 file changed, 63 insertions(+), 21 deletions(-) diff --git a/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md b/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md index f74e2d99b..f15c078ba 100644 --- a/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md +++ b/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md @@ -1,8 +1,6 @@ --- author: Silas Marvin description: HNSW indexing is the latest upgrade in vector recall performance. In this post we announce our updated SDK that utilizes HNSW indexing to give world class performance in vector search. -image: https://postgresml.org/dashboard/static/images/blog/elephant_sky.jpg -image_alt: PostgresML is a composition engine that provides advanced AI capabilities. --- # Announcing HNSW Support in Our SDK @@ -11,7 +9,7 @@ image_alt: PostgresML is a composition engine that provides advanced AI capabili Author

Silas Marvin

-

September 6, 2023

+

September 21, 2023

@@ -21,19 +19,19 @@ PostgresML makes it easy to use machine learning with your database and to scale Underneath the hood our SDK utilizes [pgvector](https://github.com/pgvector/pgvector) to store, index, and recall vectors. Up until this point our SDk used IVFFlat indexing to divide vectors into lists, search a subset of those lists, and return the closest vector matches. -While this is fast, it is not as fast as HNSW. Thanks to the latest update of [pgvector](https://github.com/pgvector/pgvector) our SDK now utilizes HNSW indexing, creating multi-layer graphs instead of lists and removing the required training step IVFFlat imposed. +While the IVFFlat indexing method is fast, it is not as fast as HNSW. Thanks to the latest update of [pgvector](https://github.com/pgvector/pgvector) our SDK now utilizes HNSW indexing, creating multi-layer graphs instead of lists and removing the required training step IVFFlat imposed. The results are not disappointing. ## Comparing HNSW and IVFFlat -In one of our previous posts: [Tuning vector recall while generating query embeddings in the database](/blog/tuning-vector-recall-while-generating-query-embeddings-in-the-database) we were working on a datasets with over 5 million Amazon Movie Reviews, and after embedding the reviews, performed semantic similarity search to get the closest 5 reviews. +In one of our previous posts: [Tuning vector recall while generating query embeddings in the database](/blog/tuning-vector-recall-while-generating-query-embeddings-in-the-database) we were working on a dataset with over 5 million Amazon Movie Reviews, and after embedding the reviews, performed semantic similarity search to get the closest 5 reviews. -Here is the sql query we ran: +Let's run that query again: !!! generic -!!! code_block time="152.037 ms" +!!! code_block time="89.118 ms" ```postgresql WITH request AS ( @@ -44,10 +42,7 @@ WITH request AS ( ) SELECT - review_body, - product_title, - star_rating, - total_votes, + id, 1 - ( review_embedding_e5_large <=> ( SELECT embedding FROM request @@ -62,25 +57,25 @@ LIMIT 5; !!! results -| review_body | product_title | star_rating | total_votes | cosine_similarity | -| --------------------------------------------------- | ------------------------------------------------------------- | ----------- | ----------- | ------------------ | -| best 80s SciFi movie ever | The Adventures of Buckaroo Banzai Across the Eighth Dimension | 5 | 1 | 0.956207707312679 | -| One of the best 80's sci-fi movies, beyond a doubt! | Close Encounters of the Third Kind [Blu-ray] | 5 | 1 | 0.9298004258989776 | -| One of the Better 80's Sci-Fi, | Krull (Special Edition) | 3 | 5 | 0.9126601222760491 | -| the best of 80s sci fi horror! | The Blob | 5 | 2 | 0.9095577631102708 | -| Three of the best sci-fi movies of the seventies | Sci-Fi: Triple Feature (BD) [Blu-ray] | 5 | 0 | 0.9024044582495285 | +| review_body | product_title | star_rating | total_votes | cosine_similarity +| ------------------------------------------------- | ------------------------------------------------------------- | ------------- | ----------- | ------------------ | +| best 80s SciFi movie ever | The Adventures of Buckaroo Banzai Across the Eighth Dimension | 5 | 1 | 0.9495371273162286 | +| the best of 80s sci fi horror! | The Blob | 5 | 2 | 0.9097434758143605 | +| Three of the best sci-fi movies of the seventies | Sci-Fi: Triple Feature (BD) [Blu-ray] | 5 | 0 | 0.9008723412875651 | +| best sci fi movie ever | The Day the Earth Stood Still (Special Edition) [Blu-ray] | 5 | 2 | 0.8943620968858654 | +| Great Science Fiction movie | Bloodsport / Timecop (Action Double Feature) [Blu-ray] | 5 | 0 | 0.894282454374093 | !!! !!! -This query utilized IVFFlat indexing and queried through over 5 million rows in 152 milliseconds. Pretty fast! +This query utilized IVFFlat indexing and queried through over 5 million rows in 89.118ms. Pretty fast! -Let drop our IVFFlat index and create an HNSW index. +Let's drop our IVFFlat index and create an HNSW index. !!! generic -!!! code_block time="53236.884 ms (00:53.237)" +!!! code_block time="10255099.233 ms (02:50:55.099)" ```postgresql DROP INDEX index_amazon_us_reviews_on_review_embedding_e5_large; @@ -98,3 +93,50 @@ CREATE INDEX CONCURRENTLY ON pgml.amazon_us_reviews USING hnsw (review_embedding !!! +Now let's try the query again utilizing the new HNSW index we created. + +!!! generic + +!!! code_block time="17.465 ms" + +```postgresql +WITH request AS ( + SELECT pgml.embed( + 'intfloat/e5-large', + 'query: Best 1980''s scifi movie' + )::vector(1024) AS embedding +) + +SELECT + id, + 1 - ( + review_embedding_e5_large <=> ( + SELECT embedding FROM request + ) + ) AS cosine_similarity +FROM pgml.amazon_us_reviews +ORDER BY review_embedding_e5_large <=> (SELECT embedding FROM request) +LIMIT 5; +``` + +!!! + +!!! results + +| review_body | product_title | star_rating | total_votes | cosine_similarity +| --------------------------------- | ------------------------------------------------------------- | ------------- | ----------- | ------------------ | +| best 80s SciFi movie ever | The Adventures of Buckaroo Banzai Across the Eighth Dimension | 5 | 1 | 0.9495371273162286 | +| the best of 80s sci fi horror! | The Blob | 5 | 2 | 0.9097434758143605 | +| One of the Better 80's Sci-Fi | Krull (Special Edition) | 3 | 5 | 0.9093884940741694 | +| Good 1980s movie | Can't Buy Me Love | 4 | 0 | 0.9090294438721961 | +| great 80's movie | How I Got Into College | 5 | 0 | 0.9016508795301296 | + +!!! + +!!! + +Not only are the results better (the `cosine_similarity` is higher overall), but HNSW is over 3x faster, reducing our search and embedding time to 17.465ms. + +This is a massive upgrade to the recall speed utilized by our SDK and greatly improves overall performance. + +For a deeper dive into HNSW checkout [Jonathan Katz's excellent article on HNSW in pgvector](https://jkatz05.com/post/postgres/pgvector-hnsw-performance/). From d76b96f6b8ef995767a816282706fda7113ea63f Mon Sep 17 00:00:00 2001 From: Silas Marvin <19626586+SilasMarvin@users.noreply.github.com> Date: Thu, 21 Sep 2023 11:39:26 -0700 Subject: [PATCH 3/5] Update pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md Co-authored-by: Lev Kokotov --- .../content/blog/announcing-hnsw-support-in-our-sdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md b/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md index f15c078ba..963ff16cb 100644 --- a/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md +++ b/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md @@ -17,7 +17,7 @@ PostgresML makes it easy to use machine learning with your database and to scale ## Introducing HNSW -Underneath the hood our SDK utilizes [pgvector](https://github.com/pgvector/pgvector) to store, index, and recall vectors. Up until this point our SDk used IVFFlat indexing to divide vectors into lists, search a subset of those lists, and return the closest vector matches. +Underneath the hood our SDK utilizes [pgvector](https://github.com/pgvector/pgvector) to store, index, and recall vectors. Up until this point our SDK used IVFFlat indexing to divide vectors into lists, search a subset of those lists, and return the closest vector matches. While the IVFFlat indexing method is fast, it is not as fast as HNSW. Thanks to the latest update of [pgvector](https://github.com/pgvector/pgvector) our SDK now utilizes HNSW indexing, creating multi-layer graphs instead of lists and removing the required training step IVFFlat imposed. From 44c26c362fe132913274dbdab0299701ea7115e3 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Fri, 22 Sep 2023 11:50:45 -0700 Subject: [PATCH 4/5] Updated speed up text --- .../content/blog/announcing-hnsw-support-in-our-sdk.md | 2 +- 1 file changed, 1 insertion(+), 1 deletion(-) diff --git a/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md b/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md index 963ff16cb..417889d7c 100644 --- a/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md +++ b/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md @@ -135,7 +135,7 @@ LIMIT 5; !!! -Not only are the results better (the `cosine_similarity` is higher overall), but HNSW is over 3x faster, reducing our search and embedding time to 17.465ms. +Not only are the results better (the `cosine_similarity` is higher overall), but HNSW is over 5x faster, reducing our search and embedding time to 17.465ms. This is a massive upgrade to the recall speed utilized by our SDK and greatly improves overall performance. From 9aa8577fc93687fa734acc41e741882270955aa8 Mon Sep 17 00:00:00 2001 From: SilasMarvin <19626586+SilasMarvin@users.noreply.github.com> Date: Tue, 26 Sep 2023 10:04:44 -0700 Subject: [PATCH 5/5] Added new image and updated links --- .../blog/announcing-hnsw-support-in-our-sdk.md | 5 +++++ .../src/components/navbar/template.html | 2 +- .../src/components/navbar_web_app/template.html | 4 ++-- .../images/blog/announcing_hnsw_support.webp | Bin 0 -> 30682 bytes .../templates/layout/nav/top_web_app.html | 4 ++-- 5 files changed, 10 insertions(+), 5 deletions(-) create mode 100644 pgml-dashboard/static/images/blog/announcing_hnsw_support.webp diff --git a/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md b/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md index 417889d7c..fb64e1fb4 100644 --- a/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md +++ b/pgml-dashboard/content/blog/announcing-hnsw-support-in-our-sdk.md @@ -1,6 +1,8 @@ --- author: Silas Marvin description: HNSW indexing is the latest upgrade in vector recall performance. In this post we announce our updated SDK that utilizes HNSW indexing to give world class performance in vector search. +image: https://postgresml.org/dashboard/static/images/blog/announcing_hnsw_support.webp +image_alt: HNSW provides a significant improvement in recall speed compared to IVFFlat --- # Announcing HNSW Support in Our SDK @@ -15,6 +17,9 @@ description: HNSW indexing is the latest upgrade in vector recall performance. I PostgresML makes it easy to use machine learning with your database and to scale workloads horizontally in our cloud. Our SDK makes it even easier. +data is always the best medicine +

HNSW (hierarchical navigable small worlds) is an indexing method that greatly improves vector recall

+ ## Introducing HNSW Underneath the hood our SDK utilizes [pgvector](https://github.com/pgvector/pgvector) to store, index, and recall vectors. Up until this point our SDK used IVFFlat indexing to divide vectors into lists, search a subset of those lists, and return the closest vector matches. diff --git a/pgml-dashboard/src/components/navbar/template.html b/pgml-dashboard/src/components/navbar/template.html index e4d1362d7..876ccc42c 100644 --- a/pgml-dashboard/src/components/navbar/template.html +++ b/pgml-dashboard/src/components/navbar/template.html @@ -23,7 +23,7 @@ --> <% } %> diff --git a/pgml-dashboard/src/components/navbar_web_app/template.html b/pgml-dashboard/src/components/navbar_web_app/template.html index c716e6d9e..72f691e58 100644 --- a/pgml-dashboard/src/components/navbar_web_app/template.html +++ b/pgml-dashboard/src/components/navbar_web_app/template.html @@ -54,7 +54,7 @@
<% if !account_management_nav.links.is_empty() { %> @@ -82,7 +82,7 @@ <% if !standalone_dashboard { %> diff --git a/pgml-dashboard/static/images/blog/announcing_hnsw_support.webp b/pgml-dashboard/static/images/blog/announcing_hnsw_support.webp new file mode 100644 index 0000000000000000000000000000000000000000..248a0873374cd63eefbac5cc99affde0db4fdf39 GIT binary patch literal 30682 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ƌ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 Qr`(X{_)TRod`SQR089;U?EnA( literal 0 HcmV?d00001 diff --git a/pgml-dashboard/templates/layout/nav/top_web_app.html b/pgml-dashboard/templates/layout/nav/top_web_app.html index e9d62aab6..2035ad186 100644 --- a/pgml-dashboard/templates/layout/nav/top_web_app.html +++ b/pgml-dashboard/templates/layout/nav/top_web_app.html @@ -53,7 +53,7 @@
<% if !account_management_nav.links.is_empty() { %> @@ -91,7 +91,7 @@ <% if !standalone_dashboard { %> pFad - Phonifier reborn

Pfad - The Proxy pFad of © 2024 Garber Painting. All rights reserved.

Note: This service is not intended for secure transactions such as banking, social media, email, or purchasing. Use at your own risk. We assume no liability whatsoever for broken pages.


Alternative Proxies:

Alternative Proxy

pFad Proxy

pFad v3 Proxy

pFad v4 Proxy