From a6689ede3414344420e1af7858ded4d2bee91155 Mon Sep 17 00:00:00 2001 From: chenzhihang <709011834@qq.com> Date: Mon, 21 Oct 2024 14:59:07 +0800 Subject: [PATCH] =?UTF-8?q?=E5=AE=9E=E9=AA=8C=E5=AE=9E=E4=BE=8B=E6=88=90?= =?UTF-8?q?=E5=8A=9F=E8=BF=90=E8=A1=8C=E7=BB=93=E6=9D=9F=E5=90=8E=E8=AE=B0?= =?UTF-8?q?=E5=BD=95=E6=8C=87=E6=A0=87=E6=95=B0=E6=8D=AE?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- .../com/ruoyi/platform/constant/Constant.java | 1 + .../ruoyi/platform/domain/ExperimentIns.java | 163 +----------------- .../ExperimentInstanceStatusTask.java | 43 ++++- 3 files changed, 45 insertions(+), 162 deletions(-) diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java index b325cc5d..834f63e4 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/constant/Constant.java @@ -31,6 +31,7 @@ public class Constant { public final static String Pending = "Pending"; public final static String Init = "Init"; public final static String Stopped = "Stopped"; + public final static String Succeeded = "Succeeded"; public final static String Type_Train = "train"; public final static String Type_Evaluate = "evaluate"; diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ExperimentIns.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ExperimentIns.java index 31246fd9..d29b7e10 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ExperimentIns.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/domain/ExperimentIns.java @@ -6,6 +6,7 @@ import com.fasterxml.jackson.databind.PropertyNamingStrategy; import com.fasterxml.jackson.databind.annotation.JsonNaming; import io.swagger.annotations.ApiModel; import io.swagger.annotations.ApiModelProperty; +import lombok.Data; import java.io.Serializable; import java.util.Date; @@ -18,6 +19,7 @@ import java.util.Date; */ @JsonNaming(PropertyNamingStrategy.SnakeCaseStrategy.class) @ApiModel("实验实例对象") +@Data public class ExperimentIns implements Serializable { private static final long serialVersionUID = 623464560240790680L; @ApiModelProperty(name = "id") @@ -53,6 +55,10 @@ public class ExperimentIns implements Serializable { @JsonRawValue private String metricRecord; + @ApiModelProperty(value = "指标数值", notes = "以JSON字符串格式存储") + @JsonRawValue + private String metricValue; + @ApiModelProperty(value = "开始时间") private Date startTime; @@ -81,162 +87,5 @@ public class ExperimentIns implements Serializable { @TableField(exist = false) private String experimentName; - public ExperimentIns() { - } - - - public Integer getId() { - return id; - } - - public void setId(Integer id) { - this.id = id; - } - - public Integer getExperimentId() { - return experimentId; - } - - public void setExperimentId(Integer experimentId) { - this.experimentId = experimentId; - } - - public String getArgoInsName() { - return argoInsName; - } - - public void setArgoInsName(String argoInsName) { - this.argoInsName = argoInsName; - } - - public String getArgoInsNs() { - return argoInsNs; - } - - public void setArgoInsNs(String argoInsNs) { - this.argoInsNs = argoInsNs; - } - - public String getStatus() { - return status; - } - - public void setStatus(String status) { - this.status = status; - } - - - public String getNodesStatus() { - return nodesStatus; - } - - public void setNodesStatus(String nodesStatus) { - this.nodesStatus = nodesStatus; - } - - public String getNodesResult() { - return nodesResult; - } - - public void setNodesResult(String nodesResult) { - this.nodesResult = nodesResult; - } - - public String getNodesLogs() { - return nodesLogs; - } - - public void setNodesLogs(String nodesLogs) { - this.nodesLogs = nodesLogs; - } - - public String getGlobalParam() { - return globalParam; - } - - public void setGlobalParam(String globalParam) { - this.globalParam = globalParam; - } - - public void setStartTime(Date startTime) { - this.startTime = startTime; - } - - public Date getStartTime() { - return startTime; - } - - public void setFinishTime(Date finishTime) { - this.finishTime = finishTime; - } - - public Date getFinishTime() { - return finishTime; - } - - - public String getCreateBy() { - return createBy; - } - - public void setCreateBy(String createBy) { - this.createBy = createBy; - } - - public Date getCreateTime() { - return createTime; - } - - public void setCreateTime(Date createTime) { - this.createTime = createTime; - } - - public String getUpdateBy() { - return updateBy; - } - - public void setUpdateBy(String updateBy) { - this.updateBy = updateBy; - } - - public Date getUpdateTime() { - return updateTime; - } - - public void setUpdateTime(Date updateTime) { - this.updateTime = updateTime; - } - - public Integer getState() { - return state; - } - - public void setState(Integer state) { - this.state = state; - } - - public Long getWorkflowId() { - return workflowId; - } - - public void setWorkflowId(Long workflowId) { - this.workflowId = workflowId; - } - - public String getMetricRecord() { - return metricRecord; - } - - public void setMetricRecord(String metricRecord) { - this.metricRecord = metricRecord; - } - - public String getExperimentName() { - return experimentName; - } - - public void setExperimentName(String experimentName) { - this.experimentName = experimentName; - } } diff --git a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java index 32b2fedf..eaf6ee12 100644 --- a/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java +++ b/ruoyi-modules/management-platform/src/main/java/com/ruoyi/platform/scheduling/ExperimentInstanceStatusTask.java @@ -1,13 +1,15 @@ package com.ruoyi.platform.scheduling; +import com.ruoyi.platform.constant.Constant; import com.ruoyi.platform.domain.Experiment; import com.ruoyi.platform.domain.ExperimentIns; -import com.ruoyi.platform.domain.ModelDependency; import com.ruoyi.platform.mapper.ExperimentDao; import com.ruoyi.platform.mapper.ExperimentInsDao; -import com.ruoyi.platform.mapper.ModelDependencyDao; +import com.ruoyi.platform.service.AimService; import com.ruoyi.platform.service.ExperimentInsService; import com.ruoyi.platform.utils.JacksonUtil; +import com.ruoyi.platform.utils.JsonUtils; +import com.ruoyi.platform.vo.InsMetricInfoVo; import org.apache.commons.lang3.StringUtils; import org.springframework.beans.factory.annotation.Autowired; import org.springframework.scheduling.annotation.Scheduled; @@ -26,11 +28,12 @@ public class ExperimentInstanceStatusTask { @Resource private ExperimentInsDao experimentInsDao; @Resource - private ModelDependencyDao modelDependencyDao; + private AimService aimService; + private List experimentIds = new ArrayList<>(); @Scheduled(cron = "0/30 * * * * ?") // 每30S执行一次 - public void executeExperimentInsStatus() throws IOException { + public void executeExperimentInsStatus() throws Exception { // 首先查到所有非终止态的实验实例 List experimentInsList = experimentInsService.queryByExperimentIsNotTerminated(); // 去argo查询状态 @@ -38,12 +41,42 @@ public class ExperimentInstanceStatusTask { if (experimentInsList != null && experimentInsList.size() > 0) { for (ExperimentIns experimentIns : experimentInsList) { //当原本状态为null或非终止态时才调用argo接口 - String oldStatus = experimentIns.getStatus(); try { experimentIns = experimentInsService.queryStatusFromArgo(experimentIns); } catch (Exception e) { experimentIns.setStatus("Failed"); } + //运行成功的实验实例记录指标数值 + if (Constant.Succeeded.equals(experimentIns.getStatus())) { + Map metricRecord = JacksonUtil.parseJSONStr2Map(experimentIns.getMetricRecord()); + List> trainMetricRecord = (List>) metricRecord.get("train"); + List> evaluateMetricRecord = (List>) metricRecord.get("evaluate"); + + HashMap metricValue = new HashMap<>(); + HashMap trainMetricValue = new HashMap<>(); + HashMap evaluateMetricValue = new HashMap<>(); + + if (trainMetricRecord != null && !trainMetricRecord.isEmpty()) { + String runId = (String) trainMetricRecord.get(0).get("run_id"); + List expTrainInfos = aimService.getExpTrainInfos1(true, experimentIns.getExperimentId(), runId); + for (InsMetricInfoVo expTrainInfo : expTrainInfos) { + Map metrics = expTrainInfo.getMetrics(); + trainMetricValue.putAll(metrics); + } + } + + if (evaluateMetricRecord != null && !evaluateMetricRecord.isEmpty()) { + String runId = (String) evaluateMetricRecord.get(0).get("run_id"); + List expTrainInfos = aimService.getExpTrainInfos1(false, experimentIns.getExperimentId(), runId); + for (InsMetricInfoVo expTrainInfo : expTrainInfos) { + Map metrics = expTrainInfo.getMetrics(); + evaluateMetricValue.putAll(metrics); + } + } + metricValue.put("train", trainMetricValue); + metricValue.put("evaluate", evaluateMetricValue); + experimentIns.setMetricValue(JsonUtils.mapToJson(metricValue)); + } experimentIns.setUpdateTime(new Date()); // 线程安全的添加操作 synchronized (experimentIds) {