summaryrefslogtreecommitdiffstats
path: root/model-evaluation
diff options
context:
space:
mode:
authorArne Juul <arnej@yahooinc.com>2023-09-18 14:46:10 +0000
committerArne Juul <arnej@yahooinc.com>2023-09-18 14:46:10 +0000
commit7097b3d47b63c1bb5b2b8354d8f1d326514d80dc (patch)
tree968c099f0fb540e3b0c5c0da674b4f24884d1ae7 /model-evaluation
parenteede788d1c20d2f246f44287308dad69487369ea (diff)
if something is already a match-feature, avoid computing it again in global-phase
Diffstat (limited to 'model-evaluation')
-rw-r--r--model-evaluation/src/main/java/ai/vespa/models/evaluation/RankProfilesConfigImporter.java12
-rw-r--r--model-evaluation/src/test/java/ai/vespa/models/evaluation/RankProfileImportingTest.java13
-rw-r--r--model-evaluation/src/test/resources/config/layered/onnx-models.cfg1
-rw-r--r--model-evaluation/src/test/resources/config/layered/rank-profiles.cfg25
-rw-r--r--model-evaluation/src/test/resources/config/layered/ranking-constants.cfg0
-rw-r--r--model-evaluation/src/test/resources/config/layered/ranking-expressions.cfg0
6 files changed, 50 insertions, 1 deletions
diff --git a/model-evaluation/src/main/java/ai/vespa/models/evaluation/RankProfilesConfigImporter.java b/model-evaluation/src/main/java/ai/vespa/models/evaluation/RankProfilesConfigImporter.java
index 76869932a3e..085f80c0ae6 100644
--- a/model-evaluation/src/main/java/ai/vespa/models/evaluation/RankProfilesConfigImporter.java
+++ b/model-evaluation/src/main/java/ai/vespa/models/evaluation/RankProfilesConfigImporter.java
@@ -29,10 +29,12 @@ import java.util.ArrayList;
import java.util.Collection;
import java.util.Collections;
import java.util.HashMap;
+import java.util.HashSet;
import java.util.LinkedHashMap;
import java.util.List;
import java.util.Map;
import java.util.Optional;
+import java.util.Set;
import java.util.TreeMap;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
@@ -92,6 +94,7 @@ public class RankProfilesConfigImporter {
ExpressionFunction secondPhase = null;
ExpressionFunction globalPhase = null;
Map<String, TensorType> declaredTypes = new LinkedHashMap<>();
+ Set<String> matchFeaturesSet = new HashSet<>();
for (RankProfilesConfig.Rankprofile.Fef.Property property : profile.fef().property()) {
Optional<FunctionReference> reference = FunctionReference.fromSerial(property.name());
Optional<FunctionReference> externalReference = FunctionReference.fromExternalSerial(property.name());
@@ -139,6 +142,9 @@ public class RankProfilesConfigImporter {
declaredTypes.put(function.getName(), type); // "foo"
declaredTypes.put(functionRef.serialForm(), type); // "rankingExpression(foo)"
}
+ else if (property.name().equals("vespa.match.feature")) {
+ matchFeaturesSet.add(property.value());
+ }
else if (property.name().equals("vespa.rank.firstphase")) { // Include in addition to functions
firstPhase = new ExpressionFunction("firstphase", new ArrayList<>(),
new RankingExpression("first-phase", property.value()));
@@ -166,7 +172,11 @@ public class RankProfilesConfigImporter {
functions.put(FunctionReference.fromName("globalphase"), globalPhase);
constants.addAll(smallConstantsInfo.asConstants());
-
+ for (String k : matchFeaturesSet) {
+ var optRef = FunctionReference.fromSerial(k);
+ var ref = optRef.orElse(FunctionReference.fromName(k));
+ referencedFunctions.remove(ref);
+ }
try {
return new Model(profile.name(), functions, referencedFunctions, declaredTypes, constants, onnxModels);
}
diff --git a/model-evaluation/src/test/java/ai/vespa/models/evaluation/RankProfileImportingTest.java b/model-evaluation/src/test/java/ai/vespa/models/evaluation/RankProfileImportingTest.java
index ff1f9afcc91..4234305b888 100644
--- a/model-evaluation/src/test/java/ai/vespa/models/evaluation/RankProfileImportingTest.java
+++ b/model-evaluation/src/test/java/ai/vespa/models/evaluation/RankProfileImportingTest.java
@@ -74,4 +74,17 @@ public class RankProfileImportingTest {
assertEquals("tensor(d0[2])", args.get("attribute(doc_vec)").toString());
assertEquals("tensor(d0[2])", args.get("query(query_vec)").toString());
}
+
+ @Test
+ public void testImportingLayeredGlobalPhase() {
+ ModelTester tester = new ModelTester("src/test/resources/config/layered/");
+ assertEquals(1, tester.models().size());
+ Model m = tester.models().get("layered");
+ assertEquals("layered", m.name());
+ var func = m.function("globalphase");
+ assertEquals("globalphase", func.getName());
+ var args = func.argumentTypes();
+ assertEquals(1, args.size());
+ assertEquals("tensor(m{},v[3])", args.get("rankingExpression(mymul)").toString());
+ }
}
diff --git a/model-evaluation/src/test/resources/config/layered/onnx-models.cfg b/model-evaluation/src/test/resources/config/layered/onnx-models.cfg
new file mode 100644
index 00000000000..3123c7c037f
--- /dev/null
+++ b/model-evaluation/src/test/resources/config/layered/onnx-models.cfg
@@ -0,0 +1 @@
+gpu.count -1
diff --git a/model-evaluation/src/test/resources/config/layered/rank-profiles.cfg b/model-evaluation/src/test/resources/config/layered/rank-profiles.cfg
new file mode 100644
index 00000000000..9b878c2f364
--- /dev/null
+++ b/model-evaluation/src/test/resources/config/layered/rank-profiles.cfg
@@ -0,0 +1,25 @@
+rankprofile[0].name "layered"
+rankprofile[0].fef.property[0].name "rankingExpression(mymul).rankingScript"
+rankprofile[0].fef.property[0].value "tensorFromLabels(attribute(labels),m) * query(v)"
+rankprofile[0].fef.property[1].name "rankingExpression(mymul).type"
+rankprofile[0].fef.property[1].value "tensor(m{},v[3])"
+rankprofile[0].fef.property[2].name "vespa.type.feature.mymul"
+rankprofile[0].fef.property[2].value "tensor(m{},v[3])"
+rankprofile[0].fef.property[3].name "vespa.rank.firstphase"
+rankprofile[0].fef.property[3].value "attribute(foo1)"
+rankprofile[0].fef.property[4].name "vespa.rank.globalphase"
+rankprofile[0].fef.property[4].value "rankingExpression(globalphase)"
+rankprofile[0].fef.property[5].name "rankingExpression(globalphase).rankingScript"
+rankprofile[0].fef.property[5].value "reduce(rankingExpression(mymul), sum)"
+rankprofile[0].fef.property[6].name "vespa.match.feature"
+rankprofile[0].fef.property[6].value "rankingExpression(mymul)"
+rankprofile[0].fef.property[7].name "vespa.feature.rename"
+rankprofile[0].fef.property[7].value "rankingExpression(mymul)"
+rankprofile[0].fef.property[8].name "vespa.feature.rename"
+rankprofile[0].fef.property[8].value "mymul"
+rankprofile[0].fef.property[9].name "vespa.globalphase.rerankcount"
+rankprofile[0].fef.property[9].value "123"
+rankprofile[0].fef.property[10].name "vespa.type.attribute.t1"
+rankprofile[0].fef.property[10].value "tensor(m{},v[3])"
+rankprofile[0].fef.property[11].name "vespa.type.query.v"
+rankprofile[0].fef.property[11].value "tensor(v[3])"
diff --git a/model-evaluation/src/test/resources/config/layered/ranking-constants.cfg b/model-evaluation/src/test/resources/config/layered/ranking-constants.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/model-evaluation/src/test/resources/config/layered/ranking-constants.cfg
diff --git a/model-evaluation/src/test/resources/config/layered/ranking-expressions.cfg b/model-evaluation/src/test/resources/config/layered/ranking-expressions.cfg
new file mode 100644
index 00000000000..e69de29bb2d
--- /dev/null
+++ b/model-evaluation/src/test/resources/config/layered/ranking-expressions.cfg