Skip to content

Commit 86542f0

Browse files
authored
[ML] Fix infer on and elasticsearch service endpoint created with a deployment id (#121428) (#121438)
Fixes a bug where the deployment Id was lost creating the text embedding model configuration
1 parent cfcd1c6 commit 86542f0

14 files changed

+133
-102
lines changed

docs/changelog/121428.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 121428
2+
summary: Fix infer on and elasticsearch service endpoint created with a deployment
3+
id
4+
area: Machine Learning
5+
type: bug
6+
issues: []

x-pack/plugin/inference/qa/inference-service-tests/src/javaRestTest/java/org/elasticsearch/xpack/inference/CreateFromDeploymentIT.java

Lines changed: 27 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -40,6 +40,14 @@ public void testAttachToDeployment() throws IOException {
4040
is(Map.of("num_allocations", 1, "num_threads", 1, "model_id", "attach_to_deployment", "deployment_id", "existing_deployment"))
4141
);
4242

43+
var getModel = getModel(inferenceId);
44+
serviceSettings = getModel.get("service_settings");
45+
assertThat(
46+
getModel.toString(),
47+
serviceSettings,
48+
is(Map.of("num_allocations", 1, "num_threads", 1, "model_id", "attach_to_deployment", "deployment_id", "existing_deployment"))
49+
);
50+
4351
var results = infer(inferenceId, List.of("washing machine"));
4452
assertNotNull(results.get("sparse_embedding"));
4553

@@ -98,6 +106,25 @@ public void testAttachWithModelId() throws IOException {
98106
)
99107
);
100108

109+
var getModel = getModel(inferenceId);
110+
serviceSettings = getModel.get("service_settings");
111+
assertThat(
112+
getModel.toString(),
113+
serviceSettings,
114+
is(
115+
Map.of(
116+
"num_allocations",
117+
1,
118+
"num_threads",
119+
1,
120+
"model_id",
121+
"attach_with_model_id",
122+
"deployment_id",
123+
"existing_deployment_with_model_id"
124+
)
125+
)
126+
);
127+
101128
var results = infer(inferenceId, List.of("washing machine"));
102129
assertNotNull(results.get("sparse_embedding"));
103130

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/CustomElandInternalServiceSettings.java

Lines changed: 0 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@
88
package org.elasticsearch.xpack.inference.services.elasticsearch;
99

1010
import org.elasticsearch.common.io.stream.StreamInput;
11-
import org.elasticsearch.xpack.core.ml.inference.assignment.AdaptiveAllocationsSettings;
1211

1312
import java.io.IOException;
1413

@@ -20,15 +19,6 @@ public CustomElandInternalServiceSettings(ElasticsearchInternalServiceSettings o
2019
super(other);
2120
}
2221

23-
public CustomElandInternalServiceSettings(
24-
Integer numAllocations,
25-
int numThreads,
26-
String modelId,
27-
AdaptiveAllocationsSettings adaptiveAllocationsSettings
28-
) {
29-
super(numAllocations, numThreads, modelId, adaptiveAllocationsSettings);
30-
}
31-
3222
public CustomElandInternalServiceSettings(StreamInput in) throws IOException {
3323
super(in);
3424
}

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/CustomElandInternalTextEmbeddingServiceSettings.java

