summaryrefslogtreecommitdiffstats
path: root/config-model/src/main/java/com/yahoo
diff options
context:
space:
mode:
authorHenning Baldersheim <balder@yahoo-inc.com>2021-09-12 17:07:25 +0200
committerGitHub <noreply@github.com>2021-09-12 17:07:25 +0200
commite46ee256cdd3f996c9d5c034317f672383ff2fa1 (patch)
treea45e83d87644aae2c9f41a7bb475918883e25ffe /config-model/src/main/java/com/yahoo
parent302d4358bdb28ab1f2ebfff20f1cafb2d04f8835 (diff)
Revert "Revert "Balder/wire executor to ml model importing""
Diffstat (limited to 'config-model/src/main/java/com/yahoo')
-rw-r--r--config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java7
-rw-r--r--config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java42
2 files changed, 33 insertions, 16 deletions
diff --git a/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java b/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java
index 249ca71117a..13769be9ec1 100644
--- a/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java
+++ b/config-model/src/main/java/com/yahoo/config/model/deploy/DeployState.java
@@ -145,7 +145,7 @@ public class DeployState implements ConfigDefinitionStore {
this.zone = zone;
this.queryProfiles = queryProfiles; // TODO: Remove this by seeing how pagetemplates are propagated
this.semanticRules = semanticRules; // TODO: Remove this by seeing how pagetemplates are propagated
- this.importedModels = importMlModels(applicationPackage, modelImporters, deployLogger);
+ this.importedModels = importMlModels(applicationPackage, modelImporters, deployLogger, executor);
this.validationOverrides = applicationPackage.getValidationOverrides().map(ValidationOverrides::fromXml)
.orElse(ValidationOverrides.empty);
@@ -211,9 +211,10 @@ public class DeployState implements ConfigDefinitionStore {
private static ImportedMlModels importMlModels(ApplicationPackage applicationPackage,
Collection<MlModelImporter> modelImporters,
- DeployLogger deployLogger) {
+ DeployLogger deployLogger,
+ ExecutorService executor) {
File importFrom = applicationPackage.getFileReference(ApplicationPackage.MODELS_DIR);
- ImportedMlModels importedModels = new ImportedMlModels(importFrom, modelImporters);
+ ImportedMlModels importedModels = new ImportedMlModels(importFrom, executor, modelImporters);
for (var entry : importedModels.getSkippedModels().entrySet()) {
deployLogger.logApplicationPackage(Level.WARNING, "Skipping import of model " + entry.getKey() + " as an exception " +
"occurred during import. Error: " + entry.getValue());
diff --git a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
index 3f1cf130aff..c6c2fea5900 100644
--- a/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
+++ b/config-model/src/main/java/com/yahoo/vespa/model/VespaModel.java
@@ -2,7 +2,6 @@
package com.yahoo.vespa.model;
import ai.vespa.rankingexpression.importer.configmodelview.ImportedMlModel;
-import ai.vespa.rankingexpression.importer.configmodelview.ImportedMlModels;
import com.yahoo.collections.Pair;
import com.yahoo.component.Version;
import com.yahoo.config.ConfigInstance;
@@ -78,6 +77,8 @@ import java.util.Map;
import java.util.Objects;
import java.util.Optional;
import java.util.Set;
+import java.util.concurrent.ExecutionException;
+import java.util.concurrent.Future;
import java.util.logging.Level;
import java.util.logging.Logger;
import java.util.stream.Collectors;
@@ -184,8 +185,7 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri
VespaModelBuilder builder = new VespaDomBuilder();
root = builder.getRoot(VespaModel.ROOT_CONFIGID, deployState, this);
- createGlobalRankProfiles(deployState.getDeployLogger(), deployState.getImportedModels(),
- deployState.rankProfileRegistry(), deployState.getQueryProfiles());
+ createGlobalRankProfiles(deployState);
rankProfileList = new RankProfileList(null, // null search -> global
rankingConstants,
largeRankExpressions,
@@ -291,18 +291,24 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri
* Creates a rank profile not attached to any search definition, for each imported model in the application package,
* and adds it to the given rank profile registry.
*/
- private void createGlobalRankProfiles(DeployLogger deployLogger, ImportedMlModels importedModels,
- RankProfileRegistry rankProfileRegistry,
- QueryProfiles queryProfiles) {
- if ( ! importedModels.all().isEmpty()) { // models/ directory is available
- for (ImportedMlModel model : importedModels.all()) {
+ private void createGlobalRankProfiles(DeployState deployState) {
+ var importedModels = deployState.getImportedModels().all();
+ DeployLogger deployLogger = deployState.getDeployLogger();
+ RankProfileRegistry rankProfileRegistry = deployState.rankProfileRegistry();
+ QueryProfiles queryProfiles = deployState.getQueryProfiles();
+ List <Future<ConvertedModel>> futureModels = new ArrayList<>();
+ if ( ! importedModels.isEmpty()) { // models/ directory is available
+ for (ImportedMlModel model : importedModels) {
// Due to automatic naming not guaranteeing unique names, there must be a 1-1 between OnnxModels and global RankProfiles.
OnnxModels onnxModels = onnxModelInfoFromSource(model);
RankProfile profile = new RankProfile(model.name(), this, deployLogger, rankProfileRegistry, onnxModels);
rankProfileRegistry.add(profile);
- ConvertedModel convertedModel = ConvertedModel.fromSource(new ModelName(model.name()),
- model.name(), profile, queryProfiles.getRegistry(), model);
- convertedModel.expressions().values().forEach(f -> profile.addFunction(f, false));
+ futureModels.add(deployState.getExecutor().submit(() -> {
+ ConvertedModel convertedModel = ConvertedModel.fromSource(new ModelName(model.name()),
+ model.name(), profile, queryProfiles.getRegistry(), model);
+ convertedModel.expressions().values().forEach(f -> profile.addFunction(f, false));
+ return convertedModel;
+ }));
}
}
else { // generated and stored model information may be available instead
@@ -314,8 +320,18 @@ public final class VespaModel extends AbstractConfigProducerRoot implements Seri
OnnxModels onnxModels = onnxModelInfoFromStore(modelName);
RankProfile profile = new RankProfile(modelName, this, deployLogger, rankProfileRegistry, onnxModels);
rankProfileRegistry.add(profile);
- ConvertedModel convertedModel = ConvertedModel.fromStore(new ModelName(modelName), modelName, profile);
- convertedModel.expressions().values().forEach(f -> profile.addFunction(f, false));
+ futureModels.add(deployState.getExecutor().submit(() -> {
+ ConvertedModel convertedModel = ConvertedModel.fromStore(new ModelName(modelName), modelName, profile);
+ convertedModel.expressions().values().forEach(f -> profile.addFunction(f, false));
+ return convertedModel;
+ }));
+ }
+ }
+ for (var futureConvertedModel : futureModels) {
+ try {
+ futureConvertedModel.get();
+ } catch (ExecutionException |InterruptedException e) {
+ throw new RuntimeException(e);
}
}
new Processing().processRankProfiles(deployLogger, rankProfileRegistry, queryProfiles, true, false);