Skip to content

Commit 61e995c

Browse files
[ML] Migrate model_version to model_id when parsing persistent elser inference endpoints (elastic#124769) (elastic#124791)
* Handling model_version for prexisting endpoints * Update docs/changelog/124769.yaml
1 parent 14aa03e commit 61e995c

File tree

3 files changed

+58
-2
lines changed

3 files changed

+58
-2
lines changed

docs/changelog/124769.yaml

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,7 @@
1+
pr: 124769
2+
summary: Migrate `model_version` to `model_id` when parsing persistent elser inference
3+
endpoints
4+
area: Machine Learning
5+
type: bug
6+
issues:
7+
- 124675

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

Lines changed: 25 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -18,6 +18,7 @@
1818
import org.elasticsearch.common.settings.Settings;
1919
import org.elasticsearch.common.util.LazyInitializable;
2020
import org.elasticsearch.core.Nullable;
21+
import org.elasticsearch.core.Strings;
2122
import org.elasticsearch.core.TimeValue;
2223
import org.elasticsearch.inference.ChunkedInferenceServiceResults;
2324
import org.elasticsearch.inference.ChunkingOptions;
@@ -113,6 +114,13 @@ public class ElasticsearchInternalService extends BaseElasticsearchInternalServi
113114
private static final Logger logger = LogManager.getLogger(ElasticsearchInternalService.class);
114115
private static final DeprecationLogger DEPRECATION_LOGGER = DeprecationLogger.getLogger(ElasticsearchInternalService.class);
115116

117+
/**
118+
* Fix for https://github.com/elastic/elasticsearch/issues/124675
119+
* In 8.13.0 we transitioned from model_version to model_id. Any elser inference endpoints created prior to 8.13.0 will still use
120+
* service_settings.model_version.
121+
*/
122+
private static final String OLD_MODEL_ID_FIELD_NAME = "model_version";
123+
116124
private final Settings settings;
117125

118126
public ElasticsearchInternalService(InferenceServiceExtension.InferenceServiceFactoryContext context) {
@@ -491,14 +499,18 @@ public Model parsePersistedConfig(String inferenceEntityId, TaskType taskType, M
491499
Map<String, Object> serviceSettingsMap = removeFromMapOrThrowIfNull(config, ModelConfigurations.SERVICE_SETTINGS);
492500
Map<String, Object> taskSettingsMap = removeFromMapOrDefaultEmpty(config, ModelConfigurations.TASK_SETTINGS);
493501

502+
migrateModelVersionToModelId(serviceSettingsMap);
503+
494504
ChunkingSettings chunkingSettings = null;
495505
if (TaskType.TEXT_EMBEDDING.equals(taskType) || TaskType.SPARSE_EMBEDDING.equals(taskType)) {
496506
chunkingSettings = ChunkingSettingsBuilder.fromMap(removeFromMap(config, ModelConfigurations.CHUNKING_SETTINGS));
497507
}
498508

499509
String modelId = (String) serviceSettingsMap.get(MODEL_ID);
500510
if (modelId == null) {
501-
throw new IllegalArgumentException("Error parsing request config, model id is missing");
511+
throw new IllegalArgumentException(
512+
Strings.format("Error parsing request config, model id is missing for inference id: %s", inferenceEntityId)
513+
);
502514
}
503515

504516
if (MULTILINGUAL_E5_SMALL_VALID_IDS.contains(modelId)) {
@@ -530,6 +542,18 @@ public Model parsePersistedConfig(String inferenceEntityId, TaskType taskType, M
530542
}
531543
}
532544

545+
/**
546+
* Fix for https://github.com/elastic/elasticsearch/issues/124675
547+
* In 8.13.0 we transitioned from model_version to model_id. Any elser inference endpoints created prior to 8.13.0 will still use
548+
* service_settings.model_version. We need to look for that key and migrate it to model_id.
549+
*/
550+
private void migrateModelVersionToModelId(Map<String, Object> serviceSettingsMap) {
551+
if (serviceSettingsMap.containsKey(OLD_MODEL_ID_FIELD_NAME)) {
552+
String modelId = ServiceUtils.removeAsType(serviceSettingsMap, OLD_MODEL_ID_FIELD_NAME, String.class);
553+
serviceSettingsMap.put(ElserInternalServiceSettings.MODEL_ID, modelId);
554+
}
555+
}
556+
533557
@Override
534558
public void checkModelConfig(Model model, ActionListener<Model> listener) {
535559
if (model instanceof CustomElandEmbeddingModel elandModel && elandModel.getTaskType() == TaskType.TEXT_EMBEDDING) {

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

Lines changed: 26 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -712,6 +712,30 @@ private ActionListener<Model> getElserModelVerificationActionListener(
712712

713713
public void testParsePersistedConfig() {
714714

715+
// Parsing a persistent configuration using model_version succeeds
716+
{
717+
var service = createService(mock(Client.class));
718+
var settings = new HashMap<String, Object>();
719+
settings.put(
720+
ModelConfigurations.SERVICE_SETTINGS,
721+
new HashMap<>(
722+
Map.of(
723+
ElasticsearchInternalServiceSettings.NUM_ALLOCATIONS,
724+
1,
725+
ElasticsearchInternalServiceSettings.NUM_THREADS,
726+
4,
727+
"model_version",
728+
".elser_model_2"
729+
)
730+
)
731+
);
732+
733+
var model = service.parsePersistedConfig(randomInferenceEntityId, TaskType.TEXT_EMBEDDING, settings);
734+
assertThat(model, instanceOf(ElserInternalModel.class));
735+
ElserInternalModel elserInternalModel = (ElserInternalModel) model;
736+
assertThat(elserInternalModel.getServiceSettings().modelId(), is(".elser_model_2"));
737+
}
738+
715739
// Null model variant
716740
{
717741
var service = createService(mock(Client.class));
@@ -730,11 +754,12 @@ public void testParsePersistedConfig() {
730754
)
731755
);
732756

733-
expectThrows(
757+
var exception = expectThrows(
734758
IllegalArgumentException.class,
735759
() -> service.parsePersistedConfig(randomInferenceEntityId, TaskType.TEXT_EMBEDDING, settings)
736760
);
737761

762+
assertThat(exception.getMessage(), containsString(randomInferenceEntityId));
738763
}
739764

740765
// Invalid model variant

0 commit comments

Comments
 (0)