Skip to content

Commit d839e6b

Browse files
authored
[ML][Inference] Adding inference ingest processor (#47859)
* [ML][Inference] Adding ingest processor * optionally including tag in model metadata injection in processor * fixing test * addressing PR comments * adding comment
1 parent 8ea0c42 commit d839e6b

File tree

15 files changed

+1302
-24
lines changed

15 files changed

+1302
-24
lines changed

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/action/InferModelAction.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -27,7 +27,7 @@
2727
public class InferModelAction extends ActionType<InferModelAction.Response> {
2828

2929
public static final InferModelAction INSTANCE = new InferModelAction();
30-
public static final String NAME = "cluster:admin/xpack/ml/infer";
30+
public static final String NAME = "cluster:admin/xpack/ml/inference/infer";
3131

3232
private InferModelAction() {
3333
super(NAME, Response::new);

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/trainedmodel/ClassificationConfig.java

Lines changed: 19 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,24 +5,38 @@
55
*/
66
package org.elasticsearch.xpack.core.ml.inference.trainedmodel;
77

8+
import org.elasticsearch.Version;
89
import org.elasticsearch.common.ParseField;
910
import org.elasticsearch.common.io.stream.StreamInput;
1011
import org.elasticsearch.common.io.stream.StreamOutput;
1112
import org.elasticsearch.common.xcontent.XContentBuilder;
13+
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
1214

1315
import java.io.IOException;
16+
import java.util.HashMap;
17+
import java.util.Map;
1418
import java.util.Objects;
1519

1620
public class ClassificationConfig implements InferenceConfig {
1721

1822
public static final String NAME = "classification";
1923

2024
public static final ParseField NUM_TOP_CLASSES = new ParseField("num_top_classes");
25+
private static final Version MIN_SUPPORTED_VERSION = Version.V_8_0_0;
2126

2227
public static ClassificationConfig EMPTY_PARAMS = new ClassificationConfig(0);
2328

2429
private final int numTopClasses;
2530

31+
public static ClassificationConfig fromMap(Map<String, Object> map) {
32+
Map<String, Object> options = new HashMap<>(map);
33+
Integer numTopClasses = (Integer)options.remove(NUM_TOP_CLASSES.getPreferredName());
34+
if (options.isEmpty() == false) {
35+
throw ExceptionsHelper.badRequestException("Unrecognized fields {}.", options.keySet());
36+
}
37+
return new ClassificationConfig(numTopClasses);
38+
}
39+
2640
public ClassificationConfig(Integer numTopClasses) {
2741
this.numTopClasses = numTopClasses == null ? 0 : numTopClasses;
2842
}
@@ -78,4 +92,9 @@ public boolean isTargetTypeSupported(TargetType targetType) {
7892
return TargetType.CLASSIFICATION.equals(targetType);
7993
}
8094

95+
@Override
96+
public Version getMinimalSupportedVersion() {
97+
return MIN_SUPPORTED_VERSION;
98+
}
99+
81100
}

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/trainedmodel/InferenceConfig.java

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package org.elasticsearch.xpack.core.ml.inference.trainedmodel;
77

8+
import org.elasticsearch.Version;
89
import org.elasticsearch.common.io.stream.NamedWriteable;
910
import org.elasticsearch.xpack.core.ml.utils.NamedXContentObject;
1011

@@ -13,4 +14,8 @@ public interface InferenceConfig extends NamedXContentObject, NamedWriteable {
1314

1415
boolean isTargetTypeSupported(TargetType targetType);
1516

17+
/**
18+
* All nodes in the cluster must be at least this version
19+
*/
20+
Version getMinimalSupportedVersion();
1621
}

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/trainedmodel/RegressionConfig.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,16 +5,27 @@
55
*/
66
package org.elasticsearch.xpack.core.ml.inference.trainedmodel;
77

8+
import org.elasticsearch.Version;
89
import org.elasticsearch.common.io.stream.StreamInput;
910
import org.elasticsearch.common.io.stream.StreamOutput;
1011
import org.elasticsearch.common.xcontent.XContentBuilder;
12+
import org.elasticsearch.xpack.core.ml.utils.ExceptionsHelper;
1113

1214
import java.io.IOException;
15+
import java.util.Map;
1316
import java.util.Objects;
1417

1518
public class RegressionConfig implements InferenceConfig {
1619

1720
public static final String NAME = "regression";
21+
private static final Version MIN_SUPPORTED_VERSION = Version.V_8_0_0;
22+
23+
public static RegressionConfig fromMap(Map<String, Object> map) {
24+
if (map.isEmpty() == false) {
25+
throw ExceptionsHelper.badRequestException("Unrecognized fields {}.", map.keySet());
26+
}
27+
return new RegressionConfig();
28+
}
1829

1930
public RegressionConfig() {
2031
}
@@ -61,4 +72,9 @@ public boolean isTargetTypeSupported(TargetType targetType) {
6172
return TargetType.REGRESSION.equals(targetType);
6273
}
6374

75+
@Override
76+
public Version getMinimalSupportedVersion() {
77+
return MIN_SUPPORTED_VERSION;
78+
}
79+
6480
}

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/inference/trainedmodel/ensemble/NullInferenceConfig.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,6 +5,7 @@
55
*/
66
package org.elasticsearch.xpack.core.ml.inference.trainedmodel.ensemble;
77

8+
import org.elasticsearch.Version;
89
import org.elasticsearch.common.io.stream.StreamOutput;
910
import org.elasticsearch.common.xcontent.XContentBuilder;
1011
import org.elasticsearch.xpack.core.ml.inference.trainedmodel.InferenceConfig;
@@ -26,6 +27,11 @@ public boolean isTargetTypeSupported(TargetType targetType) {
2627
return true;
2728
}
2829

30+
@Override
31+
public Version getMinimalSupportedVersion() {
32+
return Version.CURRENT;
33+
}
34+
2935
@Override
3036
public String getWriteableName() {
3137
return "null";

x-pack/plugin/core/src/main/java/org/elasticsearch/xpack/core/ml/job/messages/Messages.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -85,6 +85,8 @@ public final class Messages {
8585
public static final String INFERENCE_FAILED_TO_SERIALIZE_MODEL =
8686
"Failed to serialize the trained model [{0}] for storage";
8787
public static final String INFERENCE_NOT_FOUND = "Could not find trained model [{0}]";
88+
public static final String INFERENCE_CONFIG_NOT_SUPPORTED_ON_VERSION =
89+
"Configuration [{0}] requires minimum node version [{1}] (current minimum node version [{2}]";
8890

8991
public static final String JOB_AUDIT_DATAFEED_DATA_SEEN_AGAIN = "Datafeed has started retrieving data again";
9092
public static final String JOB_AUDIT_CREATED = "Job created";

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/trainedmodel/ClassificationConfigTests.java

Lines changed: 20 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,35 @@
55
*/
66
package org.elasticsearch.xpack.core.ml.inference.trainedmodel;
77

8+
import org.elasticsearch.ElasticsearchException;
89
import org.elasticsearch.common.io.stream.Writeable;
910
import org.elasticsearch.test.AbstractWireSerializingTestCase;
1011

12+
import java.util.Collections;
13+
14+
import static org.hamcrest.Matchers.equalTo;
15+
1116
public class ClassificationConfigTests extends AbstractWireSerializingTestCase<ClassificationConfig> {
1217

1318
public static ClassificationConfig randomClassificationConfig() {
1419
return new ClassificationConfig(randomBoolean() ? null : randomIntBetween(-1, 10));
1520
}
1621

22+
public void testFromMap() {
23+
ClassificationConfig expected = new ClassificationConfig(0);
24+
assertThat(ClassificationConfig.fromMap(Collections.emptyMap()), equalTo(expected));
25+
26+
expected = new ClassificationConfig(3);
27+
assertThat(ClassificationConfig.fromMap(Collections.singletonMap(ClassificationConfig.NUM_TOP_CLASSES.getPreferredName(), 3)),
28+
equalTo(expected));
29+
}
30+
31+
public void testFromMapWithUnknownField() {
32+
ElasticsearchException ex = expectThrows(ElasticsearchException.class,
33+
() -> ClassificationConfig.fromMap(Collections.singletonMap("some_key", 1)));
34+
assertThat(ex.getMessage(), equalTo("Unrecognized fields [some_key]."));
35+
}
36+
1737
@Override
1838
protected ClassificationConfig createTestInstance() {
1939
return randomClassificationConfig();

x-pack/plugin/core/src/test/java/org/elasticsearch/xpack/core/ml/inference/trainedmodel/RegressionConfigTests.java

Lines changed: 16 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -5,15 +5,31 @@
55
*/
66
package org.elasticsearch.xpack.core.ml.inference.trainedmodel;
77

8+
import org.elasticsearch.ElasticsearchException;
89
import org.elasticsearch.common.io.stream.Writeable;
910
import org.elasticsearch.test.AbstractWireSerializingTestCase;
1011

12+
import java.util.Collections;
13+
14+
import static org.hamcrest.Matchers.equalTo;
15+
1116
public class RegressionConfigTests extends AbstractWireSerializingTestCase<RegressionConfig> {
1217

1318
public static RegressionConfig randomRegressionConfig() {
1419
return new RegressionConfig();
1520
}
1621

22+
public void testFromMap() {
23+
RegressionConfig expected = new RegressionConfig();
24+
assertThat(RegressionConfig.fromMap(Collections.emptyMap()), equalTo(expected));
25+
}
26+
27+
public void testFromMapWithUnknownField() {
28+
ElasticsearchException ex = expectThrows(ElasticsearchException.class,
29+
() -> RegressionConfig.fromMap(Collections.singletonMap("some_key", 1)));
30+
assertThat(ex.getMessage(), equalTo("Unrecognized fields [some_key]."));
31+
}
32+
1733
@Override
1834
protected RegressionConfig createTestInstance() {
1935
return randomRegressionConfig();

0 commit comments

Comments
 (0)