Lines changed: 6 additions & 20 deletions
Original file line numberDiff line numberDiff line change
@@ -11,6 +11,7 @@
1111
import org.elasticsearch.common.ValidationException;
1212
import org.elasticsearch.common.io.stream.StreamInput;
1313
import org.elasticsearch.common.io.stream.StreamOutput;
14+
import org.elasticsearch.core.Nullable;
1415
import org.elasticsearch.index.mapper.vectors.DenseVectorFieldMapper;
1516
import org.elasticsearch.inference.ModelConfigurations;
1617
import org.elasticsearch.inference.SimilarityMeasure;
@@ -105,33 +106,17 @@ private static CommonFields commonFieldsFromMap(Map<String, Object> map, Validat
105106
private final SimilarityMeasure similarityMeasure;
106107
private final DenseVectorFieldMapper.ElementType elementType;
107108

108-
public CustomElandInternalTextEmbeddingServiceSettings(
109-
int numAllocations,
110-
int numThreads,
111-
String modelId,
112-
AdaptiveAllocationsSettings adaptiveAllocationsSettings
113-
) {
114-
this(
115-
numAllocations,
116-
numThreads,
117-
modelId,
118-
adaptiveAllocationsSettings,
119-
null,
120-
SimilarityMeasure.COSINE,
121-
DenseVectorFieldMapper.ElementType.FLOAT
122-
);
123-
}
124-
125-
public CustomElandInternalTextEmbeddingServiceSettings(
109+
CustomElandInternalTextEmbeddingServiceSettings(
126110
int numAllocations,
127111
int numThreads,
128112
String modelId,
129113
AdaptiveAllocationsSettings adaptiveAllocationsSettings,
114+
@Nullable String deploymentId,
130115
Integer dimensions,
131116
SimilarityMeasure similarityMeasure,
132117
DenseVectorFieldMapper.ElementType elementType
133118
) {
134-
super(numAllocations, numThreads, modelId, adaptiveAllocationsSettings);
119+
super(numAllocations, numThreads, modelId, adaptiveAllocationsSettings, deploymentId);
135120
this.dimensions = dimensions;
136121
this.similarityMeasure = Objects.requireNonNull(similarityMeasure);
137122
this.elementType = Objects.requireNonNull(elementType);
@@ -159,7 +144,8 @@ private CustomElandInternalTextEmbeddingServiceSettings(CommonFields commonField
159144
commonFields.internalServiceSettings.getNumAllocations(),
160145
commonFields.internalServiceSettings.getNumThreads(),
161146
commonFields.internalServiceSettings.modelId(),
162-
commonFields.internalServiceSettings.getAdaptiveAllocationsSettings()
147+
commonFields.internalServiceSettings.getAdaptiveAllocationsSettings(),
148+
commonFields.internalServiceSettings.getDeploymentId()
163149
);
164150
this.dimensions = dimensions;
165151
similarityMeasure = commonFields.similarityMeasure;

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticRerankerServiceSettings.java

Lines changed: 8 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -14,21 +14,27 @@
1414
import java.io.IOException;
1515
import java.util.Map;
1616

17+
import static org.elasticsearch.xpack.inference.services.elasticsearch.ElasticsearchInternalService.RERANKER_ID;
18+
1719
public class ElasticRerankerServiceSettings extends ElasticsearchInternalServiceSettings {
1820

1921
public static final String NAME = "elastic_reranker_service_settings";
2022

23+
public static ElasticRerankerServiceSettings defaultEndpointSettings() {
24+
return new ElasticRerankerServiceSettings(null, 1, RERANKER_ID, new AdaptiveAllocationsSettings(Boolean.TRUE, 0, 32));
25+
}
26+
2127
public ElasticRerankerServiceSettings(ElasticsearchInternalServiceSettings other) {
2228
super(other);
2329
}
2430

25-
public ElasticRerankerServiceSettings(
31+
private ElasticRerankerServiceSettings(
2632
Integer numAllocations,
2733
int numThreads,
2834
String modelId,
2935
AdaptiveAllocationsSettings adaptiveAllocationsSettings
3036
) {
31-
super(numAllocations, numThreads, modelId, adaptiveAllocationsSettings);
37+
super(numAllocations, numThreads, modelId, adaptiveAllocationsSettings, null);
3238
}
3339

3440
public ElasticRerankerServiceSettings(StreamInput in) throws IOException {

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticsearchInternalService.java

Lines changed: 4 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -41,7 +41,6 @@
4141
import org.elasticsearch.xpack.core.ml.action.GetDeploymentStatsAction;
4242
import org.elasticsearch.xpack.core.ml.action.GetTrainedModelsAction;
4343
import org.elasticsearch.xpack.core.ml.action.InferModelAction;
44-
import org.elasticsearch.xpack.core.ml.inference.assignment.AdaptiveAllocationsSettings;
4544
import org.elasticsearch.xpack.core.ml.inference.assignment.AssignmentStats;
4645
import org.elasticsearch.xpack.core.ml.inference.results.ErrorInferenceResults;
4746
import org.elasticsearch.xpack.core.ml.inference.results.MlTextEmbeddingResults;
@@ -568,6 +567,7 @@ private static CustomElandEmbeddingModel updateModelWithEmbeddingDetails(CustomE
568567
model.getServiceSettings().getNumThreads(),
569568
model.getServiceSettings().modelId(),
570569
model.getServiceSettings().getAdaptiveAllocationsSettings(),
570+
model.getServiceSettings().getDeploymentId(),
571571
embeddingSize,
572572
model.getServiceSettings().similarity(),
573573
model.getServiceSettings().elementType()
@@ -914,32 +914,22 @@ private List<Model> defaultConfigs(boolean useLinuxOptimizedModel) {
914914
DEFAULT_ELSER_ID,
915915
TaskType.SPARSE_EMBEDDING,
916916
NAME,
917-
new ElserInternalServiceSettings(
918-
null,
919-
1,
920-
useLinuxOptimizedModel ? ELSER_V2_MODEL_LINUX_X86 : ELSER_V2_MODEL,
921-
new AdaptiveAllocationsSettings(Boolean.TRUE, 0, 32)
922-
),
917+
ElserInternalServiceSettings.defaultEndpointSettings(useLinuxOptimizedModel),
923918
ElserMlNodeTaskSettings.DEFAULT,
924919
ChunkingSettingsBuilder.DEFAULT_SETTINGS
925920
);
926921
var defaultE5 = new MultilingualE5SmallModel(
927922
DEFAULT_E5_ID,
928923
TaskType.TEXT_EMBEDDING,
929924
NAME,
930-
new MultilingualE5SmallInternalServiceSettings(
931-
null,
932-
1,
933-
useLinuxOptimizedModel ? MULTILINGUAL_E5_SMALL_MODEL_ID_LINUX_X86 : MULTILINGUAL_E5_SMALL_MODEL_ID,
934-
new AdaptiveAllocationsSettings(Boolean.TRUE, 0, 32)
935-
),
925+
MultilingualE5SmallInternalServiceSettings.defaultEndpointSettings(useLinuxOptimizedModel),
936926
ChunkingSettingsBuilder.DEFAULT_SETTINGS
937927
);
938928
var defaultRerank = new ElasticRerankerModel(
939929
DEFAULT_RERANK_ID,
940930
TaskType.RERANK,
941931
NAME,
942-
new ElasticRerankerServiceSettings(null, 1, RERANKER_ID, new AdaptiveAllocationsSettings(Boolean.TRUE, 0, 32)),
932+
ElasticRerankerServiceSettings.defaultEndpointSettings(),
943933
RerankTaskSettings.DEFAULT_SETTINGS
944934
);
945935
return List.of(defaultElser, defaultE5, defaultRerank);

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElasticsearchInternalServiceSettings.java

Lines changed: 2 additions & 14 deletions
Original file line numberDiff line numberDiff line change
@@ -12,6 +12,7 @@
1212
import org.elasticsearch.common.ValidationException;
1313
import org.elasticsearch.common.io.stream.StreamInput;
1414
import org.elasticsearch.common.io.stream.StreamOutput;
15+
import org.elasticsearch.core.Nullable;
1516
import org.elasticsearch.inference.ModelConfigurations;
1617
import org.elasticsearch.inference.ServiceSettings;
1718
import org.elasticsearch.xcontent.ToXContentObject;
@@ -108,25 +109,12 @@ protected static ElasticsearchInternalServiceSettings.Builder fromMap(
108109
.setDeploymentId(deploymentId);
109110
}
110111

111-
public ElasticsearchInternalServiceSettings(
112-
Integer numAllocations,
113-
int numThreads,
114-
String modelId,
115-
AdaptiveAllocationsSettings adaptiveAllocationsSettings
116-
) {
117-
this.numAllocations = numAllocations;
118-
this.numThreads = numThreads;
119-
this.modelId = Objects.requireNonNull(modelId);
120-
this.adaptiveAllocationsSettings = adaptiveAllocationsSettings;
121-
this.deploymentId = null;
122-
}
123-
124112
public ElasticsearchInternalServiceSettings(
125113
Integer numAllocations,
126114
int numThreads,
127115
String modelId,
128116
AdaptiveAllocationsSettings adaptiveAllocationsSettings,
129-
String deploymentId
117+
@Nullable String deploymentId
130118
) {
131119
this.numAllocations = numAllocations;
132120
this.numThreads = numThreads;

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/ElserInternalServiceSettings.java

Lines changed: 12 additions & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -9,14 +9,14 @@
99

1010
import org.elasticsearch.TransportVersion;
1111
import org.elasticsearch.TransportVersions;
12-
import org.elasticsearch.common.ValidationException;
1312
import org.elasticsearch.common.io.stream.StreamInput;
1413
import org.elasticsearch.inference.MinimalServiceSettings;
1514
import org.elasticsearch.xpack.core.ml.inference.assignment.AdaptiveAllocationsSettings;
1615

1716
import java.io.IOException;
18-
import java.util.Arrays;
19-
import java.util.Map;
17+
18+
import static org.elasticsearch.xpack.inference.services.elasticsearch.ElserModels.ELSER_V2_MODEL;
19+
import static org.elasticsearch.xpack.inference.services.elasticsearch.ElserModels.ELSER_V2_MODEL_LINUX_X86;
2020

2121
public class ElserInternalServiceSettings extends ElasticsearchInternalServiceSettings {
2222

@@ -26,37 +26,26 @@ public static MinimalServiceSettings minimalServiceSettings() {
2626
return MinimalServiceSettings.sparseEmbedding();
2727
}
2828

29-
public static Builder fromRequestMap(Map<String, Object> map) {
30-
ValidationException validationException = new ValidationException();
31-
var baseSettings = ElasticsearchInternalServiceSettings.fromMap(map, validationException);
32-
33-
String modelId = baseSettings.getModelId();
34-
if (modelId != null && ElserModels.isValidModel(modelId) == false) {
35-
var ve = new ValidationException();
36-
ve.addValidationError(
37-
"Unknown ELSER model ID [" + modelId + "]. Valid models are " + Arrays.toString(ElserModels.VALID_ELSER_MODEL_IDS.toArray())
38-
);
39-
throw ve;
40-
}
41-
42-
if (validationException.validationErrors().isEmpty() == false) {
43-
throw validationException;
44-
}
45-
46-
return baseSettings;
29+
public static ElserInternalServiceSettings defaultEndpointSettings(boolean useLinuxOptimizedModel) {
30+
return new ElserInternalServiceSettings(
31+
null,
32+
1,
33+
useLinuxOptimizedModel ? ELSER_V2_MODEL_LINUX_X86 : ELSER_V2_MODEL,
34+
new AdaptiveAllocationsSettings(Boolean.TRUE, 0, 32)
35+
);
4736
}
4837

4938
public ElserInternalServiceSettings(ElasticsearchInternalServiceSettings other) {
5039
super(other);
5140
}
5241

53-
public ElserInternalServiceSettings(
42+
private ElserInternalServiceSettings(
5443
Integer numAllocations,
5544
int numThreads,
5645
String modelId,
5746
AdaptiveAllocationsSettings adaptiveAllocationsSettings
5847
) {
59-
this(new ElasticsearchInternalServiceSettings(numAllocations, numThreads, modelId, adaptiveAllocationsSettings));
48+
this(new ElasticsearchInternalServiceSettings(numAllocations, numThreads, modelId, adaptiveAllocationsSettings, null));
6049
}
6150

6251
public ElserInternalServiceSettings(StreamInput in) throws IOException {

x-pack/plugin/inference/src/main/java/org/elasticsearch/xpack/inference/services/elasticsearch/MultilingualE5SmallInternalServiceSettings.java

Lines changed: 14 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,9 @@
1818
import java.util.Arrays;
1919
import java.util.Map;
2020

21+
import static org.elasticsearch.xpack.inference.services.elasticsearch.ElasticsearchInternalService.MULTILINGUAL_E5_SMALL_MODEL_ID;
22+
import static org.elasticsearch.xpack.inference.services.elasticsearch.ElasticsearchInternalService.MULTILINGUAL_E5_SMALL_MODEL_ID_LINUX_X86;
23+
2124
public class MultilingualE5SmallInternalServiceSettings extends ElasticsearchInternalServiceSettings {
2225

2326
public static final String NAME = "multilingual_e5_small_service_settings";
@@ -29,17 +32,26 @@ public static MinimalServiceSettings minimalServiceSettings() {
2932
return MinimalServiceSettings.textEmbedding(DIMENSIONS, SIMILARITY, DenseVectorFieldMapper.ElementType.FLOAT);
3033
}
3134

35+
public static MultilingualE5SmallInternalServiceSettings defaultEndpointSettings(boolean useLinuxOptimizedModel) {
36+
return new MultilingualE5SmallInternalServiceSettings(
37+
null,
38+
1,
39+
useLinuxOptimizedModel ? MULTILINGUAL_E5_SMALL_MODEL_ID_LINUX_X86 : MULTILINGUAL_E5_SMALL_MODEL_ID,
40+
new AdaptiveAllocationsSettings(Boolean.TRUE, 0, 32)
41+
);
42+
}
43+
3244
public MultilingualE5SmallInternalServiceSettings(ElasticsearchInternalServiceSettings other) {
3345
super(other);
3446
}
3547

36-
public MultilingualE5SmallInternalServiceSettings(
48+
MultilingualE5SmallInternalServiceSettings(
3749
Integer numAllocations,
3850
int numThreads,
3951
String modelId,
4052
AdaptiveAllocationsSettings adaptiveAllocationsSettings
4153
) {
42-
super(numAllocations, numThreads, modelId, adaptiveAllocationsSettings);
54+
super(numAllocations, numThreads, modelId, adaptiveAllocationsSettings, null);
4355
}
4456

4557
public MultilingualE5SmallInternalServiceSettings(StreamInput in) throws IOException {

x-pack/plugin/inference/src/test/java/org/elasticsearch/xpack/inference/services/elasticsearch/CustomElandInternalTextEmbeddingServiceSettingsTests.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ public static CustomElandInternalTextEmbeddingServiceSettings createRandom() {
4848
numThreads,
4949
modelId,
5050
null,
51+
null,
5152
dims,
5253
similarityMeasure,
5354
elementType
@@ -86,6 +87,7 @@ public void testFromMap_Request_CreatesSettingsCorrectly() {
8687
modelId,
8788
null,
8889
null,
90+
null,
8991
SimilarityMeasure.DOT_PRODUCT,
9092
DenseVectorFieldMapper.ElementType.FLOAT
9193
)
@@ -111,6 +113,7 @@ public void testFromMap_Request_DoesNotDefaultSimilarityElementType() {
111113
modelId,
112114
null,
113115
null,
116+
null,
114117
SimilarityMeasure.COSINE,
115118
DenseVectorFieldMapper.ElementType.FLOAT
116119
)
@@ -152,6 +155,7 @@ public void testFromMap_Request_IgnoresDimensions() {
152155
modelId,
153156
null,
154157
null,
158+
null,
155159
SimilarityMeasure.DOT_PRODUCT,
156160
DenseVectorFieldMapper.ElementType.FLOAT
157161
)
@@ -192,6 +196,7 @@ public void testFromMap_Persistent_CreatesSettingsCorrectly() {
192196
numThreads,
193197
modelId,
194198
null,
199+
null,
195200
1,
196201
SimilarityMeasure.DOT_PRODUCT,
197202
DenseVectorFieldMapper.ElementType.FLOAT
@@ -206,6 +211,7 @@ public void testToXContent_WritesAllValues() throws IOException {
206211
1,
207212
"model_id",
208213
null,
214+
null,
209215
100,
210216
SimilarityMeasure.COSINE,
211217
DenseVectorFieldMapper.ElementType.BYTE

0 commit comments

Comments
 (0)