Skip to content

Commit cec80e8

Browse files
authored
[ML] Provide model_size_stats as soon as an anomaly detection job is opened (#124638) (#124663)
Fixes #121168
1 parent 1942160 commit cec80e8

File tree

3 files changed

+51
-0
lines changed

3 files changed

+51
-0
lines changed

docs/changelog/124638.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 124638
2+
summary: Provide model size statistics as soon as an anomaly detection job is opened
3+
area: Machine Learning
4+
type: bug
5+
issues:
6+
- 121168

x-pack/plugin/ml/qa/native-multi-node-tests/src/javaRestTest/java/org/elasticsearch/xpack/ml/integration/AutodetectMemoryLimitIT.java

Lines changed: 31 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -230,6 +230,37 @@ public void testManyDistinctOverFields() throws Exception {
230230
assertThat(modelSizeStats.getMemoryStatus(), equalTo(ModelSizeStats.MemoryStatus.HARD_LIMIT));
231231
}
232232

233+
public void testOpenJobShouldHaveModelSizeStats() throws Exception {
234+
// When a job is opened, it should have non-zero model stats that indicate the memory limit and the assignment basis
235+
Detector.Builder detector = new Detector.Builder("sum", "value");
236+
detector.setOverFieldName("user");
237+
238+
TimeValue bucketSpan = TimeValue.timeValueHours(1);
239+
AnalysisConfig.Builder analysisConfig = new AnalysisConfig.Builder(Collections.singletonList(detector.build()));
240+
analysisConfig.setBucketSpan(bucketSpan);
241+
DataDescription.Builder dataDescription = new DataDescription.Builder();
242+
dataDescription.setTimeFormat("epoch");
243+
Job.Builder job = new Job.Builder("autodetect-open-job-should-have-model-size-stats");
244+
job.setAnalysisConfig(analysisConfig);
245+
job.setDataDescription(dataDescription);
246+
247+
// Set the memory limit to 110MB
248+
AnalysisLimits limits = new AnalysisLimits(110L, null);
249+
job.setAnalysisLimits(limits);
250+
251+
putJob(job);
252+
openJob(job.getId());
253+
GetJobsStatsAction.Response.JobStats jobStats = getJobStats(job.getId()).get(0);
254+
ModelSizeStats modelSizeStats = jobStats.getModelSizeStats();
255+
closeJob(job.getId());
256+
257+
assertThat(modelSizeStats.getModelBytes(), equalTo(0L));
258+
assertThat(modelSizeStats.getModelBytesMemoryLimit(), equalTo(110L));
259+
assertThat(modelSizeStats.getMemoryStatus(), equalTo(ModelSizeStats.MemoryStatus.OK));
260+
assertThat(modelSizeStats.getAssignmentMemoryBasis(), equalTo(ModelSizeStats.AssignmentMemoryBasis.MODEL_MEMORY_LIMIT));
261+
262+
}
263+
233264
private static Map<String, Object> createRecord(long timestamp, String user, String department) {
234265
Map<String, Object> record = new HashMap<>();
235266
record.put("time", timestamp);

x-pack/plugin/ml/src/main/java/org/elasticsearch/xpack/ml/job/process/autodetect/AutodetectCommunicator.java

Lines changed: 14 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -348,9 +348,23 @@ public ZonedDateTime getProcessStartTime() {
348348
}
349349

350350
public ModelSizeStats getModelSizeStats() {
351+
if (isModelSizeStatsAvailable() == false) {
352+
return createDefaultModelStats();
353+
}
351354
return autodetectResultProcessor.modelSizeStats();
352355
}
353356

357+
private boolean isModelSizeStatsAvailable() {
358+
ModelSizeStats modelSizeStats = autodetectResultProcessor.modelSizeStats();
359+
return modelSizeStats.getModelBytesMemoryLimit() != null;
360+
}
361+
362+
private ModelSizeStats createDefaultModelStats() {
363+
return new ModelSizeStats.Builder(job.getId()).setModelBytesMemoryLimit(job.getAnalysisLimits().getModelMemoryLimit())
364+
.setAssignmentMemoryBasis(ModelSizeStats.AssignmentMemoryBasis.MODEL_MEMORY_LIMIT)
365+
.build();
366+
}
367+
354368
public TimingStats getTimingStats() {
355369
return autodetectResultProcessor.timingStats();
356370
}

0 commit comments

Comments
 (0)