aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorJon Bratseth <bratseth@oath.com>2018-09-12 08:07:03 +0200
committerGitHub <noreply@github.com>2018-09-12 08:07:03 +0200
commitf32ef779eb5d6e22b8f13ddc4f4ebab5a109b810 (patch)
tree75090c688486aaad380dda8079218e04d55c4cf8
parentc5ac946420c209ea2994ee957d2308ec613acc01 (diff)
Revert "Revert "Add model-evaluation tag""
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java2
-rwxr-xr-xconfig-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java81
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java41
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChain.java1
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChains.java6
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/processing/Processor.java1
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java5
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java66
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/Content.java2
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java3
-rw-r--r--config-model/src/main/resources/schema/containercluster.rnc5
-rw-r--r--config-model/src/test/cfg/application/ml_serving/services.xml1
-rw-r--r--config-model/src/test/cfg/application/ml_serving_name_collision/services.xml1
-rw-r--r--config-model/src/test/cfg/application/ml_serving_not_activated/models/xgboost.2.2.json19
-rw-r--r--config-model/src/test/cfg/application/ml_serving_not_activated/services.xml13
-rwxr-xr-xconfig-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java10
-rw-r--r--config-model/src/test/java/com/yahoo/vespa/model/ml/ModelEvaluationTest.java44
18 files changed, 191 insertions, 115 deletions
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java
index d67cb0c29c3..9deb03495f2 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV2Builder.java
@@ -90,7 +90,10 @@ public class DomAdminV2Builder extends DomAdminBuilderBase {
if (standaloneZooKeeper) {
parent = new ClusterControllerCluster(parent, "standalone");
}
- ContainerCluster cluster = new ContainerCluster(parent, "cluster-controllers", "cluster-controllers", new ClusterControllerClusterVerifier(), RankProfileList.empty);
+ ContainerCluster cluster = new ContainerCluster(parent,
+ "cluster-controllers",
+ "cluster-controllers",
+ new ClusterControllerClusterVerifier());
ContainerModelBuilder.addDefaultHandler_legacyBuilder(cluster);
List<Container> containers = new ArrayList<>();
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java
index 291a2824e46..25d184d148a 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/builder/xml/dom/DomAdminV4Builder.java
@@ -98,7 +98,7 @@ public class DomAdminV4Builder extends DomAdminBuilderBase {
// Creates a container cluster 'logserver-cluster' with 1 container on logserver host
// for setting up a handler for getting logs from logserver
private void createAdditionalContainerOnLogserverHost(Admin admin, HostResource hostResource) {
- ContainerCluster logServerCluster = new ContainerCluster(admin, "logserver-cluster", "logserver-cluster", RankProfileList.empty);
+ ContainerCluster logServerCluster = new ContainerCluster(admin, "logserver-cluster", "logserver-cluster");
ContainerModel logserverClusterModel = new ContainerModel(context.withParent(admin).withId(logServerCluster.getSubId()));
logserverClusterModel.setCluster(logServerCluster);
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
index fbe86d26b02..f0724306e9c 100755
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerCluster.java
@@ -1,7 +1,6 @@
// Copyright 2017 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
package com.yahoo.vespa.model.container;
-import ai.vespa.models.evaluation.ModelsEvaluator;
import com.yahoo.cloud.config.ClusterInfoConfig;
import com.yahoo.cloud.config.ConfigserverConfig;
import com.yahoo.cloud.config.RoutingProviderConfig;
@@ -41,7 +40,6 @@ import com.yahoo.search.config.IndexInfoConfig;
import com.yahoo.search.config.QrStartConfig;
import com.yahoo.search.pagetemplates.PageTemplatesConfig;
import com.yahoo.search.query.profile.config.QueryProfilesConfig;
-import com.yahoo.searchdefinition.derived.RankProfileList;
import com.yahoo.vespa.config.search.RankProfilesConfig;
import com.yahoo.vespa.config.search.core.RankingConstantsConfig;
import com.yahoo.vespa.configdefinition.IlscriptsConfig;
@@ -157,6 +155,7 @@ public final class ContainerCluster
private ContainerDocproc containerDocproc;
private ContainerDocumentApi containerDocumentApi;
private SecretStore secretStore;
+ private ContainerModelEvaluation modelEvaluation;
private MbusParams mbusParams;
private boolean rpcServerEnabled = true;
@@ -173,9 +172,6 @@ public final class ContainerCluster
private final ContainerClusterVerifier clusterVerifier;
private final boolean isHostedVespa;
- /** Global rank profiles, aka models */
- private final RankProfileList rankProfileList;
-
private Map<String, String> concreteDocumentTypes = new LinkedHashMap<>();
private MetricDefaultsConfig.Factory.Enum defaultMetricConsumerFactory;
@@ -200,30 +196,16 @@ public final class ContainerCluster
}
}
- /**
- * Creates a container cluster
- *
- * @param rankProfileList the list ofd global rank profiles containing models that should be available in
- * container clusters
- */
- public ContainerCluster(AbstractConfigProducer<?> parent,
- String subId,
- String name,
- RankProfileList rankProfileList) {
- this(parent, subId, name, new AcceptAllVerifier(), rankProfileList);
+ /** Creates a container cluster */
+ public ContainerCluster(AbstractConfigProducer<?> parent, String subId, String name) {
+ this(parent, subId, name, new AcceptAllVerifier());
}
- /**
- * Creates a container cluster
- *
- * @param rankProfileList the list ofd global rank profiles containing models that should be available in
- * container clusters
- */
+ /** Creates a container cluster */
public ContainerCluster(AbstractConfigProducer<?> parent,
String subId,
String name,
- ContainerClusterVerifier verifier,
- RankProfileList rankProfileList) {
+ ContainerClusterVerifier verifier) {
super(parent, subId);
this.clusterVerifier = verifier;
this.name = name;
@@ -233,14 +215,12 @@ public final class ContainerCluster
componentGroup = new ComponentGroup<>(this, "component");
restApiGroup = new ConfigProducerGroup<>(this, "rest-api");
servletGroup = new ConfigProducerGroup<>(this, "servlet");
- this.rankProfileList = Objects.requireNonNull(rankProfileList, "rankProfileList cannot be null");
addComponent(new StatisticsComponent());
addSimpleComponent(AccessLog.class);
// TODO better modelling
addSimpleComponent(ThreadPoolProvider.class);
addSimpleComponent(com.yahoo.concurrent.classlock.ClassLocking.class);
- addSimpleComponent(ModelsEvaluator.class.getName(), null, "model-evaluation");
addSimpleComponent("com.yahoo.jdisc.http.filter.SecurityFilterInvoker");
addSimpleComponent(SIMPLE_LINGUISTICS_PROVIDER);
addSimpleComponent("com.yahoo.container.jdisc.SecretStoreProvider");
@@ -360,7 +340,8 @@ public final class ContainerCluster
public void prepare() {
addAndSendApplicationBundles();
- rankProfileList.sendConstantsTo(containers);
+ if (modelEvaluation != null)
+ modelEvaluation.prepare(containers);
sendUserConfiguredFiles();
setApplicationMetaData();
for (RestApi restApi : restApiGroup.getComponents())
@@ -457,6 +438,10 @@ public final class ContainerCluster
this.containerSearch = containerSearch;
}
+ public void setModelEvaluation(ContainerModelEvaluation modelEvaluation) {
+ this.modelEvaluation = modelEvaluation;
+ }
+
public void setHttp(Http http) {
this.http = http;
addChild(http);
@@ -551,13 +536,13 @@ public final class ContainerCluster
}
@Override
- public final void getConfig(ComponentsConfig.Builder builder) {
+ public void getConfig(ComponentsConfig.Builder builder) {
builder.components.addAll(ComponentsConfigGenerator.generate(getAllComponents()));
builder.components(new ComponentsConfig.Components.Builder().id("com.yahoo.container.core.config.HandlersConfigurerDi$RegistriesHack"));
}
@Override
- public final void getConfig(JdiscBindingsConfig.Builder builder) {
+ public void getConfig(JdiscBindingsConfig.Builder builder) {
builder.handlers.putAll(DiscBindingsConfigGenerator.generate(getHandlers()));
}
@@ -652,47 +637,37 @@ public final class ContainerCluster
@Override
public void getConfig(DocprocConfig.Builder builder) {
- if (containerDocproc != null) {
- containerDocproc.getConfig(builder);
- }
+ if (containerDocproc != null) containerDocproc.getConfig(builder);
}
@Override
public void getConfig(PageTemplatesConfig.Builder builder) {
- if (containerSearch != null) {
- containerSearch.getConfig(builder);
- }
+ if (containerSearch != null) containerSearch.getConfig(builder);
}
@Override
public void getConfig(SemanticRulesConfig.Builder builder) {
- if (containerSearch != null) {
- containerSearch.getConfig(builder);
- }
+ if (containerSearch != null) containerSearch.getConfig(builder);
}
@Override
public void getConfig(QueryProfilesConfig.Builder builder) {
- if (containerSearch != null) {
- containerSearch.getConfig(builder);
- }
+ if (containerSearch != null) containerSearch.getConfig(builder);
}
@Override
public void getConfig(SchemamappingConfig.Builder builder) {
- if (containerDocproc!=null) containerDocproc.getConfig(builder);
+ if (containerDocproc != null) containerDocproc.getConfig(builder);
}
@Override
public void getConfig(IndexInfoConfig.Builder builder) {
- if (containerSearch!=null) containerSearch.getConfig(builder);
+ if (containerSearch != null) containerSearch.getConfig(builder);
}
@Override
public void getConfig(FeederConfig.Builder builder) {
- if (containerDocumentApi != null) {
- containerDocumentApi.getConfig(builder);
- }
+ if (containerDocumentApi != null) containerDocumentApi.getConfig(builder);
}
@Override
@@ -711,19 +686,20 @@ public final class ContainerCluster
@Override
public void getConfig(RankProfilesConfig.Builder builder) {
- rankProfileList.getConfig(builder);
+ if (modelEvaluation != null) modelEvaluation.getConfig(builder);
}
@Override
- public void getConfig(RankingConstantsConfig.Builder builder) { rankProfileList.getConfig(builder); }
+ public void getConfig(RankingConstantsConfig.Builder builder) {
+ if (modelEvaluation != null) modelEvaluation.getConfig(builder);
+ }
public void setMbusParams(MbusParams mbusParams) {
this.mbusParams = mbusParams;
}
public void initialize(Map<String, AbstractSearchCluster> clusterMap) {
- if (containerSearch != null)
- containerSearch.connectSearchClusters(clusterMap);
+ if (containerSearch != null) containerSearch.connectSearchClusters(clusterMap);
}
public void addDefaultSearchAccessLog() {
@@ -741,9 +717,7 @@ public final class ContainerCluster
@Override
public void getConfig(MetricDefaultsConfig.Builder builder) {
- if (defaultMetricConsumerFactory != null) {
- builder.factory(defaultMetricConsumerFactory);
- }
+ if (defaultMetricConsumerFactory != null) builder.factory(defaultMetricConsumerFactory);
}
@Override
@@ -853,4 +827,5 @@ public final class ContainerCluster
this.containerCoreMemory = containerCoreMemory;
}
}
+
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java
new file mode 100644
index 00000000000..09990c7b9de
--- /dev/null
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/ContainerModelEvaluation.java
@@ -0,0 +1,41 @@
+// Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root.
+package com.yahoo.vespa.model.container;
+
+import ai.vespa.models.evaluation.ModelsEvaluator;
+import com.yahoo.searchdefinition.derived.RankProfileList;
+import com.yahoo.vespa.config.search.RankProfilesConfig;
+import com.yahoo.vespa.config.search.core.RankingConstantsConfig;
+
+import java.util.List;
+import java.util.Objects;
+
+/**
+ * Configuration of components for stateless model evaluation
+ *
+ * @author bratseth
+ */
+public class ContainerModelEvaluation implements RankProfilesConfig.Producer, RankingConstantsConfig.Producer {
+
+ /** Global rank profiles, aka models */
+ private final RankProfileList rankProfileList;
+
+ public ContainerModelEvaluation(ContainerCluster cluster, RankProfileList rankProfileList) {
+ this.rankProfileList = Objects.requireNonNull(rankProfileList, "rankProfileList cannot be null");
+ cluster.addSimpleComponent(ModelsEvaluator.class.getName(), null, "model-evaluation");
+ }
+
+ public void prepare(List<Container> containers) {
+ rankProfileList.sendConstantsTo(containers);
+ }
+
+ @Override
+ public void getConfig(RankProfilesConfig.Builder builder) {
+ rankProfileList.getConfig(builder);
+ }
+
+ @Override
+ public void getConfig(RankingConstantsConfig.Builder builder) {
+ rankProfileList.getConfig(builder);
+ }
+
+}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChain.java b/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChain.java
index 73430d8e453..9a984ca1917 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChain.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChain.java
@@ -8,7 +8,6 @@ import com.yahoo.vespa.model.container.component.chain.Chain;
* Represents a processing chain in the config model
*
* @author bratseth
- * @since 5.1.6
*/
public class ProcessingChain extends Chain<Processor> {
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChains.java b/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChains.java
index 644316ff652..32f0f373a92 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChains.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/processing/ProcessingChains.java
@@ -12,14 +12,14 @@ import java.util.List;
* Root config producer for processing
*
* @author bratseth
- * @since 5.1.6
*/
public class ProcessingChains extends Chains<ProcessingChain> {
- public static final String[] defaultBindings = new String[]
- {"http://*/processing/*", "https://*/processing/*"};
+
+ public static final String[] defaultBindings = new String[] {"http://*/processing/*", "https://*/processing/*"};
public ProcessingChains(AbstractConfigProducer parent, String subId) {
super(parent, subId);
}
+
}
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/processing/Processor.java b/config-model/src/main/java/com/yahoo/vespa/model/container/processing/Processor.java
index e4f46be914b..3ad6484aaec 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/processing/Processor.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/processing/Processor.java
@@ -9,7 +9,6 @@ import com.yahoo.vespa.model.container.component.chain.ChainedComponent;
* Representation of a Processor in the configuration model
*
* @author bratseth
- * @since 5.1.6
*/
public class Processor extends ChainedComponent<ChainedComponentModel> {
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java b/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java
index c711f268534..36feba34680 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/search/ContainerSearch.java
@@ -35,11 +35,10 @@ public class ContainerSearch extends ContainerSubsystem<SearchChains>
QrStartConfig.Producer,
QueryProfilesConfig.Producer,
SemanticRulesConfig.Producer,
- PageTemplatesConfig.Producer
-{
+ PageTemplatesConfig.Producer {
private final List<AbstractSearchCluster> systems = new LinkedList<>();
- private Options options = null;
+ private final Options options;
// For legacy qrs clusters only.
private BinaryScaledAmount totalCacheSize = new BinaryScaledAmount();
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java
index cb4cf92a223..2d3f3036ccc 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/container/xml/ContainerModelBuilder.java
@@ -45,6 +45,7 @@ import com.yahoo.vespa.model.clients.ContainerDocumentApi;
import com.yahoo.vespa.model.container.Container;
import com.yahoo.vespa.model.container.ContainerCluster;
import com.yahoo.vespa.model.container.ContainerModel;
+import com.yahoo.vespa.model.container.ContainerModelEvaluation;
import com.yahoo.vespa.model.container.IdentityProvider;
import com.yahoo.vespa.model.container.SecretStore;
import com.yahoo.vespa.model.container.component.Component;
@@ -148,11 +149,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
return new VespaDomBuilder.DomConfigProducerBuilder<ContainerCluster>() {
@Override
protected ContainerCluster doBuild(AbstractConfigProducer ancestor, Element producerSpec) {
- return new ContainerCluster(ancestor,
- modelContext.getProducerId(),
- modelContext.getProducerId(),
- modelContext.vespaModel() != null ? modelContext.vespaModel().rankProfileList()
- : RankProfileList.empty);
+ return new ContainerCluster(ancestor, modelContext.getProducerId(), modelContext.getProducerId());
}
}.build(modelContext.getParentProducer(), spec);
}
@@ -166,6 +163,7 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
addServlets(spec, cluster);
addProcessing(spec, cluster);
addSearch(spec, cluster, context.getDeployState().getQueryProfiles(), context.getDeployState().getSemanticRules());
+ addModelEvaluation(spec, cluster, context);
addDocproc(spec, cluster);
addDocumentApi(spec, cluster); // NOTE: Must be done after addSearch
@@ -355,50 +353,56 @@ public class ContainerModelBuilder extends ConfigModelBuilder<ContainerModel> {
}
private void addServlets(Element spec, ContainerCluster cluster) {
- for (Element servletElem : XML.getChildren(spec, "servlet")) {
- cluster.addServlet(
- new ServletBuilder().build(cluster, servletElem));
- }
+ for (Element servletElem : XML.getChildren(spec, "servlet"))
+ cluster.addServlet(new ServletBuilder().build(cluster, servletElem));
}
private void addDocumentApi(Element spec, ContainerCluster cluster) {
ContainerDocumentApi containerDocumentApi = buildDocumentApi(cluster, spec);
- if (containerDocumentApi != null) {
- cluster.setDocumentApi(containerDocumentApi);
- }
+ if (containerDocumentApi == null) return;
+
+ cluster.setDocumentApi(containerDocumentApi);
}
private void addDocproc(Element spec, ContainerCluster cluster) {
ContainerDocproc containerDocproc = buildDocproc(cluster, spec);
- if (containerDocproc != null) {
- cluster.setDocproc(containerDocproc);
+ if (containerDocproc == null) return;
+ cluster.setDocproc(containerDocproc);
- ContainerDocproc.Options docprocOptions = containerDocproc.options;
- cluster.setMbusParams(new ContainerCluster.MbusParams(
- docprocOptions.maxConcurrentFactor, docprocOptions.documentExpansionFactor, docprocOptions.containerCoreMemory));
- }
+ ContainerDocproc.Options docprocOptions = containerDocproc.options;
+ cluster.setMbusParams(new ContainerCluster.MbusParams(
+ docprocOptions.maxConcurrentFactor, docprocOptions.documentExpansionFactor, docprocOptions.containerCoreMemory));
}
private void addSearch(Element spec, ContainerCluster cluster, QueryProfiles queryProfiles, SemanticRules semanticRules) {
Element searchElement = XML.getChild(spec, "search");
- if (searchElement != null) {
- addIncludes(searchElement);
- cluster.setSearch(buildSearch(cluster, searchElement, queryProfiles, semanticRules));
+ if (searchElement == null) return;
- addSearchHandler(cluster, searchElement);
- addGUIHandler(cluster);
- validateAndAddConfiguredComponents(cluster, searchElement, "renderer", ContainerModelBuilder::validateRendererElement);
- }
+ addIncludes(searchElement);
+ cluster.setSearch(buildSearch(cluster, searchElement, queryProfiles, semanticRules));
+
+ addSearchHandler(cluster, searchElement);
+ addGUIHandler(cluster);
+ validateAndAddConfiguredComponents(cluster, searchElement, "renderer", ContainerModelBuilder::validateRendererElement);
+ }
+
+ private void addModelEvaluation(Element spec, ContainerCluster cluster, ConfigModelContext context) {
+ Element modelEvaluationElement = XML.getChild(spec, "model-evaluation");
+ if (modelEvaluationElement == null) return;
+
+ RankProfileList profiles =
+ context.vespaModel() != null ? context.vespaModel().rankProfileList() : RankProfileList.empty;
+ cluster.setModelEvaluation(new ContainerModelEvaluation(cluster, profiles));
}
private void addProcessing(Element spec, ContainerCluster cluster) {
Element processingElement = XML.getChild(spec, "processing");
- if (processingElement != null) {
- addIncludes(processingElement);
- cluster.setProcessingChains(new DomProcessingBuilder(null).build(cluster, processingElement),
- serverBindings(processingElement, ProcessingChains.defaultBindings));
- validateAndAddConfiguredComponents(cluster, processingElement, "renderer", ContainerModelBuilder::validateRendererElement);
- }
+ if (processingElement == null) return;
+
+ addIncludes(processingElement);
+ cluster.setProcessingChains(new DomProcessingBuilder(null).build(cluster, processingElement),
+ serverBindings(processingElement, ProcessingChains.defaultBindings));
+ validateAndAddConfiguredComponents(cluster, processingElement, "renderer", ContainerModelBuilder::validateRendererElement);
}
private ContainerSearch buildSearch(ContainerCluster containerCluster, Element producerSpec,
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java b/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java
index d3709e88f29..ec68243ec9d 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/Content.java
@@ -299,7 +299,7 @@ public class Content extends ConfigModel {
AbstractConfigProducer parent = root.getChildren().get(ContainerModel.DOCPROC_RESERVED_NAME);
if (parent == null)
parent = new SimpleConfigProducer(root, ContainerModel.DOCPROC_RESERVED_NAME);
- ContainerCluster indexingCluster = new ContainerCluster(parent, "cluster." + indexerName, indexerName, RankProfileList.empty);
+ ContainerCluster indexingCluster = new ContainerCluster(parent, "cluster." + indexerName, indexerName);
ContainerModel indexingClusterModel = new ContainerModel(modelContext.withParent(parent).withId(indexingCluster.getSubId()));
indexingClusterModel.setCluster(indexingCluster);
modelContext.getConfigModelRepoAdder().add(indexingClusterModel);
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java
index cce367ed611..f15ba547894 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/content/cluster/ContentCluster.java
@@ -443,8 +443,7 @@ public class ContentCluster extends AbstractConfigProducer implements
ContainerCluster clusterControllers = new ContainerCluster(parent,
name,
name,
- new ClusterControllerClusterVerifier(),
- RankProfileList.empty);
+ new ClusterControllerClusterVerifier());
List<Container> containers = new ArrayList<>();
// Add a cluster controller on each config server (there is always at least one).
if (clusterControllers.getContainers().isEmpty()) {
diff --git a/config-model/src/main/resources/schema/containercluster.rnc b/config-model/src/main/resources/schema/containercluster.rnc
index a8c763e43b7..52d71574f82 100644
--- a/config-model/src/main/resources/schema/containercluster.rnc
+++ b/config-model/src/main/resources/schema/containercluster.rnc
@@ -16,6 +16,7 @@ ContainerServices =
SearchInContainer? &
DocprocInContainer? &
ProcessingInContainer? &
+ ModelEvaluation? &
DocumentApi? &
Components* &
Component* &
@@ -85,6 +86,10 @@ SecretStore = element secret-store {
} +
}
+ModelEvaluation = element model-evaluation {
+ empty
+}
+
# REST-API:
RestApi = element rest-api {
diff --git a/config-model/src/test/cfg/application/ml_serving/services.xml b/config-model/src/test/cfg/application/ml_serving/services.xml
index 42528336bc5..41f44e04c99 100644
--- a/config-model/src/test/cfg/application/ml_serving/services.xml
+++ b/config-model/src/test/cfg/application/ml_serving/services.xml
@@ -3,6 +3,7 @@
<services version="1.0">
<container version="1.0">
+ <model-evaluation/>
<nodes>
<node hostalias="node1" />
</nodes>
diff --git a/config-model/src/test/cfg/application/ml_serving_name_collision/services.xml b/config-model/src/test/cfg/application/ml_serving_name_collision/services.xml
index 42528336bc5..41f44e04c99 100644
--- a/config-model/src/test/cfg/application/ml_serving_name_collision/services.xml
+++ b/config-model/src/test/cfg/application/ml_serving_name_collision/services.xml
@@ -3,6 +3,7 @@
<services version="1.0">
<container version="1.0">
+ <model-evaluation/>
<nodes>
<node hostalias="node1" />
</nodes>
diff --git a/config-model/src/test/cfg/application/ml_serving_not_activated/models/xgboost.2.2.json b/config-model/src/test/cfg/application/ml_serving_not_activated/models/xgboost.2.2.json
new file mode 100644
index 00000000000..f8949b47e52
--- /dev/null
+++ b/config-model/src/test/cfg/application/ml_serving_not_activated/models/xgboost.2.2.json
@@ -0,0 +1,19 @@
+[
+ { "nodeid": 0, "depth": 0, "split": "f29", "split_condition": -0.1234567, "yes": 1, "no": 2, "missing": 1, "children": [
+ { "nodeid": 1, "depth": 1, "split": "f56", "split_condition": -0.242398, "yes": 3, "no": 4, "missing": 3, "children": [
+ { "nodeid": 3, "leaf": 1.71218 },
+ { "nodeid": 4, "leaf": -1.70044 }
+ ]},
+ { "nodeid": 2, "depth": 1, "split": "f109", "split_condition": 0.8723473, "yes": 5, "no": 6, "missing": 5, "children": [
+ { "nodeid": 5, "leaf": -1.94071 },
+ { "nodeid": 6, "leaf": 1.85965 }
+ ]}
+ ]},
+ { "nodeid": 0, "depth": 0, "split": "f60", "split_condition": -0.482947, "yes": 1, "no": 2, "missing": 1, "children": [
+ { "nodeid": 1, "depth": 1, "split": "f29", "split_condition": -4.2387498, "yes": 3, "no": 4, "missing": 3, "children": [
+ { "nodeid": 3, "leaf": 0.784718 },
+ { "nodeid": 4, "leaf": -0.96853 }
+ ]},
+ { "nodeid": 2, "leaf": -6.23624 }
+ ]}
+] \ No newline at end of file
diff --git a/config-model/src/test/cfg/application/ml_serving_not_activated/services.xml b/config-model/src/test/cfg/application/ml_serving_not_activated/services.xml
new file mode 100644
index 00000000000..9d8b7a81201
--- /dev/null
+++ b/config-model/src/test/cfg/application/ml_serving_not_activated/services.xml
@@ -0,0 +1,13 @@
+<?xml version="1.0" encoding="utf-8" ?>
+<!-- Copyright 2018 Yahoo Holdings. Licensed under the terms of the Apache 2.0 license. See LICENSE in the project root. -->
+<services version="1.0">
+
+ <container version="1.0">
+ <!-- No <model-evaluation/> tag -->
+ <nodes>
+ <node hostalias="node1" />
+ </nodes>
+
+ </container>
+
+</services>
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java
index 850fd91e151..756a0c53485 100755
--- a/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/container/ContainerClusterTest.java
@@ -81,7 +81,7 @@ public class ContainerClusterTest {
.zone(new Zone(SystemName.cd, Environment.test, RegionName.from("some-region")))
.build();
MockRoot root = new MockRoot("foo", state);
- ContainerCluster cluster = new ContainerCluster(root, "container0", "container1", RankProfileList.empty);
+ ContainerCluster cluster = new ContainerCluster(root, "container0", "container1");
ConfigserverConfig.Builder builder = new ConfigserverConfig.Builder();
cluster.getConfig(builder);
ConfigserverConfig config = new ConfigserverConfig(builder);
@@ -112,8 +112,8 @@ public class ContainerClusterTest {
MockRoot root = new MockRoot("foo", state);
ContainerCluster cluster = extraComponents.isPresent()
- ? new ContainerCluster(root, "container0", "container1", extraComponents.get(), RankProfileList.empty)
- : new ContainerCluster(root, "container0", "container1", RankProfileList.empty);
+ ? new ContainerCluster(root, "container0", "container1", extraComponents.get())
+ : new ContainerCluster(root, "container0", "container1");
if (isCombinedCluster)
cluster.setHostClusterId("test-content-cluster");
cluster.setMemoryPercentage(memoryPercentage);
@@ -258,7 +258,7 @@ public class ContainerClusterTest {
public void requireThatRoutingProviderIsDisabledForNonHosted() {
DeployState state = new DeployState.Builder().properties(new DeployProperties.Builder().hostedVespa(false).build()).build();
MockRoot root = new MockRoot("foo", state);
- ContainerCluster cluster = new ContainerCluster(root, "container0", "container1", RankProfileList.empty);
+ ContainerCluster cluster = new ContainerCluster(root, "container0", "container1");
RoutingProviderConfig.Builder builder = new RoutingProviderConfig.Builder();
cluster.getConfig(builder);
RoutingProviderConfig config = new RoutingProviderConfig(builder);
@@ -282,7 +282,7 @@ public class ContainerClusterTest {
}
private static ContainerCluster newContainerCluster() {
- ContainerCluster cluster = new ContainerCluster(null, "subId", "name", RankProfileList.empty);
+ ContainerCluster cluster = new ContainerCluster(null, "subId", "name");
addContainer(cluster, "c1", "host-c1");
addContainer(cluster, "c2", "host-c2");
return cluster;
diff --git a/config-model/src/test/java/com/yahoo/vespa/model/ml/ModelEvaluationTest.java b/config-model/src/test/java/com/yahoo/vespa/model/ml/ModelEvaluationTest.java
index 35e6642d7cb..b7b3fc99e20 100644
--- a/config-model/src/test/java/com/yahoo/vespa/model/ml/ModelEvaluationTest.java
+++ b/config-model/src/test/java/com/yahoo/vespa/model/ml/ModelEvaluationTest.java
@@ -4,6 +4,7 @@ package com.yahoo.vespa.model.ml;
import ai.vespa.models.evaluation.Model;
import ai.vespa.models.evaluation.ModelsEvaluator;
import ai.vespa.models.evaluation.RankProfilesConfigImporter;
+import com.yahoo.component.ComponentId;
import com.yahoo.config.FileReference;
import com.yahoo.config.application.api.ApplicationPackage;
import com.yahoo.filedistribution.fileacquirer.FileAcquirer;
@@ -16,7 +17,6 @@ import com.yahoo.vespa.config.search.RankProfilesConfig;
import com.yahoo.vespa.config.search.core.RankingConstantsConfig;
import com.yahoo.vespa.model.VespaModel;
import com.yahoo.vespa.model.container.ContainerCluster;
-import org.junit.After;
import org.junit.Test;
import java.io.IOException;
@@ -25,6 +25,7 @@ import java.util.stream.Collectors;
import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertNotNull;
+import static org.junit.Assert.assertNull;
import static org.junit.Assert.assertTrue;
/**
@@ -32,21 +33,15 @@ import static org.junit.Assert.assertTrue;
*/
public class ModelEvaluationTest {
- private static final Path appDir = Path.fromString("src/test/cfg/application/ml_serving");
-
- @After
- public void removeGeneratedModelFiles() {
- IOUtils.recursiveDeleteDir(appDir.append(ApplicationPackage.MODELS_GENERATED_DIR).toFile());
- }
-
@Test
- public void testMl_ServingApplication() throws IOException {
- ImportedModelTester tester = new ImportedModelTester("ml_serving", appDir);
- assertHasMlModels(tester.createVespaModel());
-
- // At this point the expression is stored - copy application to another location which do not have a models dir
+ public void testMl_serving() throws IOException {
+ Path appDir = Path.fromString("src/test/cfg/application/ml_serving");
Path storedAppDir = appDir.append("copy");
try {
+ ImportedModelTester tester = new ImportedModelTester("ml_serving", appDir);
+ assertHasMlModels(tester.createVespaModel());
+
+ // At this point the expression is stored - copy application to another location which do not have a models dir
storedAppDir.toFile().mkdirs();
IOUtils.copy(appDir.append("services.xml").toString(), storedAppDir.append("services.xml").toString());
IOUtils.copyDirectory(appDir.append(ApplicationPackage.MODELS_GENERATED_DIR).toFile(),
@@ -55,12 +50,35 @@ public class ModelEvaluationTest {
assertHasMlModels(storedTester.createVespaModel());
}
finally {
+ IOUtils.recursiveDeleteDir(appDir.append(ApplicationPackage.MODELS_GENERATED_DIR).toFile());
IOUtils.recursiveDeleteDir(storedAppDir.toFile());
}
}
+ /** Tests that we do not load models (which will waste memory) when not requested */
+ @Test
+ public void testMl_serving_not_activated() throws IOException {
+ Path appDir = Path.fromString("src/test/cfg/application/ml_serving_not_activated");
+ try {
+ ImportedModelTester tester = new ImportedModelTester("ml_serving", appDir);
+ VespaModel model = tester.createVespaModel();
+ ContainerCluster cluster = model.getContainerClusters().get("container");
+ assertNull(cluster.getComponentsMap().get(new ComponentId(ModelsEvaluator.class.getName())));
+
+ RankProfilesConfig.Builder b = new RankProfilesConfig.Builder();
+ cluster.getConfig(b);
+ RankProfilesConfig config = new RankProfilesConfig(b);
+
+ assertEquals(0, config.rankprofile().size());
+ }
+ finally {
+ IOUtils.recursiveDeleteDir(appDir.append(ApplicationPackage.MODELS_GENERATED_DIR).toFile());
+ }
+ }
+
private void assertHasMlModels(VespaModel model) {
ContainerCluster cluster = model.getContainerClusters().get("container");
+ assertNotNull(cluster.getComponentsMap().get(new ComponentId(ModelsEvaluator.class.getName())));
RankProfilesConfig.Builder b = new RankProfilesConfig.Builder();
cluster.getConfig(b);