Skip to content

Commit 9af0757

Browse files
committed
Update rescore context for 4x compression
Since rescore is supported for lucene engine, update rescore context for 4x compression to use 1x oversampling factor. Signed-off-by: Vijayan B <[email protected]>
1 parent 7634987 commit 9af0757

File tree

5 files changed

+29
-12
lines changed

5 files changed

+29
-12
lines changed

release-notes/opensearch-knn.release-notes-3.1.0.0.md

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@ Compatible with OpenSearch 3.1.0.0
1212
* [Remote Vector Index Build] Add tuned repository upload/download configurations per benchmarking results [#2662](https://github.com/opensearch-project/k-NN/pull/2662)
1313
* [Remote Vector Index Build] Add segment size upper bound setting and prepare other settings for GA [#2734](https://github.com/opensearch-project/k-NN/pull/2734)
1414
* [Remote Vector Index Build] Make `index.knn.remote_index_build.enabled` default to true [#2743](https://github.com/opensearch-project/k-NN/pull/2743)
15+
* Update rescore context for 4X Compression [#2750](https://github.com/opensearch-project/k-NN/pull/2750)
1516

1617
### Bug Fixes
1718
* [BUGFIX] Fix KNN Quantization state cache have an invalid weight threshold [#2666](https://github.com/opensearch-project/k-NN/pull/2666)

src/main/java/org/opensearch/knn/index/mapper/CompressionLevel.java

Lines changed: 15 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -5,8 +5,10 @@
55

66
package org.opensearch.knn.index.mapper;
77

8+
import com.google.common.annotations.VisibleForTesting;
89
import lombok.AllArgsConstructor;
910
import lombok.Getter;
11+
import org.opensearch.Version;
1012
import org.opensearch.core.common.Strings;
1113
import org.opensearch.knn.index.query.rescore.RescoreContext;
1214

@@ -24,7 +26,7 @@ public enum CompressionLevel {
2426
NOT_CONFIGURED(-1, "", null, Collections.emptySet()),
2527
x1(1, "1x", null, Collections.emptySet()),
2628
x2(2, "2x", null, Collections.emptySet()),
27-
x4(4, "4x", null, Collections.emptySet()),
29+
x4(4, "4x", new RescoreContext(1.0f, false, true), Set.of(Mode.ON_DISK)),
2830
x8(8, "8x", new RescoreContext(2.0f, false, true), Set.of(Mode.ON_DISK)),
2931
x16(16, "16x", new RescoreContext(3.0f, false, true), Set.of(Mode.ON_DISK)),
3032
x32(32, "32x", new RescoreContext(3.0f, false, true), Set.of(Mode.ON_DISK)),
@@ -105,20 +107,29 @@ public static boolean isConfigured(CompressionLevel compressionLevel) {
105107
* or equal to 1000, the default {@link RescoreContext} if greater, or {@code null} if the mode
106108
* is invalid.
107109
*/
108-
public RescoreContext getDefaultRescoreContext(Mode mode, int dimension) {
110+
public RescoreContext getDefaultRescoreContext(Mode mode, int dimension, Version version) {
111+
//TODO move this to separate class called resolver to resolve rescore context
109112
if (modesForRescore.contains(mode)) {
113+
if( this == x4 && version.before(Version.V_3_1_0)){
114+
// For index created before 3.1, context was always null and mode is empty
115+
return null;
116+
}
110117
// Adjust RescoreContext based on dimension
111118
if (dimension <= RescoreContext.DIMENSION_THRESHOLD) {
112119
// For dimensions <= 1000, return a RescoreContext with 5.0f oversample factor
113120
return RescoreContext.builder()
114121
.oversampleFactor(RescoreContext.OVERSAMPLE_FACTOR_BELOW_DIMENSION_THRESHOLD)
115122
.userProvided(false)
116123
.build();
117-
} else {
118-
return defaultRescoreContext;
119124
}
125+
return defaultRescoreContext;
120126
}
121127
return null;
122128
}
123129

130+
@VisibleForTesting
131+
RescoreContext getDefaultRescoreContext(Mode mode, int dimension){
132+
return getDefaultRescoreContext(mode, dimension, Version.CURRENT);
133+
}
134+
124135
}

src/main/java/org/opensearch/knn/index/mapper/KNNVectorFieldType.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -125,7 +125,7 @@ public RescoreContext resolveRescoreContext(RescoreContext userProvidedContext)
125125
int dimension = knnMappingConfig.getDimension();
126126
CompressionLevel compressionLevel = knnMappingConfig.getCompressionLevel();
127127
Mode mode = knnMappingConfig.getMode();
128-
return compressionLevel.getDefaultRescoreContext(mode, dimension);
128+
return compressionLevel.getDefaultRescoreContext(mode, dimension, knnMappingConfig.getIndexCreatedVersion());
129129
}
130130

131131
/**

src/test/java/org/opensearch/knn/index/mapper/CompressionLevelTests.java

Lines changed: 10 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -90,12 +90,18 @@ public void testGetDefaultRescoreContext() {
9090
assertTrue(rescoreContext.isRescoreEnabled());
9191
assertFalse(rescoreContext.isUserProvided());
9292

93-
// x4 with dimension <= 1000 should have an oversample factor of 5.0f (though it doesn't have its own RescoreContext)
93+
// x4 with dimension <= 1000 should have an oversample factor of 5.0f
9494
rescoreContext = CompressionLevel.x4.getDefaultRescoreContext(mode, belowThresholdDimension);
95-
assertNull(rescoreContext);
96-
// x4 with dimension > 1000 should return null (no RescoreContext is configured for x4)
95+
assertNotNull(rescoreContext);
96+
assertEquals(5.0f, rescoreContext.getOversampleFactor(), 0.0f);
97+
assertTrue(rescoreContext.isRescoreEnabled());
98+
assertFalse(rescoreContext.isUserProvided());
99+
// x4 with dimension > 1000 should have an oversample factor of 1.0f
97100
rescoreContext = CompressionLevel.x4.getDefaultRescoreContext(mode, aboveThresholdDimension);
98-
assertNull(rescoreContext);
101+
assertNotNull(rescoreContext);
102+
assertEquals(1.0f, rescoreContext.getOversampleFactor(), 0.0f);
103+
assertTrue(rescoreContext.isRescoreEnabled());
104+
assertFalse(rescoreContext.isUserProvided());
99105
// Other compression levels should behave similarly with respect to dimension
100106
rescoreContext = CompressionLevel.x2.getDefaultRescoreContext(mode, belowThresholdDimension);
101107
assertNull(rescoreContext);

src/test/java/org/opensearch/knn/integ/ModeAndCompressionIT.java

Lines changed: 2 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -650,8 +650,7 @@ private void validateSearch(
650650
String exactSearchResponseBody = EntityUtils.toString(exactSearchResponse.getEntity());
651651
List<Float> exactSearchKnnResults = parseSearchResponseScore(exactSearchResponseBody, FIELD_NAME);
652652
assertEquals(NUM_DOCS, exactSearchKnnResults.size());
653-
654-
if (CompressionLevel.x4.getName().equals(compressionLevelString) == false && Mode.ON_DISK.getName().equals(mode)) {
653+
if(Mode.ON_DISK.getName().equals(mode)){
655654
Assert.assertEquals(exactSearchKnnResults, knnResults);
656655
}
657656

@@ -681,7 +680,7 @@ private void validateSearch(
681680
responseBody = EntityUtils.toString(response.getEntity());
682681
knnResults = parseSearchResponseScore(responseBody, FIELD_NAME);
683682
assertEquals(K, knnResults.size());
684-
if (CompressionLevel.x4.getName().equals(compressionLevelString) == false && Mode.ON_DISK.getName().equals(mode)) {
683+
if (Mode.ON_DISK.getName().equals(mode)) {
685684
Assert.assertEquals(exactSearchKnnResults, knnResults);
686685
}
687686
}

0 commit comments

Comments
 (0)